Nuance beim Hinzufügen von CPT und TAX zu einem Untermenü

Ich habe eine Menge CPTs und benutzerdefinierte TAXs und habe beschlossen, sie in ein paar Untermenüs zu setzen. Das hat gut funktioniert. Ich werde erklären, wie ich das in einem Moment gemacht habe, aber das Problem ist, dass wenn Sie einen “neuen Begriff” oder einen “neuen Beitrag” wählen, das Sidebar-Menü des Administrators den Überblick verliert, innerhalb eines Untermenüs zu sein. Dies ist nicht unbedingt wichtig, da Sie das Element hinzufügen und dann das Admin-Menü erneut öffnen können, aber es ist eine Irritation, die ich entfernen möchte.

Um mein Problem zu erklären, habe ich ein paar Screenshots beigefügt. Hier ist das Admin-Menü, wenn ich es zu meinem Menü / Untermenü von “LG RefData / UOM” öffne:

Bildbeschreibung hier eingeben

So weit, alles gut. BTW, UOM ist ein CPT (kein TAX). Wenn ich jetzt auf den “Add New” -Button am oberen Rand der edit.php-Seite klicke, erscheint die Seite in Ordnung, aber das Admin-Menü bricht zusammen und sieht so aus:

Bildbeschreibung hier eingeben

Das ist also das Hauptproblem, aber es gibt eine kleine Folge, die damit zusammenhängt, wie sich TAX verhalten. Im ursprünglichen Screenshot haben Sie ein Untermenü namens “UOM Context” gesehen, welches eine Taxonomie darstellt. Standardmäßig klickt man sofort auf das Admin-Menü, aber ich habe einen Weg gefunden (mehr dazu in einer Sekunde), aber meine Lösung sieht immer noch so aus, wenn ich auf den Link “UOM Context” klicke:

Bildbeschreibung hier eingeben

Beachten Sie, dass das Untermenü nicht markiert ist, wenn es nicht ausgeblendet ist.

Also lassen Sie mich Ihnen den Code zeigen, den ich verwendet habe, um dies einzurichten (obwohl es wahrscheinlich ziemlich Standard-Code für Leute ist, die das versuchen). Das erste, was aus einer Ausführungsperspektive geschieht, ist, dass die CPTs und TAXs registriert sind. Der Trick mit den CPTs ist, das “show_in_menu” zu verwenden und es auf den Namen der Menüseite zu setzen, unter der es sich befindet:

// Default args array( 'label' => $plural, 'labels' => $labels, 'public' => true, 'show_ui' => $this->show_menu, 'show_in_menu' => $this->show_in_menu, 'supports' => array( 'title', 'editor' , 'excerpt'), 'show_in_nav_menus' => true, 'menu_icon' => LG_FE_DIR . "/img/lg-admin.png", 'menu_position' => $this->get_menu_priority(), '_builtin' => false, ), 

Beachten Sie, dass dies für TAX nicht notwendig ist und in meinen Experimenten scheint es keine Wirkung zu haben, also habe ich es einfach weggelassen. Der zweite Schritt ist die Aufrufe add_menu_page und add_submenu_page:

 add_menu_page ("LG Ref Data", "LG Ref Data", "manage_options", LG_REFDATA_MENU, "LG_AdminMenuSystem::show_reference_menu", plugins_url ("/img/LG.png", __DIR__), 61.1); add_submenu_page (LG_REFDATA_MENU,"UOMs","UOMs","manage_options",'edit.php?post_type=uoms'); add_submenu_page (LG_REFDATA_MENU,"UOM Context","UOM Context","manage_options",'edit-tags.php?taxonomy=uom-contexts&post_type=uoms'); array_push (self::$tax_correct, "uom-contexts"); 

Ziemlich normales Zeug mit Ausnahme der letzten Zeile, die der Anfang meiner TAX Fix ist, die ich bereits erwähnt habe (aka, stoppt das Menü bei der Auswahl eines Steuerelements kollabiert, aber stoppt es nicht, wenn ein neues Element hinzugefügt wird). Hier ist der eigentliche Code für das Update:

 static public function tax_menu_correction ($parent_file) { global $current_screen; $taxonomy = $current_screen->taxonomy; if ( in_array($taxonomy,self::$tax_correct) ) $parent_file = LG_REFDATA_MENU; return $parent_file; } 

welches dann von folgendem Haken aufgerufen wird:

 add_action( 'parent_file' , 'LG_AdminMenuSystem::tax_menu_correction'); // helps to keep the menu selection on the menu when choosing a custom TAX 

