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

stvwlf
źródło
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
    }
}
brasofilo
źródło
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.

Parham
źródło
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;
}
Mujnoi Gyula Tamas
źródło