web-dev-qa-db-ja.com

管理メニューセクションの順序を変更する

運がなくてもこの非常に単純なタスクを達成するために数時間を費やした後、私はここで少しイライラしています。

基本的に私が作成した5つのカスタム投稿タイプがあり、私がしたいのは "ダッシュボード" の直下に特定の順序でそれらのそれぞれを表示することです。

WordPressのドキュメントによると、最高のメニュー順は "5"のように見えるので、これは実際にはできないようです。そしてLより上

これを読んでいる専門家の中には、これを読んで、機能ファイルを利用し、プラグインを利用しなくても管理メニューを希望どおりに注文できるという簡単な方法を説明できると思います。

先に進んで、5つの別々の投稿タイプを作成し、それらをダッシュ​​ボードの直下に特定の順序で含めるようにしてください。これは不可能なようです。私と共有することができますか、できればjQueryを利用せずに?

31
Binarybit

こんにちは@ BinaryBit:

あなたが少しイライラしているのも不思議ではありません。管理メニューは、WordPressコアによる最も鈍くてイライラする実装の1つです。正直なところ、私は彼らがそのように設計したときに彼らが何を考えていたのか分かりません。

@ EAMannexcellentの仕事をしたWordPressで管理メニューがどのように機能するか(約4か月前にそれを読めたらよかったのに... :)

それでも、それがどのように機能するかを理解した後、私は単純なことをしようとして頭をまっすぐに保つのに十分な時間を費やさずにそれを使って作業するのにまだ迷っていました。 だから、WordPress管理メニューの操作を簡素化および合理化するMenu APIを作成しました。

それらはWordPressの既存の構造と100%互換性があり、それを使用しているのは私だけであるため、まだ非常にアルファ版です。私は彼らがまだ処理していないユースケースがあると確信しています。しかし、あなたと他の人が試してみるために、ここにコードを投稿します。

ここでテーマのディレクトリにドロップするファイルをdownloadできます: wp-admin-menu-classes.php 以下は、テーマの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 (=これらが標準になっても幸運です!

33
MikeSchinkel

これがWordPress管理者メニューがどのように構築されるかの簡単なチュートリアルです - 私はadd_menu_page APIを話していない、私は実際のデフォルトのWordPressメニューを意味します。

メニューファイルを呼び出す

メニューは、明らかにwp-admin/admin.phpによってロードされます。しかし、これはWordPressのドキュメントに基づいて使用するのに慣れている標準的なAPIを通してはロードされません。そうではなく、メニュー全体(すべての可能なオプション、サブメニューなど)がwp-admin/menu.phpで定義されている単純な配列を介してロードされます。

そのため、メニューシステムをロードするには、WordPress 3.0の99行目のadmin.phpだけでrequires menu.php ...とします。

メニューを読み込む

メニュー自体はグローバル配列$menuに格納されています。インラインドキュメントによると、メニュー配列には以下の要素があります。

The elements in the array are:
    *     0: Menu item name
    *     1: Minimum level or capability required.
    *     2: The URL of the item's file
    *     3: Class
    *     4: ID
    *     5: Icon for top level menu

たとえば、ダッシュボードは次のとおりです。

$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );

このファイルは各メニュー項目を調べて配列にロードし、それらのすべてのサブメニュー項目を$submenuという名前の配列にロードします。これは、親メニューのURLに基​​づいて索引付けされます。そのため、Dashboardの "Dashboard"というサブメニュー項目は次のとおりです。

 $submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );

システムがすべてのメニューをロードし終わった後(それほど多くはありませんが、システムは5または10ずつインデックスをたどっていきます...最初のメニュー項目であるにもかかわらず、ダッシュボードはまだ次のようにインデックスされています) item "2"(PHPの配列はインデックス0から始まります。そのため、いくらかの操作スペースがあります)。

この時点で、システムはwp-admin/includes/menu.phpを呼び出します。

メニューを進む

この3番目のファイルは各メニュー項目を調べ、現在のユーザーに割り当てられている権限に基づいて、メニューを使用するか削除します。最初にすべてのサブメニューをループし、ユーザーがアクセスできないページを削除します。それから、親ページをループして同じことをします。それからそれはメニューを除去したことから残っているどんな重複セパレーターも削除します。

最後に、割り当てられたメニュー順に基づいてメニューを並べ替えます。

カスタムメニューの注文

フックadmin_menuは、メニューが設定された後に呼び出されますが、 before anythingが順序付けられています。そのため、APIを「ハッキング」せずにWordPressメニューシステム全体を注文することが可能です。

アクションadmin_menuが起動されると、カスタムページがシステムにロードされます。次に起こることは、WordPressがcustom_menu_orderという名前のフィルターをチェックすることです。このフィルターは常にfalseを返し、カスタムオーダーを使用するかどうかをWordPressに伝えます。

