it-swarm.com.de

Festcodieren von benutzerdefinierten Menüelementen

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: Versuchter Code von hier Targeting spezifisches Menü mit wp_nav_menu_items

Menüregistrierung:

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

add_action( 'init', 'register_my_menus' );

Verwendung der Vorlage:

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

wenn Sie den Code zum Hinzufügen neuer Elemente im Navigationsmenü in der functions.php-Datei hinzufügen, geschieht nichts auf der Menüseite im Admin-Bereich, aber die aktuellen Menüelemente sind in der Site verschwunden!

22
Sisir

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 ein Menü für untergeordnete Seiten/Unterseiten/zweite Ebenen zu erstellen (wie auch immer Sie es aufrufen mögen), müssen Sie nur den menu-item-parent-id im neuen Element festlegen, zum Beispiel:

//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 die Position auch durch Code mit menu-item-position setzen, 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
23
Bainternet

Dein ursprünglicher Code ist sehr nah am Geld und ich denke ernsthaft, dass die so lange Lösung von @Bainternet (keine Beleidigung) übertrieben ist, also schau dir 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 ).

7
Foxinni

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.

1
OzzyCzech

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.

0
Grégocentrique