Pobieranie niestandardowego podmenu administratora do podświetlania, gdy jest aktywne


9

Mam niestandardowy typ postu, Jobs, z 3 taksonomiami pod nim w menu administratora.

Jedną z taksonomii jest Status, który jest Aktywny lub Zamknięty. Chcę element menu w obszarze Zadania dla aktywnych zadań. Stworzyłem go za pomocą tego kodu

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

Działa to doskonale, z tym wyjątkiem, że pozycja menu Zadania pozostaje podświetlona, ​​gdy aktywna jest opcja menu Zadania aktywne. Zobacz zrzut ekranu

przykład wyświetlania podmenu

Przeczytałem w tym artykule Bieżąca klasa w menu administratora za pomocą add_submenu_page (), aby nie uwzględniać macierzystego ślimaka jako pierwszego parametru. Nie wiem, jak sprawić, aby podmenu pojawiło się we właściwej sekcji nawigacji po usunięciu pliku z nazwą pliku.

W tym momencie nie używam funkcji wywołania zwrotnego, po prostu wykonuję ten sam adres URL, co domyślną opcję podmenu Zadania, z wyjątkiem parametrów zapytania filtrujących wyświetlane posty. Jeśli przeniesienie tego do funkcji wywołania zwrotnego rozwiąże problem, mogę to zrobić. Ale nie wiem, co powinno iść w funkcji wywołania zwrotnego. Chcę wyświetlić standardową niestandardową stronę edycji typu posta, tylko z zainstalowanym filtrem taksonomii. dzięki za pomoc


Chciałbym wiedzieć, jakie rozwiązania tego dotyczą, ponieważ wydaje się to dość trudne. „WordPress” polega na dodaniu rozwijanego menu filtrów, jak pokazano na zrzucie ekranu.
— Stephen Harris

Masz błąd w adresie URL 'edit.php?&post_type=jobs&jobstatus=67' ... że najpierw &nie powinno go być, po ?...
— Mark Duncan

Mark - masz rację, a ja zmieniłem to w kodzie w powyższym poście i na stronie na żywo. Jednak to nie rozwiązuje problemu. Dziękuję za zwrócenie na to uwagi.
— stvwlf

Odpowiedzi:


5

Zrobiłem to przy użyciu menu postów i statusu wersji roboczej. Opiera się na jQuery do modyfikowania klas pozycji listy. Dostosuj się do pracy z typem posta i adresami URL.

Oto wynik:
pozycja podmenu dodatkowych szkiców

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

Oto rozwiązanie, które właśnie wymyśliłem, które nie korzysta z jQuery:

Istnieje filtr, parent_filew wp-admin/menu-header.phpktórym działa tuż przed wyjściem z menu. Wewnętrzny komentarz mówi:

Wtyczki do przenoszenia kart podmenu.

Jest to tylko filtr globalnej zmiennej $parent_filei nie jestem pewien, co robi, ale użyjemy tego filtra do zmiany globalnej zmiennej $submenu_file, która ustawia podświetlone podmenu. To będzie rozwiązanie w twoim przypadku:

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

Możesz to dostosować za pomocą dowolnego formatowania adresu URL. Na przykład używam formatu admin.php?page=my_plugin_slug&action=myactiondla podmenu moich wtyczek, więc użyłem tego, aby podświetlić moje podmenu:

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: Próbowałem również admin_menuustawić akcję $submenu_filei zadziałała ona w moim przypadku (niestandardowa strona wtyczki / ślimaka), ale nie w edit.phppodmenu (twój przypadek). Więc szukałem innej akcji / filtra, która działałaby później i był to filtr parent_file.


0

dowiedziałem się, że musisz również użyć encji HTML dla swojego linku. odkąd masz

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

możesz spróbować zmienić znak ampersand na jego odpowiednik encji HTML

&amp;

więc miałbyś

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

to działało dla mnie ... przetestowałem również ciąg wyjściowy dla podmenu i menu nadrzędnego i sprawdziłem, czy pasują. może to być mała funkcja narzędziowa do sprawdzania tego

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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.