Festcodieren von benutzerdefinierten Menüelementen

22

Gibt es eine Möglichkeit, die benutzerdefinierten Menüelemente bei der Installation des ersten Themas fest zu codieren? Ich erstelle ein Thema, das bei der Installation automatisch einige allgemeine Seiten erstellt. Ich muss also wissen, ob ich sie auch zum benutzerdefinierten Wordpress-Menü hinzufügen kann, damit der Client sie nicht manuell hinzufügen muss.

Mit anderen Worten: Wie kann ein benutzerdefiniertes Menüelement programmgesteuert eingefügt / erstellt werden?

Lassen Sie mich wissen, wenn etwas unklar ist. Leitfaden zur entsprechenden Codex-Seite ist willkommen. Vielen Dank!


Update: Code von hier aus ausprobiert. Spezifisches Menü mit wp_nav_menu_items anvisieren

Menü Registrierung:

function register_my_menus() {
  register_nav_menus(
    array('main-menu' => __( 'Main Menu' ) )
  );
}

add_action( 'init', 'register_my_menus' );

Vorlage verwenden:

<?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?>

Code zum Hinzufügen neuer Elemente:

function new_nav_menu_items($items) {
    if( $args->theme_location == 'main-menu' ){
    $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
    $items = $homelink . $items;
    return $items;
    }
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

Beim Hinzufügen des Codes zum Hinzufügen neuer Elemente zum functions.phpNavigationsmenü in der Datei geschieht auf der Menüseite im Admin-Bereich nichts, aber die aktuellen Menüelemente werden nicht mehr angezeigt.

Sisir
quelle

Antworten:

23

Das Problem mit Ihrem Code ist, dass er die Links nicht zum Menü und nur zur Menüausgabe hinzufügt, daher die Verwendung eines Filters (add_filter), sodass Sie nur die Ausgabe des Menüs filtern, selbst wenn Sie dies nicht tun In einem Menü wird Ihr Link mit dem von Ihnen verwendeten Code angezeigt. Aber um einen Link zu erstellen und ihn einem Menü hinzuzufügen, können Sie diesen Code verwenden:

$run_once = get_option('menu_check');
if (!$run_once){
    //give your menu a name
    $name = 'theme default menu';
    //create the menu
    $menu_id = wp_create_nav_menu($name);
    //then get the menu object by its name
    $menu = get_term_by( 'name', $name, 'nav_menu' );

    //then add the actuall link/ menu item and you do this for each item you want to add
    wp_update_nav_menu_item($menu->term_id, 0, array(
        'menu-item-title' =>  __('Home'),
        'menu-item-classes' => 'home',
        'menu-item-url' => home_url( '/' ), 
        'menu-item-status' => 'publish'));

    //then you set the wanted theme  location
    $locations = get_theme_mod('nav_menu_locations');
    $locations['main-menu'] = $menu->term_id;
    set_theme_mod( 'nav_menu_locations', $locations );

    // then update the menu_check option to make sure this code only runs once
    update_option('menu_check', true);
}

Ich habe alles kommentiert, um es einfacher zu machen.

Um eine untergeordnete Seite / untergeordnete Seite / ein Menü der zweiten Ebene zu erstellen (wie auch immer Sie es aufrufen mögen), müssen Sie menu-item-parent-idim neuen Element nur Folgendes festlegen :

//create the top level menu item (home)
$top_menu = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Home'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => 0,
    ));
//Sub menu item (first child)
$first_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('First_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $top_menu,
    ));
//Sub Sub menu item (first child)
$Second_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Second_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $first_child,
    ));

Sie können auch die Position per Code mit setzen menu-item-position und ich denke, es ist so gemacht:

  • Erster Punkt - 'Menüpunkt-Position' => 1
    • Erster Punkt erstes Kind - 'Menüpunkt-Position' => 1
    • Erster Punkt zweites Kind - 'Menüpunkt-Position' => 1
      • Erster Punkt zweites Kind erstes Kind - 'Menüpunkt-Position' => 1
  • Zweiter Punkt - 'Menüpunkt-Position' => 2
  • 3. Punkt - 'Menüpunkt-Position' => 3
  • 4. Punkt - 'Menüpunkt-Position' => 4
Bainternet
quelle
Das sind die Funktionen, nach denen ich gesucht habe :) Der Codex enthält diese nicht :( Noch eine Frage: Wie kann ich ein untergeordnetes Element zum Home-Element hinzufügen? Ich werde Sie benachrichtigen, sobald ich meinen PC erreiche. Danke!
Sisir
@ Sisir: Ich habe mit einem Beispiel aktualisiert, wie man
untergeordnete
@Bainternet: Beim ersten Ausführen des Codes ist dieser Fehler aufgetreten Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25. Aber das Menü wird erstellt und wenn die Seite aktualisiert wird, funktioniert alles, aber im Appearance -> Menu Theme LocationAbschnitt wird nichts angezeigt . Wir sind wirklich nah dran :) Danke!
Sisir
@Bainternet: Ich vermute, dass der Code beim Versuch, den Code auszuführen, einen Fehler erhält. $locations = get_theme_mod('nav_menu_locations');Daher werden die Codes davor (das Einfügen des gesamten Menüs ist abgeschlossen) ausgeführt und der Code danach (Festlegen des gewünschten Speicherorts für das Thema) wird nicht ausgeführt .
Sisir
@Sisir: Der Code funktioniert einwandfrei. Wie lautet Ihr Name für den Themenort? Zeigen Sie mir den genauen Code, den Sie verwenden. Ich werde sehen, ob ich helfen kann.
Bainternet
8

Ihr ursprünglicher Code ist dem Geld sehr nahe und ich denke ernsthaft, dass die langwierige Lösung von @Bainternet (keine Beleidigung) übertrieben ist. Schauen Sie sich stattdessen Folgendes an:

function new_nav_menu_items($items, $args) {
    if( $args->theme_location == 'primary' ){
        $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
        $items = $homelink . $items;
    }
    return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

Ihr einziges Problem war, dass Sie $ items nicht zurückgaben , nachdem die Funktion das richtige Menü überprüft hatte, und Ihnen das zweite Rückrufargument fehlte, das für die Überprüfung erforderlich war ( $ args ).

Foxinni
quelle
Wie würden Sie die Position des Menüelements mit dieser Methode festlegen?
Michael N
1

In Wordpress 3.4.2 gibt es einen Fehler:

https://github.com/WordPress/WordPress/commit/ae96b842f9f55ecfb22da705a4902b9d25580259#wp-includes/nav-menu.php

Sie müssen die Termbeziehung manuell erstellen:

$menu = wp_get_nav_menu_object('top menu');
$id = wp_update_nav_menu_item($menu->term_id, 0, $data);

if ($menu->term_id && (!is_object_in_term($id, 'nav_menu', (int)$menu->term_id))) {
    wp_set_post_terms($id, array((int)$this->id), 'nav_menu');
}

Unter https://gist.github.com/4148529 finden Sie ein Beispiel für die Menüklasse zur einfachen Menüerstellung.

OzzyCzech
quelle
0

Zur Information muss der aktuelle Benutzer Rechte zum Hinzufügen von Begriffen haben. Meine menu_items wurden erstellt, aber nicht in der Tabelle wp_terms_relationship hinzugefügt, bevor ich wp_set_current_user (1) aufrufe.

Grégocentrique
quelle