Как программно добавить новый пункт меню?
Я разрабатываю плагин и хочу программно добавлять пункты меню.
Когда моя тема создает меню, она использует такой вызов:
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 в моей теме, и всё равно безрезультатно.
august7cbfa7b7
Что вы имеете в виду под "ничего не происходит"? Я только что перепроверил, и ссылка на Главную добавляется как первый элемент меню. У вас должно быть определено меню для этого места расположения, а не использоваться fallback на wp_page_menu(). Код точно работает. Другой вопрос, решает ли он вашу проблему, потому что я не совсем понял, о чем вы спрашивали.
helgatheviking
Я отредактировал код, чтобы добавить ссылку на главную в конец меню, но принцип WordPress остаётся тем же.
helgatheviking
Это не работало, потому что у меня не было пользовательского меню. После того как я создал своё меню, всё заработало. Спасибо
august7cbfa7b7
Вы можете установить параметр 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 уже выводит конец меню
august7cbfa7b7
вам нужно создать меню и назначить его в расположение темы, полагаю вы этого не сделали. протестировано и работает с последней версией WordPress и темой TwentyThirteen.
Milo
Я использую стандартную тему WordPress (twentytwelve) и пытаюсь изменить верхнее меню темы. Меню появляется в итоговом HTML со ссылками на мои страницы как пункты меню, но мне нужно программно добавить свой собственный пункт меню.
august7cbfa7b7
вы создали меню в разделе Внешний вид > Меню и назначили его для этой области темы?
Milo