Как Жесткий Код Пользовательских пунктов меню

22

Есть ли способ, которым я могу жестко закодировать пользовательские пункты меню, когда первая тема установлена? Я создаю тему, которая автоматически сделает некоторые общие страницы при установке. Поэтому мне нужно знать, могу ли я добавить их в пользовательское меню Wordpress, чтобы клиенту не нужно было добавлять их вручную?

Другими словами: как программно вставить / создать пользовательский пункт меню?

Дайте мне знать, если что-то неясно. Руководство по соответствующей странице кодекса приветствуется. Благодарность!


обновление: пробовал код отсюда Ориентация на определенное меню с помощью wp_nav_menu_items

Регистрация в меню:

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

add_action( 'init', 'register_my_menus' );

Использование шаблона:

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

Код для добавления новых предметов:

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

при добавлении кода для добавления новых пунктов в навигационное меню в functions.phpфайле ничего не происходит на странице меню в админ-панели, но текущие пункты меню пропадают на сайте!

Sisir
источник

Ответы:

23

Проблема с вашим кодом в том, что он фактически не добавляет ссылки на меню и только к выводу меню, поэтому используется фильтр (add_filter), поэтому вы просто фильтруете выходные данные меню, даже если вы этого не делаете. есть меню, ваша ссылка будет отображаться с кодом, который вы используете. Но чтобы создать ссылку и добавить ее в меню, вы можете использовать этот код:

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

Я прокомментировал все, чтобы сделать это проще.

Чтобы создать дочернюю страницу / подстраницу / меню второго уровня (как бы вы это ни называли), вам просто нужно установить menu-item-parent-idв новом пункте, например:

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

Также вы можете установить позицию с помощью кода, menu-item-position и я думаю, что это сделано так:

  • Первый пункт - 'menu-item-position' => 1
    • Первый элемент первый дочерний - 'menu-item-position' => 1
    • Первый элемент, второй дочерний элемент - 'menu-item-position' => 1
      • Первый элемент второй дочерний первый дочерний - 'menu-item-position' => 1
  • Второй пункт - 'menu-item-position' => 2
  • 3-й пункт - 'menu-item-position' => 3
  • 4-й пункт - 'menu-item-position' => 4
Bainternet
источник
Это те функции, которые я искал :). Кодекс не включает их :( Еще один вопрос, как я могу добавить дочерний элемент в элемент Home. Я сообщу вам, как только доберусь до своего компьютера. Спасибо!
Сисир
@Sisir: я обновил с примером, как создать дочерние страницы
Bainternet
@Bainternet: получил эту ошибку при первом запуске кода Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25. Но меню создается, и когда страница обновляется, все работает, но в Appearance -> Menu Theme Locationразделе ничего не отображается . Мы очень близки :) Спасибо!
Сисир
@Bainternet: я предполагаю, что код получает ошибку при попытке запустить код $locations = get_theme_mod('nav_menu_locations');Итак, коды до этого (вставка всего меню выполнена) выполняются, а код после этого (задайте местоположение нужной темы) не выполняются ,
Сисир
@Sisir: код работает просто отлично, каково название вашей темы и покажите мне точный код, который вы используете, я посмотрю, смогу ли я помочь.
Bainternet
8

Ваш оригинальный код очень близок к деньгам, и я серьезно думаю, что это длинное решение от @Bainternet (без обид) излишне, поэтому взгляните на это:

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

Ваша единственная проблема состояла в том, что вы не возвращали $ items после того, как функция проверила правильность меню, и вы пропустили второй аргумент обратного вызова, необходимый для проверки ( $ args ).

Foxinni
источник
Как бы вы установили расположение пункта меню, используя этот метод?
Майкл N
1

В Wordpress 3.4.2 есть ошибка:

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

Вам необходимо создать термин отношения вручную:

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

См. Https://gist.github.com/4148529 пример класса Menu для простого создания меню.

OzzyCzech
источник
0

Для информации, текущий пользователь должен получить права на добавление терминов, мои menu_items были созданы, но не добавлены в таблицу wp_terms_relationship, прежде чем я добавлю вызов wp_set_current_user (1);

Grégocentrique
источник