Benutzerdefiniertes Admin-Untermenüelement hervorheben, wenn es aktiv ist


9

Ich habe einen benutzerdefinierten Beitragstyp, Jobs, mit 3 Taxonomien im Admin-Menü.

Eine der Taxonomien ist der Status, der entweder aktiv oder geschlossen ist. Ich möchte einen Menüpunkt unter Jobs für aktive Jobs. Ich habe es mit diesem Code erstellt

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

Dies funktioniert einwandfrei, außer dass der Menüpunkt Jobs hervorgehoben bleibt, wenn die Menüoption Aktive Jobs aktiv ist. Siehe Screenshot

Beispiel für die Anzeige eines Untermenüs

Ich habe in diesem Artikel Aktuelle Klasse im Admin-Menü mit add_submenu_page () gelesen , um den übergeordneten Slug nicht als ersten Parameter einzuschließen . Ich weiß nicht, wie ich das Untermenü im richtigen Navigationsbereich anzeigen soll, wenn ich den Dateinamen-Slug entferne.

Zu diesem Zeitpunkt verwende ich keine Rückruffunktion. Ich führe lediglich dieselbe URL wie die Standard-Untermenüoption Jobs aus, außer bei Abfrageparametern, die die angezeigten Beiträge filtern. Wenn das Problem durch Verschieben in eine Rückruffunktion behoben wird, kann ich das tun. Aber ich weiß nicht, was in der Rückruffunktion passieren soll. Ich möchte die Standard-Bearbeitungsseite für benutzerdefinierte Beitragstypen anzeigen, nur mit einem vorhandenen Taxonomiefilter. Danke für die Hilfe


Es würde mich interessieren, welche Lösungen dafür kommen, da dies ziemlich schwierig zu sein scheint. Die 'WordPress'-Methode wäre, ein Dropdown-Filtermenü hinzuzufügen, wie in Ihrem Screenshot gezeigt.
Stephen Harris

Sie haben einen Fehler in der URL 'edit.php?&post_type=jobs&jobstatus=67' ... die zuerst &nicht da sein sollte, nach dem ?..
Mark Duncan

Mark - Sie haben Recht, und ich habe das im Code im obigen Beitrag und auf der Live-Site geändert. Das Problem wird dadurch jedoch nicht behoben. Vielen Dank für den Hinweis.
stvwlf

Antworten:


5

Ich habe diese Arbeit mit den Posts-Menüs und dem Draft-Status gemacht. Es basiert auf jQuery, um die Listenelementklassen zu ändern. Passen Sie sich an Ihren Beitragstyp und Ihre URLs an.

Das ist das Ergebnis:
Untermenüpunkt für zusätzliche Entwürfe

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

Hier ist eine Lösung, die ich mir gerade ausgedacht habe und die jQuery nicht verwendet:

Es ist ein Filter , parent_filein wp-admin/menu-header.phpdem vor der Ausgabe das Menü rechts läuft. Der Inline-Kommentar lautet:

Damit Plugins Untermenü-Registerkarten verschieben können.

Es ist nur ein Filter für die globale Variable $parent_fileund ich bin nicht sicher, was es tut, aber wir werden diesen Filter verwenden, um $submenu_filestattdessen die globale Variable zu ändern , wodurch das hervorgehobene Untermenü festgelegt wird. Dies ist also die Lösung in Ihrem Fall:

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

Sie können dies mit jeder URL-Formatierung anpassen. Zum Beispiel verwende ich das Format admin.php?page=my_plugin_slug&action=myactionfür die Untermenüs meiner Plugins, um meine Untermenüs hervorzuheben:

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: Ich habe auch versucht, die Aktion admin_menufestzulegen $submenu_file, und sie hat in meinem Fall (benutzerdefinierte Plugin-Seite / Slug) funktioniert, aber nicht für edit.phpUntermenüs (Ihr Fall). Also habe ich nach einer anderen Aktion / einem anderen Filter gesucht, die / der später ausgeführt wird, und es war der Filter parent_file.


0

Ich fand heraus, dass Sie auch HTML-Entitäten für Ihren Link verwenden müssen. da hast du

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

Sie können versuchen, das kaufmännische Und in das entsprechende HTML-Entitätsäquivalent zu ändern

&amp;

so hättest du

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

Das hat bei mir funktioniert ... Ich habe auch die Ausgabezeichenfolge für das Untermenü und das übergeordnete Menü getestet und überprüft, ob sie übereinstimmen. Dies kann eine kleine Utility-Funktion zum Auschecken sein

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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.