2つのWPプラグインのスタックの他の場所で同じメニュー位置を強制している(1つの場合は表示されない可能性があります)ので、プラグインによって追加されるメニュー項目の位置を制御する方法.
私はすでに 'settings'の中でそのようなサブメニュー項目を扱うように思われる機能と、デフォルト(投稿、ページ、テーマ、プラグイン、設定など)の 'トップレベル'項目を並べ替えるための別の機能を使用します。プラグインによって追加されたそのような項目の。
function custom_menu_order() {
return array(
//Add items here in desired order.
);
}
add_filter( 'custom_menu_order', '__return_true' );
add_filter( 'menu_order', 'custom_menu_order' );
例として、WooCommerceによって追加された2つの最上位メニュー項目のうち、1つはContactForm7によって追加された項目の上に、もう1つはその下に表示されます。これはメニュー位置を強制するのではなく、代わりに下部に表示されます。
通常、デフォルトの項目と 'edit.php?post_type = ...'の項目を並べ替えるには問題なく動作しますが、 'admin.php?page = ...'の項目は並べ替えません。
リオーダー機能が無効になっていると、2つのWooCommerceアイテム( 'edit.php?post_type = product'と 'edit.php?post_type = shop_order')は意図したとおりにグループ化されますが、機能が再アクティブ化されると分割されますContactForm7( 'admin.php?page = wpcf7')によって。
そして、WooCommerce CPTの1つ( 'edit.php?post_type = shop_order')は並べ替えられません - もう一方( 'edit.php?post_type = product')は並べ替えません。
トップレベルの管理メニュー項目の順序を変更するには、2つのhooks
、2つのfilters
、および1つのfunction
が必要です。現在のテーマのfunctions.php
に次のコードを追加してください。
function wpse_custom_menu_order( $menu_ord ) {
if ( !$menu_ord ) return true;
return array(
'index.php', // Dashboard
'separator1', // First separator
'edit.php', // Posts
'upload.php', // Media
'link-manager.php', // Links
'edit-comments.php', // Comments
'edit.php?post_type=page', // Pages
'separator2', // Second separator
'themes.php', // Appearance
'plugins.php', // Plugins
'users.php', // Users
'tools.php', // Tools
'options-general.php', // Settings
'separator-last', // Last separator
);
}
add_filter( 'custom_menu_order', 'wpse_custom_menu_order', 10, 1 );
add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 );
上記のトップレベルの管理メニュー項目の返された配列は、デフォルトの順序でcoreによって挿入されたメニュー項目を表します。プラグインによって追加されたメニュー項目を含めるには、それらをこの配列に追加する必要があります。 2つのプラグインを追加してアクティブにしたとしましょう(たとえば、Wordfence
とNextCellent Gallery
)。まず、これらのメニュー項目の名前を見つけなければなりません。 Wordfence
の最上位メニュー項目をクリックすると、結果のURLは?page=Wordfence
で終わります。 ?page=
の後の部分は私たちの名前(Wordfence
)です。 NextCellent Gallery
の場合、名前はnextcellent-gallery-nextgen-legacy
になります。それでは、これらの項目を配列に追加しましょう。
return array(
'index.php', // Dashboard
'separator1', // First separator
'edit.php', // Posts
'upload.php', // Media
'link-manager.php', // Links
'edit-comments.php', // Comments
'edit.php?post_type=page', // Pages
'separator2', // Second separator
'themes.php', // Appearance
'plugins.php', // Plugins
'users.php', // Users
'tools.php', // Tools
'separator3', // Third separator
'options-general.php', // Settings
'separator-last', // Last separator
'Wordfence', // Wordfence
'nextcellent-gallery-nextgen-legacy', // NextCellent Gallery
);
これで、この配列の項目を上下に移動して最終的な順序を取得できます。
注 : Admin Menu Editor pluginを使用すると、ドラッグアンドドロップ操作も簡単にできます。
register_post_type()で投稿タイプを作成しているときは、メニュー位置を設定できます。
menu_position(整数)(オプション)投稿タイプが表示されるメニュー順の位置。 show_in_menuはtrueでなければなりません。
Default: null - defaults to below Comments 5 - below Posts 10 - below Media 15 - below Links 20 - below Pages 25 - below comments 60 - below first separator 65 - below Plugins 70 - below Users 75 - below Tools 80 - below Settings 100 - below second separator
項目のメニュー位置が同じ場合、それらはアルファベット順にソートされます。
あなた自身のプラグインであなたはレベルを設定することができます。まだ作成していないプラグインのメニュー位置を変更しようとしている場合は、その多くがプラグイン可能であるか、呼び出しを編集することができます。
既存の回答は問題ありませんが、新しいカスタム投稿タイプを追加する場合は、これらの機能を何度も編集し直す必要があります。
これを直すために、私はこの小さな機能を開発しました。 $new_positions
関数内にmy_new_menu_order
を定義するだけです。
/**
* Activates the 'menu_order' filter and then hooks into 'menu_order'
*/
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
* Filters WordPress' default menu order
*/
function my_new_admin_menu_order( $menu_order ) {
// define your new desired menu positions here
// for example, move 'upload.php' to position #9 and built-in pages to position #1
$new_positions = array(
'upload.php' => 9,
'edit.php?post_type=page' => 1
);
// helper function to move an element inside an array
function move_element(&$array, $a, $b) {
$out = array_splice($array, $a, 1);
array_splice($array, $b, 0, $out);
}
// traverse through the new positions and move
// the items if found in the original menu_positions
foreach( $new_positions as $value => $new_index ) {
if( $current_index = array_search( $value, $menu_order ) ) {
move_element($menu_order, $current_index, $new_index);
}
}
return $menu_order;
};