管理メニュー項目の並べ替え


8

管理者メニューセクションの順序を変更しますか?」に関するメモで、WordPressの管理者エリアの各サブセクションのエントリをアルファベット順に並べ替える方法を探しています。

現在、新しいプラグインが追加されると、そのエントリは[設定] / [ツール] / [プラグイン]の下のランダムな場所に表示され、新しいメニュー項目を見つけるのが難しいことがよくあります。(私はすでに多くのプラグインを持っているので、私のメニューはかなりいっぱいです。)

プラグインの追加と削除をかなり定期的に行っているので、メニュー順序プラグインの設定ページに継続的に移動して順序を調整する必要はありません。

長い質問でごめんなさい。私が探しているものを明確にしたいだけです。

の代わりに:

    設定
    -一般
    -書く
    -読書
    - 討論
    -(残りの主要アイテム)
    -プラグイン4
    -WP何か
    -ものを助けるためのプラグイン
    -Google関連のプラグイン
    -RSSプラグイン
    -FeedBurnerプラグイン
    -など

メニューをアルファベット順に(または別の論理的な方法で)ソートできますか?

    設定
    -ものを助けるためのプラグイン
    - 討論
    -FeedBurnerプラグイン
    -一般
    -Google関連のプラグイン
    -プラグイン4
    -読書
    -(残りの主要アイテム)
    -RSSプラグイン
    -WP何か
    -書く
    -など

コアエントリをデフォルトの場所に保持し、プラグインによって追加されたアイテムのみを並べ替える並べ替えメソッドがさらに良いでしょう:

    設定
    -一般
    -書く
    -読書
    - 討論
    -(残りの主要アイテム)
    -ものを助けるためのプラグイン
    -FeedBurnerプラグイン
    -Google関連のプラグイン
    -プラグイン4
    -RSSプラグイン
    -WP何か
    -など

回答:


4

グローバルの並べ替えを行うことができます$submenu

適用される並べ替えは、サブ配列のキー番号をリセットします$submenu['options-general.php']

array
  'options-general.php' => 
    array
      10 => 
        array
          0 => string 'General'
          1 => string 'manage_options'
          2 => string 'options-general.php'
      15 => 
        array
          0 => string 'Writing'
          1 => string 'manage_options'
          2 => string 'options-writing.php'
      // etc

となる:

array
  'options-general.php' => 
    array
      0 => 
        array
          0 => string 'Discussion'
          1 => string 'manage_options'
          2 => string 'options-discussion.php'
      1 => 
        array
          0 => string 'General'
          1 => string 'manage_options'
          2 => string 'options-general.php'
      // etc

ここでは、デフォルトのアイテムの長さを6と見なしています。WordPress 3.5以前は7つのアイテムがありましたが、プライバシーはなくなり、[ 閲覧 ]タブに埋め込まれました。

ローカルでテストすると、これは予期しない結果を生成せず、問題なく動作します。プラグインが$submenu['options-general.php'][15]それ自体または他の何かを配置することに依存している場合は、バグが発生する可能性があります。

並べ替えは、デフォルトの項目と残りの項目に別々に適用されています。usort最初のブロックのを無効にするだけで、目的の出力が得られます。

add_action( 'admin_menu', 'sort_settings_menu_wpse_2331', 999 );

function sort_settings_menu_wpse_2331() 
{
    global $submenu;

    // Sort default items
    $default = array_slice( $submenu['options-general.php'], 0, 6, true );
    usort( $default, 'sort_arra_asc_so_1597736' );

    // Sort rest of items
    $length = count( $submenu['options-general.php'] );
    $extra = array_slice( $submenu['options-general.php'], 6, $length, true );
    usort( $extra, 'sort_arra_asc_so_1597736' );

    // Apply
    $submenu['options-general.php'] = array_merge( $default, $extra );
}

