web-dev-qa-db-ja.com

管理者メニューにセパレータを追加しますか?

誰もが管理メニューの区切り記号を追加する方法を知っていますか?私は見つけました これ しかしそれは助けにはなりませんでした。

何か案は?

21
user1147

ここにあなたが欲しいものを手に入れるための迅速で汚い方法があります。

バックグラウンド

WordPressは管理メニューセクションを$menuというグローバル配列に格納します。区切り文字を追加するには、分離したいオプションのインデックス間にあるインデックスを使用して、$menu配列に要素を追加します。

add_admin_menu_separator()関数を使う

そのため、このロジックをカプセル化する関数をadd_admin_menu_separator()と書きました。セパレータを追加したいオプションその後よりも大きい配列インデックス番号を選択してから、そのインデックスをパラメータとして渡して関数add_admin_menu_separator()を呼び出す必要があります。

例えば:

add_admin_menu_separator(37);

add_admin_menu_separator()関数自体

これがあなたのテーマのfunctions.phpファイルにコピーできる関数add_admin_menu_separator()の定義です。はい、それは難解ですが、グローバル$menu配列を作成して使用するコードもそうです。 (計画的には、ありがたいことに、最終的には廃止予定ですが、おそらく数年後になるでしょう)

function add_admin_menu_separator($position) {
  global $menu;
  $index = 0;
  foreach($menu as $offset => $section) {
    if (substr($section[2],0,9)=='separator')
      $index++;
    if ($offset>=$position) {
      $menu[$position] = array('','read',"separator{$index}",'','wp-menu-separator');
      break;
    }
  }
  ksort( $menu );
}

必要な$menuへのインデックスを見つける

どのインデックス番号が必要かを判断するために、$GLOBALS['menu']フック内からadmin_initvar_dump()を実行できます。これは、値を確認するために一時的にテーマのfunctions.phpファイルに追加できるコードです。これは/wp-admin/で始まるURLを要求するときにのみ機能します。ただし、少なくともテーマのFTPアクセスを取得するまでは、内蔵のテーマエディタではなくFTPを使用してください。 functions.phpファイル!)

add_action('admin_init','dump_admin_menu');
function dump_admin_menu() {
  if (is_admin()) {
    header('Content-Type:text/plain');
    var_dump($GLOBALS['menu']);
    exit;
  }
}

関連項目:

ところで、あなたは管理者メニューを扱うために一般的にこれらのリンクが役に立つと思うかもしれません:

私の管理者メニュークラスは現在セパレーターを追加する簡単な方法を提供していませんが、私は時間があるとき私は今それを追加すると思います。

32
MikeSchinkel

それは簡単です:

add_action( 'admin_init', 'add_sep' );
function add_sep() {

    if ( ! is_admin() )
        return false;

    global $menu;
    $sep = $menu[4]; // that's the default separator
    $pos = 6; // change it for the desired position
    $menu = array_merge(
        array_slice( $menu, 0, $pos ),
        array( $sep ),
        array_slice( $menu, $pos + 1, -1)
    );
    $menu[ $pos - 1 ][4] .= ' menu-top-last';
    $menu[ $pos + 1 ][4] .= ' menu-top-first';

}

注:デフォルトの区切り文字の位置($menu[4])は、このフックの前にあなた(またはあなたのプラグイン)がどの設定をしたかによって異なります。

もちろん、menu-top-firstmenu-top-lastクラスのイントロスペクションを微調整することもできます。

3
vmassuchetto

セパレータが追加されないという問題がいくつかありましたが、それはwordpressが重複するセパレータを削除する方法が原因でした。関数の最後にksort($menu);を追加することで問題は解決しました。

2
Kieran Baker

これはMastaBabaの答えに基づいていますが、あなたが指定した位置で何かを置き換えることはありません - それは後でセパレータを追加するだけです。

無名関数も使用するので、PHPバージョン5.3以降とのみ互換性があります。

add_action( 'admin_menu', function () {
    $position = 29;
    global $menu;
    $separator = [
        0 => '',
        1 => 'read',
        2 => 'separator' . $position,
        3 => '',
        4 => 'wp-menu-separator'
    ];
    if (isset($menu[$position])) {
        $menu = array_splice($menu, $position, 0, $separator);
    } else {
        $menu[$position] = $separator;
    }
});
1
robrecord

以下は、管理メニューが表示されたときに実行されるWordpressのアクションです。管理者メニューは配列であり、あなたがしているのはここで、あなたが指定した位置にセパレータを定義する配列要素を追加することです。

ここから

add_action( 'admin_menu', 'set_admin_menu_separator' );
function set_admin_menu_separator() {
$position = 79;
global $menu;
$menu[$position] = array(
0   =>  '',
1   =>  'read',
2   =>  'separator' . $position,
3   =>  '',
4   =>  'wp-menu-separator'
);
}

これは現在受け入れられている答えにかなり似ていますが、現在受け入れられている答えは私にとってはうまくいきませんでした(そして、コメントから判断すると、他のいくつかのものに対して)。

0
MastaBaba

何をしようとしているのか判断するのは少し難しいですが、WordPressの管理メニューにトップレベルのエントリを追加しようとしていると思います。

WordPress Codexの このドキュメント を参照してください。

要するに、あなたはadd_menu_page()関数の使用法を探しています。それはいくつかの引数を取り、 "Dashboard"、 "Posts"、 "Media"などの兄弟として管理メニューに追加項目を表示します.

うまくいったことを願っています。 :-)

0
dgw