プラグインによって追加されたアイテムの管理メニューでの位置を制御するにはどうすればよいですか?


8

同じメニュー位置を強制する2つのWPプラグインのStackの別の場所を読んだ場合(1つは表示されない可能性があります)、プラグインによって追加されたメニュー項目の位置をどのように制御できるのか疑問に思っています。

私はすでに「設定」でそのようなサブメニュー項目を処理しているように見える関数と、デフォルト(投稿、ページ、テーマ、プラグイン、設定など)の「トップレベル」項目を並べ替える別の関数を使用していますが、位置は変更しませんプラグインによって追加されたそのようなアイテムの。

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')は並べ替えられません-もう1つ( 'edit.php?post_type = product')は並べ替えられます。

回答:


8

トップレベルの管理メニュー項目の順序を変更するにはhooks、2 つ、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 );

上記のトップレベルの管理メニュー項目の返された配列は、コアによって挿入されたメニュー項目をデフォルトの順序で表します。プラグインによって追加されたメニュー項目を含めるには、これらをこの配列に追加する必要があります。2つのプラグインを追加してアクティブ化したとしましょう(例:WordfenceNextCellent 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
);

これで、この配列のアイテムを上下に移動して、最終的な順序を取得できます。

管理メニューエディタプラグインを使用すると、ドラッグアンドドロップ操作も簡単にできます。


1
@ Frank P. Walentynowicz ...包括的な回答に感謝します。明確にするために元の投稿を更新しました。「?page =の後の部分」を使用するというあなたの提案は非常に役に立ち、2つのWooCommerceアイテムの1つを除いて私の問題を解決します。
glvr 2017

上記のコメントへの簡単な追加:以前は管理者メニューエディターを使用していましたが、ハードコーディングされた関数を好みます。
glvr 2017

11

既存の回答は問題ありませんが、新しいカスタム投稿タイプを追加する場合、それらの関数を何度も再編集する必要があります。

これを修正するために、この小さな関数を開発しました。関数の$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;
};

1
これはすごい-新しいアイテムがカスタムポストタイプ(提案したとおり)、新しいプラグイン、将来的には新しい組み込みオプションなどのメニューアイテムとして追加される場合は、通常どおり正常に追加されます?
Brett

@ブレットそれはそのように機能するようです。
Davey

6

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

アイテムが同じメニュー位置にある場合、それらはアルファベット順にソートされます。

自分のプラグインでレベルを設定できます。作成していないプラグインのメニュー位置を変更しようとしている場合、それらの多くはプラグイン可能であるか、またはそれらの呼び出しを編集できます。


@ rudtek ...ありがとう。私自身のCPTでは、メニューの位置を設定することを避け、代わりにメニューの並べ替えを使用することを好むため、「すべて同じ場所に配置する」ことができ、後で簡単に変更できます。メニュー位置を設定しようとしている独自のプラグインがない場合、それはサードパーティのプラグイン用です-「プラグイン可能」について十分に知らないか、それらの呼び出しを編集しません(おそらく更新時に上書きされます)。
glvr 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.