Як зробити жорсткий код


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

при додаванні коду для додавання нових елементів у меню nav у functions.phpзаписі файлів відбувається на сторінці меню на панелі адміністратора, але поточні пункти меню відсутній на сайті!

Відповіді:


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 і я думаю, що це зроблено так:

  • Перший пункт - 'меню-пункт-позиція' => 1
    • Перший елемент перша дитина - 'меню-пункт-позиція' => 1
    • Перший пункт другої дитини - 'меню-пункт-позиція' => 1
      • Перший пункт, друга дитина, перша дитина - 'меню-пункт-позиція' => 1
  • Другий пункт - 'меню-пункт-позиція' => 2
  • 3-й пункт - 'меню-пункт-позиція' => 3
  • 4-й пункт - 'меню-пункт-позиція' => 4

Це ті функції, які я шукав :) codex не включає ці :( Ще одне питання, як я можу додати дочірній елемент до домашнього предмета. Я повідомлю вас, як тільки я
дістанусь

@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розділі нічого не відображається . Ми дійсно близькі :) Дякую!
Sisir

@Bainternet: Я гадаю, що в коді виникає помилка при спробі запуску коду. $locations = get_theme_mod('nav_menu_locations');Отже, коди до цього (все вставлення меню виконано) виконуються, а код після цього (встановлення потрібного місця розташування) не виконується .
Sisir

@Sisir: код працює чудово, як називається ваше місце розташування теми та покажіть мені точний код, який ви використовуєте, я побачу, чи можу я допомогти.
Бейнтернет

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

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


Як би ви встановили розташування пункту меню за допомогою цього методу?
Майкл 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 для простого створення меню.


0

Для інформації, поточний користувач повинен отримати права на додавання термінів, мої меню_items були створені, але не додані до таблиці wp_terms_relationship до того, як я додаю виклик до wp_set_current_user (1);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.