Conseguir destacar o item do submenu de administrador personalizado quando estiver ativo

9

Eu tenho um tipo de postagem personalizado, Jobs, com 3 taxonomias no menu Admin.

Uma das taxonomias é Status, que é Ativo ou Fechado. Quero um item de menu em Trabalhos para trabalhos ativos. Eu criei com este código

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

Isso funciona perfeitamente, exceto que o item de menu Trabalhos permanece destacado quando a opção de menu Trabalhos ativos está ativa. Ver captura de tela

exemplo de exibição do submenu

Li neste artigo Classe atual no menu admin usando add_submenu_page () para não incluir a lesma pai como o primeiro parâmetro. Não sei como fazer com que o submenu apareça na seção de navegação correta quando removo a lesma do nome do arquivo.

Neste ponto, não estou usando uma função de retorno de chamada, estou simplesmente executando o mesmo URL da opção padrão do submenu Jobs, exceto com parâmetros de consulta que filtram as postagens exibidas. Se mover isso para uma função de retorno de chamada resolver o problema, eu posso fazer isso. Mas não sei o que deve acontecer na função de retorno de chamada. Desejo exibir a página de edição padrão do tipo de postagem personalizada, apenas com um filtro de taxonomia no lugar. obrigado pela ajuda

stvwlf
fonte
Eu estaria interessado em saber quais soluções surgem para isso, pois parece bastante difícil de fazer. A maneira 'WordPress' seria adicionar um menu de filtro suspenso, como mostrado na sua captura de tela.
Stephen Harris
Você tem um erro na url 'edit.php?&post_type=jobs&jobstatus=67' ... que o primeiro &não deveria estar lá, seguindo o ?..
Mark Duncan
Mark - você está correto, e eu mudei isso no código da postagem acima e no site ativo. No entanto, isso não resolve o problema. Obrigado por apontar isso.
stvwlf

Respostas:

5

Fiz esse trabalho usando os menus Postagens e o status Rascunho. Ele se baseia no jQuery para modificar as classes de itens da lista. Adapte-se para trabalhar com seu tipo de postagem e URLs.

Este é o resultado:
item de submenu rascunhos extras

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
fonte
5

Aqui está uma solução que eu acabei de descobrir que não usa jQuery:

Há um filtro parent_fileno wp-admin/menu-header.phpqual é executado logo antes da saída do menu. O comentário embutido diz:

Para os plugins moverem as guias do submenu.

É apenas um filtro na variável global $parent_filee não tenho certeza do que faz, mas usaremos esse filtro para alterar a variável global $submenu_file, que define o submenu destacado. Portanto, esta será a solução no seu caso:

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

Você pode adaptar isso com qualquer formatação de URL. Por exemplo, eu uso o formato admin.php?page=my_plugin_slug&action=myactionpara os submenus dos meus plugins, então usei isso para destacar meus submenus:

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: Eu também tentei a ação admin_menupara definir $submenu_file, e funcionou no meu caso (página de plug-in / slug personalizado), mas não para edit.phpsubmenus (seu caso). Então, eu procurei por outra ação / filtro que roda mais tarde e era o filtro parent_file.

Parham
fonte
0

Eu descobri que você também precisa usar entidades html para o seu link. desde que você tem

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

você pode tentar alterar o e comercial para seu equivalente em entidade html

&amp;

então você teria

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

isso funcionou para mim ... eu também testei a seqüência de saída para submenu e menu pai e verifiquei se eles coincidem. isso pode ser uma pequena função de utilidade para verificar essas coisas

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
fonte