Über API-Funktionen möchte ich ein neues Navigationsmenü definieren , es im aktuellen Thema auswählen und dann einige Seiten als Menüelemente einfügen. Dies soll zum Beispiel bei einer Themenaktivierung geschehen.
Durch einen (mäßig schmerzhaften) Prozess des Reverse Engineerings, bei dem die Datenbank nach dem manuellen Einrichten des Navigationsmenüs und der Elemente eingefügt und aktualisiert wird, habe ich die folgenden Schritte zusammengesetzt, wobei 'footer-nav' die Slug-ID des Navigationsmenüs I 'ist. Ich erstelle:
if (!term_exists('footer-nav', 'nav_menu')) {
$menu = wp_insert_term('Footer nav', 'nav_menu', array('slug' => 'footer-nav'));
// Select this menu in the current theme
update_option('theme_mods_'.get_current_theme(), array("nav_menu_locations" => array("primary" => $menu['term_id'])));
// Insert new page
$page = wp_insert_post(array('post_title' => 'Blog',
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'page'));
// Insert new nav_menu_item
$nav_item = wp_insert_post(array('post_title' => 'News',
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'nav_menu_item'));
add_post_meta($nav_item, '_menu_item_type', 'post_type');
add_post_meta($nav_item, '_menu_item_menu_item_parent', '0');
add_post_meta($nav_item, '_menu_item_object_id', $page);
add_post_meta($nav_item, '_menu_item_object', 'page');
add_post_meta($nav_item, '_menu_item_target', '');
add_post_meta($nav_item, '_menu_item_classes', 'a:1:{i:0;s:0:"";}');
add_post_meta($nav_item, '_menu_item_xfn', '');
add_post_meta($nav_item, '_menu_item_url', '');
wp_set_object_terms($nav_item, 'footer-nav', 'nav_menu');
}
Dies scheint zu funktionieren, aber:
- ist es eine robuste und elegante Art, es zu tun?
- Fehlt mir etwas völlig offensichtliches, das all dies in einer Codezeile tun würde?
quelle
Als Ergänzung zu zamoose des anwser, hier ist, wie man einen „würde erstellen Seiten vom Typ“ Menüpunkt (keine „ Benutzerdefiniert “ einen):
Angenommen, Sie kennen nur den Page Slug.
quelle
Ich habe ein paar Probleme mit der akzeptierten Antwort - das macht es nicht falsch, aber ich werde meinen eigenen Code posten, unter dem ich glaube, dass einige Leute ein besseres Ergebnis erzielen, da ich die gleiche Frage hatte, aber das gleiche tun wollte etwas mit weniger Code.
Erstens erzeugt der obige Code Navigationselemente vom Typ "URL", was für einige Leute in Ordnung ist, aber ich möchte auf SEITEN verlinken, nicht auf URLs, da dies ein wichtiges Merkmal von WordPress-Navigationen ist und Clients unvermeidlich Dinge verschieben, so dass ich die URL niemals verwende Navigationselementtyp.
Außerdem wird nur ein flaches Array von untergeordneten Elementen von der Postleitzahl verarbeitet. Ich habe eine Funktion zum rekursiven Deklarieren der neuen Navigationselemente, Speichern der zurückgegebenen Metadaten (hauptsächlich der ID nach dem Erstellen in der Schleife) und einen Parameter zum Akzeptieren von untergeordneten Elementen erstellt.
Einfach bearbeiten
$nav_items_to_add
und der Rest wird rekursiv behandelt. In jedem Array sind 3 Schlüssel erforderlich. Erstens ist der Array-Schlüssel der Slug, also'shop' => array( ... )
das, was Sie für eine Seite mit dem Slug wollenshop
.['title']
ist die Art und Weise, wie das Navigationselement am vorderen Ende beschriftet wird.path
ist der Pfad zu der Seite innerhalb der WordPress-Seitenhierarchie. Dies ist also identisch mit dem Slug, wenn die Seite ein übergeordnetes Element auf oberster Ebene ist undshop
ein untergeordneteshome
Element wäre'path' => 'home/shop'
.Mit dem letzten optionalen Array-Schlüssel
['parent']
können Sie einen anderen Schlüssel im Array als übergeordneten Schlüssel des aktuellen deklarieren. Es ist wichtig zu beachten, dass die Elemente rekursiv hinzugefügt werden, sodass das übergeordnete Element vorhanden sein muss, bevor Sie versuchen, ein untergeordnetes Element zu erstellen. Dies bedeutet, dass die Deklaration für das übergeordnete Navigationselement erfolgen sollte, bevor es untergeordnet ist.quelle
So fügen Sie programmgesteuert einen Menüpunkt hinzu Sie können einhaken, um zu
wp_nav_menu_items
filtern. Platzieren Sie den folgenden Code in der Datei functions.php, um den Menüpunkt Anmelden / Abmelden im Hauptmenü hinzuzufügen. 'Primär' ist der Name / die ID des registrierten Menüs.quelle