管理メニューセクションの順序を変更しますか?


31

このかなり単純なタスクを運なしで達成しようとして数時間を費やした後、ここで少しイライラしています。

基本的に、作成した5つのカスタム投稿タイプがあり、「ダッシュボード」の下に特定の順序で各投稿を表示するだけです。

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

これを読んでいる専門家の一部は、機能ファイルを使用し、プラグイン(存在することを知っている)を使用せずに、希望どおりの方法で管理メニューを注文できる簡単な方法を示していると思います。

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

回答:


33

こんにちは@BinaryBit:

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

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

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

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

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


APIへの素晴らしい追加!既存のフレームワークに最初のカスタムメニューセクションを追加するのに数か月かかりました(そのため、コードの勉強をたくさんしました)...しかし、APIはもっと直感的に使用できるようです!
EAMann

@EAMann-ありがとう!提案を提供したり、改善に協力したい場合は、このQ&Aを参照する少数の人を除いて、すべての人が簡単にできるようなものを確立したいと思います。
MikeSchinkel

これはコアになりましたか、それとも管理者のメニュー項目の順序を操作するためにこれまたは類似のものが必要ですか?
Qスタジオ

私の
知る限り

ヘイマイク-wp_debugはこの関数でエラーをスローします。if($ from_section)$ from_section-> swap_with($ to_section); return $ section; } ---ご注意:未定義の変数:セクション
Q Studioの

21

WordPressの管理メニューがどのように構築されるかを簡単に説明します-私は話していません add_menu_page。APIの、実際のデフォルトのWordPressメニューです。

メニューファイルの呼び出し

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

だから、メニューシステムをロードするために、admin.phpちょうどrequiremenu.php...ワードプレス3.0で99行を中心に。

メニューの読み込み

メニュー自体はグローバル配列に格納されます$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に基​​づいてインデックス付けされた配列にロードします。したがって、「ダッシュボード」と呼ばれるダッシュボードのサブメニュー項目は次のとおりです。

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

システムがすべてのメニューのロードを完了した後(それほど多くはありませんが、システムはインデックスを5または10ずつステップスルーします...最初のメニュー項目であってもダッシュボードはまだアイテム "2"(PHP配列はインデックス0から始まるので、これは操作の余地を与えます)。

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

メニューをステップスルーする

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

最後に、割り当てられたメニュー順序に基づいてメニューをソートします。

カスタムメニューの注文

フックadmin_menuは、メニューが設定された後、何かが注文される前に呼び出されます。そのため、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');

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

与えられたsectionのすべてのメニュー項目の順序を指定することを確認してください。そうしないと、メニューが予期せぬ奇妙さを被る可能性があります。


あなたのコード例では、小さな誤差があれば条件文が欠落している、「注文のカスタムメニュー」の見出しの下にあります$。..変数名...(グレート答えが)上
t31os

「Stack Exchange Questions」のカスタム投稿タイプをダッシュボードセクションののセクションにどのように追加しますか?
-epaps

こんにちはEAMann-簡単な質問。ワードプレスの最新バージョンでは、このプロセスがまったく変わったのですか、それとも単純になったのですか?
NetConstructor.com

どのように約サブメニューサブメニュー項目を再配置する同様の方法はありますか?
ヒラルディ

@GiraldiMaggio 新しい質問をして、この質問を参照してください。
EAMann

18

これは古いスレッドであることがわかりますが、非常に簡単なソリューションで更新する価値があると思います。これは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');

ここにリストされていない管理メニューの項目は削除されません。それらはメニューの下部に追加されます。


1
はい、これははるかに優れています。また、サブメニュー項目を並べ替えて、設定を解除してからリセットすることもできます。
ワイク

2

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


このプラグインはマルチサイトインストールで試してみました。最適に動作しますが、マルチサイトインストールがある場合は、すべてのサブサイトのオプションを手動で構成する必要があります。
user391

2

メニュー項目を移動するには、グローバル$menu変数を使用するのが好きです。

たとえば、「ページ」メニューをメニューの一番下に移動したい場合、これを使用する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でテストしたばかりで、このトリックを少し使用しています


私はこれは古い記事です知っているが、あなたの最初のスニペットに関して、私は最後の行の問題に遭遇したadmin_menu_itemsとそれを置き換えることにより、固定された機能unset($menu[20]);
hot_barbara

0

驚くばかり。どうもありがとうございます。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をテーマフォルダーに配置すると、「投稿」ボタンが「ページ」ボタンに切り替わります。

これがまもなくコアの一部になり、2つのボタンを並べ替えるだけの機能内にメニュー全体を記述する必要がなくなることを願っています。

実際、4つのボタンに対してより詳細な順序を取得するのは少し面倒でした。4つのボタンのうち、ページ、投稿、メディア、リンクに変更するには、次のコードを使用する必要がありました。

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.