回答:
欲しいものを素早く手に入れられる方法をご紹介します。
WordPressは、管理メニューセクションをと呼ばれるグローバル配列に格納し$menu
ます。セパレーターを追加するには、分離し$menu
たいオプションのインデックスの間にあるインデックスを使用して配列に要素を追加します。
add_admin_menu_separator()
機能を使用するだから私はこれを呼び出すためのロジックをカプセル化する関数を書いたadd_admin_menu_separator()
。あなたはオプションでより高い配列のインデックス番号選択する必要がありますその後あなたは、セパレータを追加したいとして、関数を呼び出してadd_admin_menu_separator()
、あなたのパラメータとして言ったインデックスを渡します。
例えば:
add_admin_menu_separator(37);
add_admin_menu_separator()
関数自体以下は、add_admin_menu_separator()
テーマのfunctions.php
ファイルにコピーできる関数の定義です。はい、不可解ですが、グローバル$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
必要なインデックスを見つける必要なインデックス番号を把握するには、フック内からvar_dump()
ofを実行$GLOBALS['menu']
しますadmin_init
。テーマのfunctions.php
ファイルに一時的にドロップして、値が何であるかを確認できるコードを次に示します。これは/wp-admin/
、少なくともテーマのfunctions.php
ファイルへのFTPアクセスを取得するまで、URLをリクエストするときにのみ機能します(ただし、組み込みのテーマエディターではなくFTPを使用するか、サイトへのアクセスを失います)。
add_action('admin_init','dump_admin_menu');
function dump_admin_menu() {
if (is_admin()) {
header('Content-Type:text/plain');
var_dump($GLOBALS['menu']);
exit;
}
}
ところで、これらのリンクは一般的に管理メニューを操作するのに役立つでしょう:
私の管理メニュークラスは現在、セパレータを追加する簡単な方法を提供していませんが、時間があるときに追加します。
次のように簡単です:
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-first
し、menu-top-last
クラスのイントロスペクションを。
セパレーターが追加されない問題がいくつかあったのは、ワードプレスが重複するセパレーターを削除する方法が原因でした。ksort($menu);
関数の下部に追加すると、問題が修正されました。
これは、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;
}
});
何をしようとしているのかを判断するのは少し難しいですが、WordPressの管理メニューにトップレベルのエントリを追加しようとしていると思います。
見る WordPress Codexのこのドキュメントを。
要するに、add_menu_page()
多くの引数を取り、「ダッシュボード」、「投稿」、「メディア」などの兄弟として管理メニューに追加項目を表示する関数の使用法を探しています。
私はそれが正しかったことを願っています。:-)
add_menu_page()
。
以下は、管理メニューがレンダリングされるときに実行される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'
);
}
これは現在受け入れられている答えにかなり似ているが、現在受け入れられている答えは私には役に立たなかったことに注意してください(そして、コメントから判断すると、他のいくつかについて)。