Mendapatkan item submenu admin khusus untuk disorot saat aktif

9

Saya memiliki jenis pos kustom, Pekerjaan, dengan 3 taksonomi di bawahnya di menu Admin.

Salah satu taksonomi adalah Status, yang Aktif atau Tertutup. Saya ingin item menu di bawah Jobs for Active Jobs. Saya membuatnya dengan kode ini

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

Ini berfungsi dengan baik, kecuali bahwa item menu Pekerjaan tetap disorot ketika opsi menu Pekerjaan Aktif aktif. Lihat tangkapan layar

contoh tampilan submenu

Saya membaca di artikel ini Kelas saat ini pada menu admin menggunakan add_submenu_page () untuk tidak memasukkan slug induk sebagai parameter pertama. Saya tidak tahu cara membuat submenu muncul di bagian nav yang benar ketika saya menghapus slug nama file.

Pada titik ini saya tidak menggunakan fungsi panggilan balik, saya hanya menjalankan URL yang sama dengan opsi submenu Pekerjaan standar, kecuali dengan params kueri yang menyaring posting yang ditampilkan. Jika memindahkan ini ke fungsi panggilan balik akan menyelesaikan masalah, saya bisa melakukannya. Tapi saya tidak tahu apa yang harus dilakukan dalam fungsi callback. Saya ingin menampilkan halaman edit jenis posting kustom standar, hanya dengan filter taksonomi di tempat. terima kasih atas bantuannya

stvwlf
sumber
Saya tertarik untuk mengetahui solusi apa yang muncul untuk ini, karena sepertinya cukup sulit untuk dilakukan. Cara 'WordPress' adalah dengan menambahkan menu filter drop-down seperti yang ditunjukkan pada tangkapan layar Anda.
Stephen Harris
Anda memiliki kesalahan di url 'edit.php?&post_type=jobs&jobstatus=67' ... yang pertama &tidak boleh ada di sana, mengikuti ?...
Mark Duncan
Tandai - Anda benar, dan saya telah mengubahnya dalam kode di pos di atas dan di situs langsung. Namun itu tidak menyelesaikan masalah. Terima kasih telah menunjukkannya.
stvwlf

Jawaban:

5

Saya membuat pekerjaan ini menggunakan menu Posting dan status Konsep. Itu bergantung pada jQuery untuk mengubah kelas item daftar. Beradaptasi untuk bekerja dengan jenis dan URL posting Anda.

Ini hasilnya:
item submenu konsep tambahan

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
    }
}
brasofilo
sumber
5

Ini adalah solusi yang baru saja saya buat yang tidak menggunakan jQuery:

Ada filter parent_filedi wp-admin/menu-header.phpmana berjalan tepat sebelum mengeluarkan menu. Komentar inline mengatakan:

Agar plugin memindahkan tab submenu.

Ini hanya filter pada variabel global $parent_filedan saya tidak yakin apa fungsinya, tetapi kita akan menggunakan filter ini untuk mengubah variabel global $submenu_file, yang mengatur submenu yang disorot. Jadi ini akan menjadi solusi dalam kasus Anda:

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;
}

Anda dapat menyesuaikan ini dengan pemformatan url apa pun. Misalnya saya menggunakan format admin.php?page=my_plugin_slug&action=myactionuntuk sub menu plugin saya jadi saya menggunakan ini untuk menyorot sub menu saya:

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: Saya juga mencoba tindakan admin_menuuntuk mengatur $submenu_file, dan itu berhasil dalam kasus saya (halaman plugin kustom / siput) tetapi tidak untuk edit.phpsub menu (kasus Anda). Jadi saya mencari tindakan / filter lain yang berjalan kemudian dan itu adalah filter parent_file.

Parham
sumber
0

saya menemukan bahwa Anda juga perlu menggunakan entitas html untuk tautan Anda. karena kamu punya

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

Anda dapat mencoba dan mengubah ampersand ke entitas html yang setara

&amp;

jadi Anda akan melakukannya

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

ini bekerja untuk saya ... saya juga menguji string keluaran untuk menu submenu dan induk dan memeriksa apakah cocok. ini bisa menjadi fungsi utilitas kecil untuk memeriksa hal-hal ini

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;
}
Mujnoi Gyula Tamas
sumber