web-dev-qa-db-ja.com

カスタムサブメニュー項目の並べ替え

設定 メニューには、次のメニュー項目があります。

Settings
-- General
-- Writing
-- Reading
-- Discussion
-- Media
-- Permalinks
-- Blogging

Blogging options-general.php?page=blogging)を下に並べ替えずに General の下に並べ替えたいと思います。これはadd_options_page()関数で追加されました。

いくつかの調査から、これが私が思いついたものです。

add_filter( 'custom_menu_order', array( $this, 'submenu_order' ) );
function submenu_order( $menu_order ) {
    global $submenu;
    $order = array();
    $order[] = $submenu['options-general.php'][10];
    $order[] = $submenu['options-general.php'][41];
    $submenu['options-general.php'] = $order;
    return $menu_order;
}

これは動作しますが、 General および Blogging のみが表示され、残りは削除されます。

Settings
-- General
-- Blogging

また、私にとって$submenu['options-general.php'][41]は現在インデックス位置41です。たとえ他のプラグイン設定がリストされていても、これは他のみんなにとって同じインデックス位置になるということですか?

cjbj の助けを借りて、私は最終的な解決策を得ることができました。

add_filter( 'custom_menu_order', 'submenu_order' );
function submenu_order( $menu_order ) {
    # Get submenu key location based on slug
    global $submenu;
    $settings = $submenu['options-general.php'];
    foreach ( $settings as $key => $details ) {
        if ( $details[2] == 'blogging' ) {
            $index = $key;
        }
    }
    # Set the 'Blogging' menu below 'General'
    $submenu['options-general.php'][11] = $submenu['options-general.php'][$index];
    unset( $submenu['options-general.php'][$index] );
    # Reorder the menu based on the keys in ascending order
    ksort( $submenu['options-general.php'] );
    # Return the new submenu order
    return $menu_order;
}

あなたが直接グローバル変数を操作しているならば、あなたが得る結果は驚くべきことではありません。 $submenuをキー10と41の項目だけに置き換えます。この方法に従う場合は、これを行う必要があります(キー11には何もないと仮定します)。

$submenu['options-general.php'][11] = $submenu['options-general.php'][41];
unset ($submenu['options-general.php'][41]);

ただし、フィルタ機能は一切使用していません。フィルタを通過している$menu_orderには何も起こりません。だから、これは非常にきれいな解決策になることはできません。

ご存知のとおり、 add_submenu_page は、関数が呼び出される順序で、配列の最後に新しいサブメニューを追加するだけです。この行

$submenu[$parent_slug][] = array ( $menu_title, $capability, $menu_slug, $page_title );

あなたがそうする前に新しいプラグインがadd_submenu_pageを呼び出すならば、41のキーは簡単に別のものになるかもしれません。これを防ぐには、正しいキーを見つけるために$submenuをループする必要があります。クイック 'ダーティーバージョン:

for ( $i = 1; $i <= 100; $i++ ) {
    if ( array_key_exists( $submenu['options-general.php'][$i] ) ) {
        if ( $submenu['options-general.php'][$i][2] == 'my-custom-slug' ) {
            $the_desired_key = $i;
            // [2] because that is the index of the slug in the submenu item array above
        }
    }
}

_ update _

後者のループのより良いバージョン:

$sub = $submenu['options-general.php'];
foreach ( $sub as $key => $details ) {
        if ( $details[2] == 'my-custom-slug' ) {
            $the_desired_key = $key;
        }
  }

このようにして$the_desired_keyを見つけたら、上記のset + unsetメソッドを安全に使うことができます。 11が未使用のオフセットであることを確認しました。

4
cjbj