web-dev-qa-db-ja.com

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

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')は並べ替えません。

7
glvr

トップレベルの管理メニュー項目の順序を変更するには、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つのプラグインを追加してアクティブにしたとしましょう(たとえば、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
);

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

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

項目のメニュー位置が同じ場合、それらはアルファベット順にソートされます。

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

5
rudtek

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

これを直すために、私はこの小さな機能を開発しました。 $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;
};
5
rassoh