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


9

カスタムの投稿タイプJobsがあり、Adminメニューの3つの分類法の下にあります。

分類の1つはステータスで、アクティブまたはクローズのいずれかです。アクティブなジョブのジョブの下にメニュー項目が必要です。このコードで作成しました

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

これは完全に機能しますが、[アクティブなジョブ]メニューオプションがアクティブな場合、[ジョブ]メニュー項目は強調表示されたままです。スクリーンショットを見る

サブメニュー表示の例

この記事で は、add_submenu_page()使用して管理メニューの現在のクラスを読み 、最初のパラメーターとして親スラッグを含めていません。ファイル名のスラッグを削除したときに、サブメニューを正しいナビゲーションセクションに表示する方法がわかりません。

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


実行するのは非常に難しいように思われるので、これについてどのような解決策が考えられるか知りたいです。'WordPress'の方法は、スクリーンショットに示すようにドロップダウンフィルターメニューを追加することです。
スティーブン・ハリス

あなたは、URLに誤りを持っている'edit.php?&post_type=jobs&jobstatus=67' 最初のこと... &以下、あってはならない?...
マーク・ダンカン

マーク-あなたは正しいです、そして私は上記のポストとライブサイトのコードでそれを変更しました。しかし、それは問題を解決しません。指摘いただきありがとうございます。
stvwlf

回答:


5

この作業は、投稿メニューと下書きステータスを使用して行いました。jQueryに依存してリストアイテムクラスを変更します。投稿タイプとURLを操作するように調整します。

これが結果です:
追加の下書きサブメニュー項目

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

これが私が思いついたソリューションで、jQueryを使用していません。

フィルタありparent_filewp-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;
}

PS:私もアクションadmin_menuを設定しようとしました$submenu_file、そしてそれは私のケース(カスタムプラグインページ/スラグ)では機能しましたが、edit.phpサブメニュー(あなたのケース)では機能しませんでした。それで、後で実行される別のアクション/フィルターを検索しましたが、それがフィルターparent_fileでした。


0

リンクには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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.