Как программно добавить новый пункт меню?
Я разрабатываю плагин и хочу программно добавлять пункты меню.
Когда моя тема создает меню, она использует такой вызов:
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>
. Как мне это сделать?

Перед выводом все пункты меню проходят через фильтр. Вы можете использовать фильтр 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' );

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

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

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

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

Вы можете установить параметр container
в false
и использовать аргумент items_wrap
, чтобы исключить тег ul
. В этом случае функция будет выводить только теги li
, позволяя вам обернуть их в любой необходимый элемент.
wp_nav_menu(
array(
'theme_location' => 'primary',
'items_wrap' => '%3$s',
'container' => false
)
);

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

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

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

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