web-dev-qa-db-ja.com

アクティブなときに強調表示するカスタム管理サブメニュー項目を取得する

[管理]メニューの下に3つの分類法を持つカスタム投稿タイプ[ジョブ]があります。

分類法の1つにステータスがあります。これはアクティブまたはクローズです。 Active JobsのJobsの下にメニュー項目が必要です。このコードで作成しました

add_submenu_page(
    'edit.php?post_type=jobs',
    'Active Jobs',
    'Active Jobs',
    'manage_options',
    'edit.php?post_type=jobs&jobstatus=67'
);

Active JobsメニューオプションがアクティブなときにJobsメニュー項目がハイライトされたままであることを除いて、これは完全に機能します。スクリーンショットを見る

example of submenu display

私はこの記事を読みました アドミンメニューの現在のクラスadd_submenu_page()を使って 最初のパラメータとして親スラグを含めないように。スラッグを削除したときにサブメニューが正しいナビゲーションセクションに表示されるようにする方法がわかりません。

現時点では、コールバック関数を使用していません。表示される投稿をフィルタ処理するクエリパラメータを除いて、単純にデフォルトのJobsサブメニューオプションと同じURLを実行しています。これをコールバック関数に移動しても問題が解決する場合は、それを実行できます。しかし、コールバック関数に何を入れるべきかわかりません。標準のカスタム投稿タイプの編集ページを表示したいのですが、分類フィルターを配置しただけです。助けてくれてありがとう

9
stvwlf

この作業は、投稿メニューとドラフトステータスを使用して行いました。それはリストアイテムクラスを変更するためにjQueryに依存します。あなたの投稿タイプとURLに合わせて作業してください。

これが結果です。
extra drafts submenu item

add_action( 'admin_menu', 'wpse_44270_menu_admin' );
add_action( 'admin_head-edit.php', 'wpse_44270_highlight_menu_item' );

function wpse_44270_menu_admin() 
{
    add_submenu_page(
        'edit.php',
        'Drafts', 
        '<span id="my-draft-posts">Drafts</span>', 
        'edit_pages', 
        'edit.php?post_status=draft&post_type=post'
    );
}

function wpse_44270_highlight_menu_item()
{
    global $current_screen;

    // Not our post type, exit earlier
    if( 'post' != $current_screen->post_type )
        return;

    if( isset( $_GET['post_status'] ) && 'draft' == $_GET['post_status'] )
    {       
        ?>
        <script type="text/javascript">
            jQuery(document).ready( function($) 
            {
                var reference = $('#my-draft-posts').parent().parent();

                // add highlighting to our custom submenu
                reference.addClass('current');

                //remove higlighting from the default menu
                reference.parent().find('li:first').removeClass('current');             
            });     
        </script>
        <?php
    }
}
5
brasofilo

これが私が思いついた解決策で、jQueryを使わない。

parent_fileには、メニューを出力する直前に実行されるフィルタwp-admin/menu-header.phpがあります。インラインコメントは言う:

プラグインがサブメニュータブを動かすために。

これはグローバル変数$parent_fileに対する単なるフィルタであり、それが何をするのかよくわかりませんが、代わりにこのフィルタを使用してグローバル変数$submenu_fileを変更し、ハイライトされたサブメニューを設定します。だからこれはあなたの場合の解決策になります:

add_filter('parent_file', 'wpse44270_parent_file');

function wpse44270_parent_file($parent_file){
    global $submenu_file;
    if (isset($_GET['jobstatus']) && $_GET['jobstatus'] == 67) $submenu_file = 'edit.php?post_type=jobs&jobstatus=67';

    return $parent_file;
}

あなたはどんなURLフォーマットでこれを適応させるかもしれません。たとえば、プラグインのサブメニューにadmin.php?page=my_plugin_slug&action=myactionという形式を使用しているので、これを使用してサブメニューを強調表示します。

add_filter('parent_file', 'wpse44270_1_parent_file');

function wpse44270_1_parent_file($parent_file){
    global $submenu_file;
    if (isset($_GET['page']) && isset($_GET['action'])) $submenu_file = $_GET['page'] . '&action=' . $_GET['action'];

    return $parent_file;
}

シモンズ:私はまたadmin_menuを設定するために$submenu_fileアクションを試みました、そしてそれは私の場合(カスタムプラグインページ/ slug)でうまくいきましたがedit.phpサブメニュー(あなたの場合)のために働きませんでした。だから私は後で実行する別のアクション/フィルタを検索しましたが、それはフィルタparent_fileでした。

3
Parham

私はあなたがあなたのリンクにもHTMLエンティティを使う必要があることを知りました。あなたが持っているので

add_submenu_page(
    'edit.php?post_type=jobs',
    'Active Jobs',
    'Active Jobs',
    'manage_options',
    'edit.php?post_type=jobs&jobstatus=67'
);

アンパサンドをHTMLエンティティと同等のものに変更してみてください。

&amp;

だからあなたは持っているでしょう

add_submenu_page(
    'edit.php?post_type=jobs',
    'Active Jobs',
    'Active Jobs',
    'manage_options',
    'edit.php?post_type=jobs&amp;jobstatus=67'
);

これは私のために働いた...私もサブメニューと親メニューのための出力文字列をテストし、それらが一致するかどうかチェックした。これをチェックするためのちょっとしたユーティリティ関数になるでしょう

add_filter( 'parent_file', 'test_taxonomy_highlight' );
function test_taxonomy_highlight( $parent_file ){
   global $submenu_file;
   echo '<pre>', var_dump( $submenu_file, htmlentities( $submenu_file ) ), '</pre>';
   echo '<pre>', var_dump( $parent_file, htmlentities( $parent_file ) ), '</pre>';
   return $parent_file;
}
0