Получение пользовательского элемента подменю администратора для выделения, когда он активен

9

У меня есть пользовательский тип поста, Jobs, с 3 таксономиями в меню Admin.

Одной из таксономий является Статус, который является Активным или Закрытым. Я хочу пункт меню под Рабочие места для активных рабочих мест. Я создал это с этим кодом

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, что и опция подменю Jobs по умолчанию, за исключением параметров запроса, которые фильтруют отображаемые сообщения. Если перемещение в функцию обратного вызова решит проблему, я могу это сделать. Но я не знаю, что должно идти в функцию обратного вызова. Я хочу отобразить стандартную страницу редактирования пользовательских типов сообщений, просто с установленным фильтром таксономии. Спасибо за содействие

stvwlf
источник
Мне было бы интересно узнать, какие решения для этого подходят, так как это кажется довольно сложным. В 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
    }
}
brasofilo
источник
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'
);

Вы можете попробовать изменить амперсанд на его 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;
}
Мужной Дьюла Тамас
источник