以下をテーマに追加して代わりにフラグをtrueに設定し、明示的なメニューの順序を定義します。

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php', 'edit-comments.php');
}

add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

すべてのメニューに必要な順序を指定してください(私はメニューロードファイルへの参照を提供したので、ファイル名のリストを取得することができます)。


編集(2010年9月2日):

この方法でカスタム投稿タイプの編集画面の順序を指定するには、編集画面のURLを知っておく必要があります。ほとんどの場合、それはhttp://blog.url/wp-admin/edit.php?post_type=POST_TYPEになります。これは、WordPressがあなたのサイトにどのように設定されているか(ルートまたはサブフォルダにインストールされている場合)と、使用しているカスタム投稿タイプのスラッグによって異なります。

例えば...

「Stack Exchange Questions」のカスタム投稿タイプがあり、ダッシュボードアイコンのすぐ下のダッシュボードと同じセクションにエディタを表示するとします。テーマのfunctions.phpファイルで次のコードを使用します。

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php?post_type=stack_exchange_questions');
}

add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

その他のメニューは影響を受けませんが、カスタム編集ページはダッシュボードと同じセクションに移動され、そのすぐ下に表示されます。これを使用して、カスタム投稿タイプを管理者メニューの任意のセクションに移動し、それらを任意の順序で配置できます。標準のメニュー項目を同じ方法で移動することもできます。

与えられたセクションのすべてのメニュー項目の順序を指定することを確認してください 、そうしないとあなたのメニューは何らかの予期せぬ奇妙さにさらされるかもしれません。

21
EAMann

私はこれが古いスレッドであることを認識していますが、それははるかに簡単な解決策で更新する価値があると思います。これは3.5で動作し、他のバージョンではテストされていないことに注意してください。次のコードはプラグインまたはfunctions.phpファイルに入れることができます。

http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order を参照してください。元のポスターのニーズに合わせて少し修正しました(ただし、これまでに解決策が見つかったことを願います)。

  // Rearrange the admin menu
  function custom_menu_order($menu_ord) {
    if (!$menu_ord) return true;
    return array(
      'index.php', // Dashboard
      'edit.php?post_type=custom_type_one', // Custom type one
      'edit.php?post_type=custom_type_two', // Custom type two
      'edit.php?post_type=custom_type_three', // Custom type three
      'edit.php?post_type=custom_type_four', // Custom type four
      'edit.php?post_type=custom_type_five', // Custom type five
      'separator1', // First separator
      'edit.php?post_type=page', // Pages
      'edit.php', // Posts
      'upload.php', // Media
      'link-manager.php', // Links
      'edit-comments.php', // Comments
      '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', 'custom_menu_order'); // Activate custom_menu_order
  add_filter('menu_order', 'custom_menu_order');

ここに表示されていない管理メニューの項目は削除されません。それらはメニューの一番下に追加されます。

18
Matt

メニュー項目を移動するには、Global $menu変数を使うのが好きです。

たとえば、 "Pages"メニューをメニューの一番下に移動したい場合は、これをfunctions.phpまたはプラグインで使用します。

function admin_menu_items() {
    global $menu;
    $menu[102]=$menu[20];//make menu 102 be the same as menu 20 (pages)
    $menu[20]=array();//make original pages menu disappear

}
add_action('admin_menu', 'admin_menu_items');

投稿とリンクのメニューを入れ替えたい場合は、

function admin_menu_items() {
    global $menu;
    $storemenu = $menu[15];//save links menu into $storemenu
    $menu[15] = $menu[5];//make links menu = posts menu
    $menu[5] = $storemenu; //make menu 5/posts = $storemenu/links   
}
add_action('admin_menu', 'admin_menu_items');

WP 3.4.1でテスト済み

2
forlogos

私はあなたがプラグインを使用したくないことを理解していますが、純粋に簡単にするために、Janis ElstsによるAdmin Menu Editorプラグインを試してください。管理メニューを好きなように並べ替えます。メニュー項目を隠すこともできます。

2
Ray Gulick

驚くばかり。どうもありがとうございます。私はちょうど自分のfunctions.phpにいくつかのコード行を入れる

require_once('/extras/wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts'); // Swop location of Posts Section with Pages Section
}

さらに、 wp-admin-menu-classes.php を私のテーマフォルダに置くと、 'posts'ボタンが 'pages'ボタンと入れ替わります。

2つのボタンを並べ替えるために関数内にメニュー全体を記述する必要がないように、これがコアの一部になる予定です。

実際、4つのボタンに対してより指定された順序を得るのは少し厄介でした。ページ、投稿、メディア、リンクの4つのボタンを次のコードに変更する必要があります。

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
0
Sebastian