Отримання спеціального елемента підменю адміністратора для виділення, коли він активний


9

У мене є спеціальний тип публікації Робота з 3-ма таксономіями в меню адміністратора.

Однією з таксономій є Статус, який є активним або закритим. Я хочу пункт меню в розділі Роботи для активних вакансій. Я створив це за допомогою цього коду

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

Це прекрасно працює, за винятком того, що пункт меню «Робота» залишається виділеним, коли активний варіант меню «Активні завдання». Дивіться знімок екрана

Приклад відображення підменю

Я читав у цій статті Поточний клас у меню адміністратора, що використовує add_submenu_page (), щоб не включати батьківський слуг як перший параметр. Я не знаю, як змусити підменю відображатися у правильному розділі nav, коли я видаляю слупку імені файлу.

На даний момент я не використовую функцію зворотного виклику, я просто виконую ту саму 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_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;
}

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'
);

ви можете спробувати змінити ampersand на його еквівалент 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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.