Ottenere l'elemento del sottomenu amministratore personalizzato da evidenziare quando è attivo


9

Ho un tipo di post personalizzato, Jobs, con 3 tassonomie nel menu Admin.

Una delle tassonomie è lo stato, che è attivo o chiuso. Voglio una voce di menu in Lavori per lavori attivi. L'ho creato con questo codice

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

Funziona perfettamente, tranne per il fatto che la voce di menu Lavori rimane evidenziata quando l'opzione di menu Lavori attivi è attiva. Vedi la schermata

esempio di visualizzazione del sottomenu

Ho letto in questo articolo Classe corrente nel menu di amministrazione usando add_submenu_page () per non includere la lumaca padre come primo parametro. Non so come far apparire il sottomenu nella sezione di navigazione corretta quando rimuovo la lumaca del nome file.

A questo punto non sto usando una funzione di callback, sto semplicemente eseguendo lo stesso URL dell'opzione di sottomenu Jobs predefinita, ad eccezione dei parametri di query che filtrano i post visualizzati. Se lo spostamento in una funzione di richiamata risolverà il problema, posso farlo. Ma non so cosa dovrebbe andare nella funzione di callback. Voglio visualizzare la pagina di modifica del tipo di posta personalizzato standard, solo con un filtro tassonomia in atto. grazie per l'assistenza


Sarei interessato a sapere quali soluzioni escono per questo, dal momento che sembra abbastanza difficile da fare. Il modo 'WordPress' sarebbe quello di aggiungere un menu a discesa come mostrato nello screenshot.
Stephen Harris

Hai un errore nell'URL 'edit.php?&post_type=jobs&jobstatus=67' ... che prima &non dovrebbe essere lì, dopo il ?..
Mark Duncan

Mark: hai ragione, e l'ho modificato nel codice nel post sopra e sul sito live. Tuttavia, ciò non risolve il problema. Grazie per averlo sottolineato.
stvwlf

Risposte:


5

Ho realizzato questo lavoro usando i menu Messaggi e lo stato Bozza. Si basa su jQuery per modificare le classi degli elementi dell'elenco. Adattati per lavorare con il tuo tipo di post e URL.

Questo è il risultato:
voce di sottomenu bozze extra

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

Ecco una soluzione che ho appena trovato che non utilizza jQuery:

C'è un filtro parent_filein wp-admin/menu-header.phpcui viene eseguito subito prima di emettere il menu. Il commento in linea dice:

Per consentire ai plug-in di spostare le schede dei sottomenu.

È solo un filtro sulla variabile globale $parent_filee non sono sicuro di cosa faccia ma useremo questo filtro per modificare $submenu_fileinvece la variabile globale , che imposta il sottomenu evidenziato. Quindi questa sarà la soluzione nel tuo 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;
}

Puoi adattarlo con qualsiasi formattazione dell'URL. Ad esempio, utilizzo il formato admin.php?page=my_plugin_slug&action=myactionper i sottomenu dei miei plugin, quindi l'ho usato per evidenziare i miei sottomenu:

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: Ho anche provato admin_menua impostare l'azione $submenu_file, e ha funzionato nel mio caso (pagina plugin / slug personalizzati) ma non per i edit.phpsottomenu (il tuo caso). Quindi ho cercato un'altra azione / filtro che verrà eseguita in seguito ed è stato il filtro parent_file.


0

ho scoperto che è necessario utilizzare anche entità html per il tuo collegamento. dal momento che hai

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

potresti provare a cambiare la e commerciale con il suo equivalente html equivalente

&amp;

così avresti

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

questo ha funzionato per me ... ho anche testato la stringa di output per il sottomenu e il menu principale e ho verificato che corrispondessero. questa può essere una piccola funzione di utilità per controllare queste cose

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.