Eines der Dinge beim Arbeiten mit der WordPress-Menü-API (dh add_menu_page, add_submenu_page und dergleichen) ist, dass es nicht einfach ist, die Untermenüelemente neu anzuordnen.
Sicher, für bestimmte Dinge wie Taxonomien oder ähnliches können Sie einfach die Reihenfolge ändern, in der sie registriert sind. Aber nehmen wir an, Sie haben ein WordPress-Admin-Menü und dann ein paar Untermenüseiten unter diesem bestimmten Menü.
Standardmäßig erstellt WordPress das Menü der obersten Ebene und erstellt dann sofort ein Untermenüelement unter dem Menü der obersten Ebene, das auf dieselbe Seite verweist. In vielen Fällen kann dies ideal sein.
In einigen Fällen möchten Sie dies jedoch möglicherweise ändern.
WordPress-Admin-Menü
Ein Beispiel dafür, wann Sie etwas ändern möchten, könnte etwa so aussehen:
- Sie haben ein Menü der obersten Ebene, das Optionen anbieten soll, nachdem Sie sich mit einer API eines Drittanbieters verbunden haben.
- Die Drittanbieter-API erfordert einen API-Schlüssel (oder eine andere Authentifizierung), daher müssen Sie zuerst Einstellungen dafür bereitstellen.
- Warum machen Sie den ersten Menüpunkt nicht zu den Einstellungen und den zweiten Menüpunkt zu den eigentlichen API-Tools?
Wenn die Einstellungen noch nicht festgelegt wurden, ist es natürlich hilfreich, auch eine Meldung im Hauptmenü der API-Tools anzuzeigen, dass der Benutzer auf die Seite „Einstellungen“ klicken muss, um seine Einstellungen einzugeben.
Aber das würde den Rahmen dieses Beitrags sprengen. Im Moment gibt es hier eine Möglichkeit, das Menü serverseitig neu zu ordnen. Erst der Code, dann die Erklärung.
<?php
add_action('custom_menu_order', __NAMESPACE__.'acmeReorderSubmenuItems);
/**
* Reorders the menu by placing the second item before the first item.
*/
function acmeReorderSubmenuItems()
{
global $submenu;
$newSubmenu = [];
foreach ($submenu as $menuName => $menuItems) {
if ('acme-api-tools' === $menuName) {
$newSubmenu[0] = $menuItems[1];
$newSubmenu[1] = $menuItems[0];
$submenu['acme-api-tools'] = $newSubmenu;
break;
}
}
}
Im Allgemeinen verwende ich dies im Kontext eines Namespace-Objekts, aber für diesen Beitrag verweise ich es auf eine Funktion, die in einem Namespace existiert.
Ein paar Dinge zu beachten:
- Ich verwende den Hook custom_menu_order, der ein idealer Ort ist, um an den Menüpunkten in WordPress zu arbeiten.
- Ich suche speziell nach dem acme-api-tools-Untermenü im $menuName – Schlüssel der $ submenu- Array-Variablen,
- Ich erstelle ein Array, $newSubmenu, tausche dann die Elemente aus und weise das neue Untermenü dem vorhandenen Untermenü zu, das durch den Schlüssel identifiziert wird.
Es gibt einige Anmerkungen – vielleicht sogar Probleme (oder zumindest ernsthafte Überlegungen) – mit diesem Ansatz.
Der Code erwartet nämlich, genau den Schlüssel zu kennen, mit dem wir arbeiten wollen. In einigen Fällen ist dies in Ordnung, aber wenn Sie ein Menü ändern möchten, für das Sie den Schlüssel nicht kennen (wie acme-api-tools ), müssen Sie dies ändern.
Als nächstes wird davon ausgegangen, dass nur zwei Menüpunkte ausgetauscht werden müssen. Im obigen Fall ist es einfach genug, aber wenn es mehr gäbe, würden Sie wahrscheinlich eine Funktion brauchen, um Dinge zu verschieben und das neue Array zurückzugeben.
Genug für den Anfang
Das heißt, die obige Funktionalität sollte zumindest genug Informationen dafür geben, wie man damit beginnt, wenn nicht mehr, und dann, wie man das sichtbare Untermenü-Array manipuliert