管理者メニューにセパレータを追加しますか?


22

誰もが管理者メニューセパレータを追加する方法を知っていますか?私はこれを見つけましが、助けにはなりませんでした。

何か案は?


誰かがまだこれに対する答えを探している場合、このプラグインは仕事を処理できます。
user31760

回答:


33

欲しいものを素早く手に入れられる方法をご紹介します。

バックグラウンド

WordPressは、管理メニューセクションをと呼ばれるグローバル配列に格納し$menuます。セパレーターを追加するには、分離し$menuたいオプションのインデックスの間にあるインデックスを使用して配列に要素を追加します。

add_admin_menu_separator()機能を使用する

だから私はこれを呼び出すためのロジックをカプセル化する関数を書いたadd_admin_menu_separator()。あなたはオプションでより高い配列のインデックス番号選択する必要がありますその後あなたは、セパレータを追加したいとして、関数を呼び出してadd_admin_menu_separator()、あなたのパラメータとして言ったインデックスを渡します。

例えば:

add_admin_menu_separator(37);

add_admin_menu_separator()関数自体

以下は、add_admin_menu_separator()テーマのfunctions.phpファイルにコピーできる関数の定義です。はい、不可解ですが、グローバル$menu配列を作成して使用するコードも同様です。(ありがたいことに、最終的には廃止する予定ですが、それはおそらく数年になるでしょう。)

function add_admin_menu_separator($position) {
  global $menu;
  $index = 0;
  foreach($menu as $offset => $section) {
    if (substr($section[2],0,9)=='separator')
      $index++;
    if ($offset>=$position) {
      $menu[$position] = array('','read',"separator{$index}",'','wp-menu-separator');
      break;
    }
  }
  ksort( $menu );
}

$menu必要なインデックスを見つける

必要なインデックス番号を把握するには、フック内からvar_dump()ofを実行$GLOBALS['menu']しますadmin_init。テーマのfunctions.phpファイルに一時的にドロップして、値が何であるかを確認できるコードを次に示します。これは/wp-admin/ 、少なくともテーマのfunctions.phpファイルへのFTPアクセスを取得するまで、URLをリクエストするときにのみ機能します(ただし、組み込みのテーマエディターではなくFTPを使用するか、サイトへのアクセスを失います

add_action('admin_init','dump_admin_menu');
function dump_admin_menu() {
  if (is_admin()) {
    header('Content-Type:text/plain');
    var_dump($GLOBALS['menu']);
    exit;
  }
}

参照:

ところで、これらのリンクは一般的に管理メニューを操作するのに役立つでしょう:

私の管理メニュークラスは現在、セパレータを追加する簡単な方法を提供していませんが、時間があるときに追加します。


マイクのおかげで、グローバル変数メニューを一晩中調べましたが、セパレータを追加することができませんでした。wpでメニューがどのように機能するかがより明確になりました。
user1147

こんにちは@ user1147:はい、わかりにくいです。私が最初にそれをしなければならなかったとき、私はかなり多くの時間を要しました、そして、私はまだ彼らと戦っています。したがって、なぜ私はそれらの関数を書いたので、これから簡単な方法でそれを行うことができます!とにかく、私の答えが助けてくれてうれしいです。
MikeSchinkel

1
@MikeSchinkelこの方法は、Wordpress 3.3.1では機能しません。
ジムGeurts

1
@JimGeurts-それも私のために働いていません:/
エヴァンマットソン

2
私はちょうどそれをテストし、4.5で「動作」しますが、WordPressはもはや表示されない場合は行を取り除くことにしました。私はCSSを追加する場合の解決策だと思いますが、私がバックエンド開発者であり、CSSを吸うので、私は一生どのCSSを追加するのかわかりません。たぶん他の誰かが提案できますか?
MikeSchinkel

4

次のように簡単です:

add_action( 'admin_init', 'add_sep' );
function add_sep() {

    if ( ! is_admin() )
        return false;

    global $menu;
    $sep = $menu[4]; // that's the default separator
    $pos = 6; // change it for the desired position
    $menu = array_merge(
        array_slice( $menu, 0, $pos ),
        array( $sep ),
        array_slice( $menu, $pos + 1, -1)
    );
    $menu[ $pos - 1 ][4] .= ' menu-top-last';
    $menu[ $pos + 1 ][4] .= ' menu-top-first';

}

注:デフォルトのセパレーター位置($menu[4])は、このフックの前に行った構成(またはプラグイン)によって異なる場合があります。

もちろん、あなたも微調整することができますmenu-top-firstし、menu-top-lastクラスのイントロスペクションを。


2

セパレーターが追加されない問題がいくつかあったのは、ワードプレスが重複するセパレーターを削除する方法が原因でした。ksort($menu);関数の下部に追加すると、問題が修正されました。


1

これは、MastaBabaの回答に基づいていますが、指定した位置で何も置き換えません-後にセパレータを追加するだけです。

また、匿名関数を使用しているため、PHPバージョン5.3以降とのみ互換性があります。

add_action( 'admin_menu', function () {
    $position = 29;
    global $menu;
    $separator = [
        0 => '',
        1 => 'read',
        2 => 'separator' . $position,
        3 => '',
        4 => 'wp-menu-separator'
    ];
    if (isset($menu[$position])) {
        $menu = array_splice($menu, $position, 0, $separator);
    } else {
        $menu[$position] = $separator;
    }
});

0

何をしようとしているのかを判断するのは少し難しいですが、WordPressの管理メニューにトップレベルのエントリを追加しようとしていると思います。

見る WordPress Codexのこのドキュメントを。

要するに、add_menu_page()多くの引数を取り、「ダッシュボード」、「投稿」、「メディア」などの兄弟として管理メニューに追加項目を表示する関数の使用法を探しています。

私はそれが正しかったことを願っています。:-)


管理者メニューセパレーターを追加しようとしています。質問を投稿する前に、私は使用しようとしましたadd_menu_page()
user1147

MikeSchinkelが非常によくカバーしてくれたようです。誤解して申し訳ありません。がんばろう!
dgw

0

以下は、管理メニューがレンダリングされるときに実行されるWordpressへのアクションを広告します。管理メニューは配列であり、ここで行うことは、指定した位置にセパレータを定義する配列要素を追加することだけです。

ここから:

add_action( 'admin_menu', 'set_admin_menu_separator' );
function set_admin_menu_separator() {
$position = 79;
global $menu;
$menu[$position] = array(
0   =>  '',
1   =>  'read',
2   =>  'separator' . $position,
3   =>  '',
4   =>  'wp-menu-separator'
);
}

これは現在受け入れられている答えにかなり似ているが、現在受け入れられている答えは私には役に立たなかったことに注意してください(そして、コメントから判断すると、他のいくつかについて)。


あなたが説明を与えないことを除いて、既存の受け入れられた答えに違いはありません。回答方法をお読みください。
FUXIA

@toscho:まあ、これは私にとってはうまくいきますが、受け入れられた答えはそうではありません。
MastaBaba
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.