Изменение URL пунктов меню
Я создаю одностраничный сайт и использую только якоря (#) для пунктов главного меню.
Теперь мне нужно добавить вторую страницу на сайт, сохранив то же меню.
Я использую тему roots. Меню строится с помощью:
wp_nav_menu(array('theme_location' => 'primary_navigation'));
Но как изменить URL пунктов меню с, например, #contact на mywebsite.com.br/#contact только для этой второй страницы?
В вашем шаблоне вы можете проверить, находитесь ли вы на главной странице или нет, и затем вывести другое меню.
Например:
if(is_front_page() || is_home()){
wp_nav_menu(array('theme_location' => 'primary_navigation'));
}else{
wp_nav_menu(array('theme_location' => 'secondary_navigation'));
}
Вам также необходимо зарегистрировать второе местоположение меню в файле functions.php (если это еще не сделано).
Чтобы зарегистрировать новое местоположение меню:
function register_my_menus() {
register_nav_menus(array(
'secondary-location' => __('Дополнительное местоположение'),
));
}
add_action( 'init', 'register_my_menus' );
Недостаток в том, что вам придется управлять двумя меню в админке. Это может быть проблемой, если меню часто меняется, так как вам нужно будет обновлять два меню.
Вместо этого вы можете отфильтровать wp_nav_menu и изменить URL перед выводом меню. Например, этот код можно добавить в functions.php
function change_menu($items){
if(!is_front_page()){
foreach($items as $item){
$item->url = get_bloginfo("url") . "/" . $item->url;
}
}
return $items;
}
add_filter('wp_nav_menu_objects', 'change_menu');
Код выше фильтрует wp_nav_menu_object. Он добавляет полный URL, если вы не на главной странице сайта. В противном случае он просто возвращает обычное меню. Используя этот метод, вам не нужно создавать второе меню в админке.

Спасибо. Значит, используя wp_nav_menu, я не могу добавить строку к URL?

Я только что обновил свой ответ. Вы можете использовать фильтр для изменения URL перед его выводом.

Если ваше меню содержит пользовательские якорные ссылки И ссылки на страницы (например, на вторую страницу, главную, импринт или что-то ещё), функция change_menu от gdaniels сломает эти ссылки на страницы, когда вы не находитесь на главной странице. Это проблема, с которой столкнулся boywonder, так как функция 'change_menu' добавляет URL сайта ко всем ссылкам в меню. Но с функцией boywonder 'lb_menu_anchors' вы получите обновление страницы на главной при переключении между якорными ссылками. Чтобы избежать этого, lb_menu_anchors должна выполняться только тогда, когда текущая страница не является главной:
function lb_menu_anchors($items, $args) {
// текущая страница НЕ главная?
if(!is_front_page()){
// перебираем объекты меню (ссылки)
foreach ($items as $key => $item) {
// проверяем, начинается ли ссылка с '#'
if ($item->object == 'custom' && substr($item->url, 0, 1) == '#') {
// если да, добавляем site_url к ссылке
$item->url = site_url() . $item->url ;
}
}
// возвращаем изменённые ссылки
return $items;
}
else {
// возвращаем неизменённые ссылки, если текущая страница - главная
return $items;
}
}
add_filter('wp_nav_menu_objects', 'lb_menu_anchors', 10, 2);
Спасибо за все ваши мысли

Я использовал модифицированную версию решения gdaniel, но недавно столкнулся с проблемой, когда при использовании пользовательских ссылок в меню для указания на внешние ресурсы, URL сайта автоматически добавлялся к внешней ссылке.
Следующий код должен работать, если вам нужно модифицировать якорные ссылки, но не изменять внешние ссылки.
function lb_menu_anchors($items, $args) {
foreach ($items as $key => $item) {
if ($item->object == 'custom' && substr($item->url, 0, 1) == '#') {
$item->url = site_url() . $item->url;
}
}
return $items;
}
add_filter('wp_nav_menu_objects', 'lb_menu_anchors', 10, 2);
Все заслуги принадлежат laubsterboy и faye: https://laubsterboy.com/blog/2014/09/wordpress-menu-anchor/ https://laubsterboy.com/blog/2014/09/wordpress-menu-anchor/#comment-35170