So, das war es. Jede und jede Hilfe würde sehr geschätzt werden.

Solutions Collecting From Web of "Nuance beim Hinzufügen von CPT und TAX zu einem Untermenü"

Ich habe eine ähnliche Frage beantwortet. AFAIK, du musst es mit jQuery lösen.

 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'); 

Und der Trick besteht darin, eine ID in Ihre benutzerdefinierten Menüs einzufügen, damit Sie sie reference können.

 add_submenu_page( 'edit.php', 'Drafts', 'Drafts', // < ---- HERE 'edit_pages', 'edit.php?post_status=draft&post_type=post' ); 

Wahrscheinlich benötigen Sie mehr jQuery als dieses Beispiel.

Ich hatte jetzt einen Haken, da ich ein Plugin habe, das es braucht. Ich benutze auch den Admin-Filter hook parent_file , mit dem Sie den obersten Menüpunkt des Administrationsmenüs angeben können, unter dem Ihre Seite logischerweise steht. (NB: es ist ein Filter, keine Aktion; add_action funktioniert auch, aber es sollte wirklich add_filter sein)

Mein Problem ist, dass ich nicht möchte, dass die benutzerdefinierte Post-Typ-Bearbeitungsseite in einem Menü aufgelistet wird. Ich möchte nur von einer anderen Seite, die sich im Menü befindet, darauf verlinken. Das bedeutet, dass ich 'show_in_menu' => false was ich denke, dass du das auch gesagt hast.

Um den Untermenüpunkt als ‘aktuell’ zu setzen, musste ich einen Nebeneffekt hinzufügen, der eine globale Variable $submenu_file , dass sie mit der Seite $submenu_file , auf der ich diese Verknüpfung habe.

NB: Dies ist fast ein exakter Rip von irgendeinem Arbeitscode, also passen Sie ihn bitte an Ihren Code an.

 // this filter only added when loading the edit page add_filter('parent_file', 'wpse_71865_filterParentFile'); /** * tell WordPress admin the parent page for the menu * @param string $parent_file * @return string */ public function wpse_71865_filterParentFile($parent_file) { global $submenu_file; // set parent menu item for filter return // (Gravity Forms in my case) $parent_file = 'gf_edit_forms'; // set submenu item by side effect, link isn't in menu $submenu_file = 'gfdpspxpay-options'; return $parent_file; } 

Beachten Sie, dass ich an eine Seite page=gfdpspxpay-options ( page=gfdpspxpay-options ), damit $submenu_file möglicherweise nicht für Sie funktioniert. Wenn nicht, dann schau dir wp-admin/menu-header.php , wo das alles passiert. Es gibt ein Array $submenu_items , das $submenu_items wird, um das Untermenü zu erstellen, und hier findet die gesamte Aktion statt.

edit: Ich rechne für dein Problem, du musst nur einstellen:

 $submenu_file = 'post-new.php?post_type=uoms' 

Hmmm. Ich weiß nicht, was hier passiert ist. Ich hätte schwören können, dass ich diese Frage bereits beantwortet und geschlossen habe. In jedem Fall habe ich einen Ansatz verwendet, der auf dem Vorschlag von @ brasofilo basiert. Hier ist alles, was Sie tun müssen:

Verwenden Sie in Ihrem PHP, in dem Sie das Untermenü registrieren, eine Deklaration wie diese:

 add_submenu_page ( LG_TRANSACTIONAL_MENU, $plural ,"" . $plural . "", "manage_options", "edit.php?post_type={$this->custom_type_slug_name}" ); 

In meinem Fall befindet sich dieses PHP in einem benutzerdefinierten post-type plugin, das ich geschrieben habe, so dass die Variablennamen speziell dafür sind, aber der Schlüssel ist nur, dass Sie eine DOM-ID hinzufügen, auf die jQuery zugreifen kann. In diesem Fall ist die ID Untermenu [Pluralname von CPT] .

Der Rest ist mit jQuery erledigt:

 // If on a custom taxonomy editing page then make sure the menu item is selected if ( adminpage === "edit-tags-php") { $('#submenu-' + pagenow).closest('li').addClass('current'); } // if on a edit post-type page (post-new.php) then make sure menu is selected, expanded, and the submenu is current if (adminpage === "post-new-php") { $('#submenu-edit-' + pagenow).closest('li').addClass('current'); $('#submenu-edit-' + pagenow).closest('.wp-has-submenu').removeClass('wp-not-current-submenu').addClass('wp-has-current-submenu'); }