Jak ustalić niestandardowe elementy menu na stałe

22

Czy jest jakiś sposób, aby zakodować na stałe niestandardowe elementy menu po zainstalowaniu pierwszego motywu? Tworzę motyw, który po zainstalowaniu automatycznie tworzy wspólne strony. Więc muszę wiedzieć, czy mogę dodać je również do niestandardowego menu Wordpress, aby klient nie musiał dodawać ich ręcznie?

Innymi słowy: jak programowo wstawiać / tworzyć niestandardowe pozycje menu?

Daj mi znać, jeśli coś będzie niejasne. Przewodnik po odpowiedniej stronie kodeksu jest mile widziany. Dzięki!


aktualizacja: wypróbowano stąd kod Kierowanie na określone menu za pomocą wp_nav_menu_items

Rejestracja w menu:

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

add_action( 'init', 'register_my_menus' );

Zastosowanie szablonu:

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

Kod dodawania nowych elementów:

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

podczas dodawania kodu do dodawania nowych elementów w menu nawigacyjnym w functions.phppliku pojawiają się informacje na stronie menu w panelu administracyjnym, ale bieżące elementy menu zniknęły na stronie!

Sisir
źródło

Odpowiedzi:

23

Problem z twoim kodem polega na tym, że tak naprawdę nie dodaje on linków do menu i tylko do wyjścia menu, stąd użycie filtra (add_filter), więc po prostu filtrujesz wyjście menu, nawet jeśli nie mieć menu, w którym link będzie wyświetlany z kodem, którego używasz. Ale aby utworzyć link i dodać go do menu, możesz użyć tego kodu:

$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);
}

Skomentowałem wszystko, aby uprościć.

Aby utworzyć stronę podrzędną / podstronę / menu drugiego poziomu (jakkolwiek możesz to nazwać), wystarczy ustawić menu-item-parent-idw nowym elemencie na przykład:

//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,
    ));

również możesz ustawić pozycję za pomocą kodu menu-item-position i myślę, że zrobiono to w następujący sposób:

  • Pierwszy element - „menu-item-position” => 1
    • Pierwszy element pierwsze dziecko - „menu-item-position” => 1
    • Pierwszy element drugi element podrzędny - „menu-item-position” => 1
      • Pierwszy element drugie dziecko pierwsze dziecko - „menu-item-position” => 1
  • Drugi element - „pozycja-menu-pozycja” => 2
  • 3. pozycja - „pozycja menu-pozycja” => 3
  • Czwarta pozycja - „pozycja-menu-pozycja” => 4
Bainternet
źródło
Oto funkcje, których szukałem :) kodeks nie obejmuje :( Jeszcze jedno pytanie, jak mogę dodać element potomny do elementu domowego. Dam ci znać, jak tylko wejdę na komputer. Dzięki!
Sisir
@Sisir: zaktualizowałem przykład tworzenia stron podrzędnych
Bainternet,
@Bainternet: dostał ten błąd przy pierwszym uruchomieniu kodu Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25. Ale menu jest tworzone i po odświeżeniu strony wszystko działa, ale nic nie pokazuje w Appearance -> Menu Theme Locationsekcji. Jesteśmy bardzo blisko :) Dzięki!
Sisir
@Bainternet: Domyślam się, że kod pojawia się błąd, gdy próbuje uruchomić kod. $locations = get_theme_mod('nav_menu_locations');Więc kody przed tym (wszystkie wstawianie menu są wykonane) są wykonywane, a kod po tym (ustaw żądaną lokalizację motywu) nie jest wykonywany .
Sisir
@Sisir: kod działa dobrze, jaka jest nazwa lokalizacji motywu i pokaż mi dokładnie używany kod, zobaczę, czy mogę pomóc.
Bainternet
8

Twój oryginalny kod jest bardzo zbliżony do pieniędzy i myślę, że to długie rozwiązanie @Bainternet (bez obrazy) jest przesadą, więc spójrz na to:

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

Twój jedyny problem polegał na tym, że nie zwracałeś $ pozycji po sprawdzeniu poprawności menu przez funkcję i brakowało drugiego argumentu wywołania zwrotnego, który był potrzebny do sprawdzenia ( $ args ).

Foxinni
źródło
Jak ustawiłbyś położenie pozycji menu za pomocą tej metody?
Michael N
1

W Wordpress 3.4.2 występuje błąd:

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

Musisz ręcznie utworzyć relację terminu:

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

Zobacz https://gist.github.com/4148529, aby zobaczyć przykład klasy Menu do łatwego tworzenia menu.

OzzyCzech
źródło
0

Aby uzyskać informacje, aktualny użytkownik musi mieć uprawnienia do dodawania warunków, moje elementy menu zostały utworzone, ale nie zostały dodane do tabeli wp_terms_relationship, zanim dodam wywołanie do wp_set_current_user (1);

Grégocentrique
źródło