web-dev-qa-db-ja.com

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

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

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

私はかなり定期的にプラグインを追加したり削除したりするので、メニュー順序付けプラグインの設定ページを開いて順序を調整する必要はありません。

長い質問ですみません。探しているものを明確にしたいだけです。

の代わりに:

設定
  - 全般
  - 書き方
  - 読み方
  - ディスカッション
  - (その他の主要項目)
 ]  - プラグイン4 
  -  WP something 
  - ものを手助けするためのプラグイン
  -  Google関連のプラグイン
  -  RSSプラグイン
 -  FeedBurnerプラグイン[ - ]  -  etc。[ - ]

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

設定
  - ものを手助けするプラグイン
  - ディスカッション
  -  FeedBurnerプラグイン
  - 全般
  -  Google関連のプラグイン
  - プラグイン4 
  - 読み
  - (その他のコア項目)
  -  RSSプラグイン
  -  WP something [ - 書く[ - ]  - など[ - ]

コアエントリをデフォルトの位置に保ち、プラグインによって追加された項目のみをソートするsortメソッドがさらに良いでしょう。

設定
  - 全般
  - 書き方
  - 読み方
  - ディスカッション
  - (その他の主要項目)
 ]  - ものを手助けするプラグイン
  -  FeedBurnerプラグイン
  -  Google関連プラグイン
  - プラグイン4 
  -  RSSプラグイン
  -  WP何か
  -  etc。
8
dgw

グローバルな$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つの項目がありました。 Privacy はなくなり、 Reading タブが埋め込まれました。

ローカルでテストしても、予期しない結果が生じることはなく、問題なく動作します。プラグインが$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;
}

reordered menu items 

4
brasofilo

私は同じものを探していて、私がマイクによって提供されたコードをコピーするだろうと考えました。

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

たぶんマイクはここにコメントして、あなたがあなたの目標を達成するためにあなたが彼のクラスをどのように使うことができるかに関する追加の援助を提供するでしょう。

このファイルをダウンロードして、テーマのディレクトリにドロップできます。 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に含めるために(ベースとして)検討中でさえあるので、もし私たちが運が良ければこれらは標準になるかもしれません!

3

これは別の選択肢として役に立つかもしれないと思った。これはグローバルな$サブメニューの簡単な使い方です。 admin_menuにはまだサブメニュー項目を追加する他のプラグインがあるかもしれないので、私はadmin_initフックを使います(私の場合はそうしました、それでソートをするには早すぎました)。 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_keyadd_submenu_page$parent_slugであり、これは add_menu_page$menu_slugと同じです。

1
ryanm