//http://stackoverflow.com/a/1597788/1287812
function sort_arra_asc_so_1597736( $item1, $item2 )
{
    if ($item1[0] == $item2[0]) return 0;
    return ( $item1[0] > $item2[0] ) ? 1 : -1;
}

並べ替えられたメニュー項目


3

私は同じものを探していて、Mikeが提供するコードをコピーすると思いました。彼がそれを使用しているのは彼だけなので、彼はまだアルファ版であると彼は主張しています。

私はそれをテストしました、そしてそれは私にとってうまくいくようです。彼らがまだ扱っていないユースケースがあると私は確信しています。

たぶんマイクはここでコメントし、彼のクラスを使用して目標を達成する方法について追加の支援を提供します。

ここでテーマのディレクトリにドロップするファイルをダウンロードできます:https : //gist.github.com/792b7aa5b695d1092520

以下は、テーマのfunctions.phpファイルの関数を呼び出す方法を示しています。

<?php
require_once('wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts');              // Swap location of Posts Section with Pages Section
  rename_admin_menu_section('Media','Photos & Video');    // Rename Media Section to "Photos & Video"
  delete_admin_menu_section('Links');                     // Get rid of Links Section
  $movie_tags_item_array = get_admin_menu_item_array('Movies','Movie Tags');  // Save off the Movie Tags Menu
  update_admin_menu_section('Movies',array(               // Rename two Movie Menu Items and Delete the Movie Tags Item
    array('rename-item','item'=>'Movies','new_title'=>'List Movies'),
    array('rename-item','item'=>'Add New','new_title'=>'Add Movie'),
    array('delete-item','item'=>'Movie Tags'),
  ));
  copy_admin_menu_item('Movies',array('Actors','Add New')); // Copy the 'Add New' over from Actors
  renamed_admin_menu_item('Movies','Add New','Add Actor');  // Rename copied Actor 'Add New' to 'Add Actor
  add_admin_menu_item('Movies',array(                       // (Another way to get a 'Add Actor' Link to a section.)
    'title' => 'Alt Add Actor ',
    'slug' => 'post-new.php?post_type=actor',
  ), array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  add_admin_menu_item('Movies',$movie_tags_item_array,array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  delete_admin_menu_section('Actors');                      // Finally just get rid of the actors section
}

さらに、これらの関数はWordPress 3.1に含めるために(ベースとして)検討中でさえあるので、運が良ければ、これらは標準になるかもしれません!


すばらしいコードのように聞こえますが、サブエントリを自動的に並べ替える場所はわかりません。
dgw 2010

1

これは別のオプションとして役立つ可能性があると考えました。以下は、グローバル$ submenuの簡単なusortです。私はadmin_initフックを使用します。これは、admin_menuにサブメニュー項目を追加する他のプラグインがまだある可能性があるためです(私の場合はそうしたため、ソートを行うには早すぎました)。また、usortの匿名(ラムダ)関数にはPHP 5.3以降が必要です。

<?php 
add_action('admin_init','my_admin_init');
function my_admin_init() {
    global $submenu;
    $submenu_key = 'my_key'; // See note below on $submenu_key
    if ( array_key_exists( $submenu_key, $submenu ) ) {
        // alphabetize submenu items
        usort( $submenu[ $submenu_key ], function ( $a, $b ) {
            // format of a submenu item is [ 'My Item', 'read', 'manage-my-items', 'My Item' ]
            return strcasecmp( $a[0], $b[0] );
        } );
    }
}

$submenu_keyある$parent_slugadd_submenu_pageと同じである、$menu_slugadd_menu_page


1
素敵でコンパクト。何を$submenu_key表していますか?これは、WordPressがadd_submenu_pageドキュメント$parent slugでと呼んでいるものですか?
random_user_name 2017

@cale_bすばらしい質問です!あなたは正しいです、それは$parent_slugadd_menu_pageと同じであるadd_submenu_page docsにあり$menu_slugます。
ryanm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.