Как программно добавить новый пункт меню?

5 нояб. 2013 г., 17:10:32
Просмотры: 23.3K
Голосов: 8

Я разрабатываю плагин и хочу программно добавлять пункты меню.

Когда моя тема создает меню, она использует такой вызов:

wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) );

Что приводит к такому HTML-коду:

<div class="nav-menu"><ul>
     <li class="current_page_item"><a href="somewhere">пункт-меню-1</a></li>
     <li class="page_item page-item-107"><a href="somewhere-else">пункт меню 2</a></li>
</ul></div>

Я хочу каким-то образом перехватить это и программно вставить свой собственный HTML-код перед закрывающим тегом </ul>. Как мне это сделать?

1
Комментарии

Подробный блог: http://goo.gl/TbxqDy

Suresh Kamrushi Suresh Kamrushi
30 сент. 2015 г. 08:27:03
Все ответы на вопрос 2
5
20

Перед выводом все пункты меню проходят через фильтр. Вы можете использовать фильтр wp_nav_menu_items, чтобы добавить элементы в меню:

// Фильтр для wp_nav_menu() для добавления дополнительных ссылок и другого вывода
function new_nav_menu_items($items) {
    $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
    // добавляем ссылку на главную в конец меню
    $items = $items . $homelink;
    return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items' );

Или, чтобы быть более конкретным, вы можете нацелиться только на нужное меню, заменив строку add_filter из предыдущего примера следующим кодом, и заменив $menu->slug на фактическое имя слага вашего меню:

add_filter( 'wp_nav_menu_{$menu->slug}_items', 'new_nav_menu_items' );

Источник

5 нояб. 2013 г. 18:06:24
Комментарии

Спасибо, но ничего не происходит. Я даже попробовал вставить ваш код дословно прямо перед вызовом wp_nav_menu в моей теме, и всё равно безрезультатно.

august7cbfa7b7 august7cbfa7b7
5 нояб. 2013 г. 18:31:44

Что вы имеете в виду под "ничего не происходит"? Я только что перепроверил, и ссылка на Главную добавляется как первый элемент меню. У вас должно быть определено меню для этого места расположения, а не использоваться fallback на wp_page_menu(). Код точно работает. Другой вопрос, решает ли он вашу проблему, потому что я не совсем понял, о чем вы спрашивали.

helgatheviking helgatheviking
5 нояб. 2013 г. 18:48:23

Я отредактировал код, чтобы добавить ссылку на главную в конец меню, но принцип WordPress остаётся тем же.

helgatheviking helgatheviking
5 нояб. 2013 г. 18:50:40

Это не работало, потому что у меня не было пользовательского меню. После того как я создал своё меню, всё заработало. Спасибо

august7cbfa7b7 august7cbfa7b7
5 нояб. 2013 г. 20:00:48

Если вы спрашивали, как добавить ссылки в меню, и этот ответ помог, то следует принять его как решение.

helgatheviking helgatheviking
5 нояб. 2013 г. 23:08:20
5

Вы можете установить параметр container в false и использовать аргумент items_wrap, чтобы исключить тег ul. В этом случае функция будет выводить только теги li, позволяя вам обернуть их в любой необходимый элемент.

wp_nav_menu(
    array(
        'theme_location' => 'primary',
        'items_wrap' => '%3$s',
        'container' => false
    )
);
5 нояб. 2013 г. 17:23:20
Комментарии

Спасибо, но это только меняет <div class="nav-menu">...</div> на <div class="menu">...</div> Так что я все еще не могу добавить свой контент, потому что WordPress уже выводит конец меню

august7cbfa7b7 august7cbfa7b7
5 нояб. 2013 г. 18:29:11

вам нужно создать меню и назначить его в расположение темы, полагаю вы этого не сделали. протестировано и работает с последней версией WordPress и темой TwentyThirteen.

Milo Milo
5 нояб. 2013 г. 18:40:02

Я использую стандартную тему WordPress (twentytwelve) и пытаюсь изменить верхнее меню темы. Меню появляется в итоговом HTML со ссылками на мои страницы как пункты меню, но мне нужно программно добавить свой собственный пункт меню.

august7cbfa7b7 august7cbfa7b7
5 нояб. 2013 г. 18:46:37

вы создали меню в разделе Внешний вид > Меню и назначили его для этой области темы?

Milo Milo
5 нояб. 2013 г. 18:52:43

ОК, теперь работает после того как я создал пользовательское меню. Большое спасибо!

august7cbfa7b7 august7cbfa7b7
5 нояб. 2013 г. 19:59:50