Изменение URL пунктов меню

12 мар. 2014 г., 17:47:04
Просмотры: 18.1K
Голосов: 2

Я создаю одностраничный сайт и использую только якоря (#) для пунктов главного меню.

Теперь мне нужно добавить вторую страницу на сайт, сохранив то же меню.

Я использую тему roots. Меню строится с помощью:

wp_nav_menu(array('theme_location' => 'primary_navigation')); 

Но как изменить URL пунктов меню с, например, #contact на mywebsite.com.br/#contact только для этой второй страницы?

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

Пожалуйста, покажите код. Как вы создаете ссылки? Вручную? Используете пользовательскую функцию? Используете wp_nav_menu?

gdaniel gdaniel
12 мар. 2014 г. 17:54:45

Во-первых, я использую тему roots. Затем я создаю меню с помощью wp_nav_menu(array('theme_location' => 'primary_navigation'));

marcelo2605 marcelo2605
12 мар. 2014 г. 17:56:33
Все ответы на вопрос 3
3

В вашем шаблоне вы можете проверить, находитесь ли вы на главной странице или нет, и затем вывести другое меню.

Например:

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, если вы не на главной странице сайта. В противном случае он просто возвращает обычное меню. Используя этот метод, вам не нужно создавать второе меню в админке.

12 мар. 2014 г. 18:05:18
Комментарии

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

marcelo2605 marcelo2605
12 мар. 2014 г. 18:41:38

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

gdaniel gdaniel
12 мар. 2014 г. 18:43:17

Это так полезно, даже для моих совершенно других задач, спасибо @gdaniel!

physalis physalis
25 нояб. 2014 г. 00:27:42
0

Если ваше меню содержит пользовательские якорные ссылки И ссылки на страницы (например, на вторую страницу, главную, импринт или что-то ещё), функция 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);

Спасибо за все ваши мысли

6 мар. 2018 г. 16:25:02
0

Я использовал модифицированную версию решения 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

1 июн. 2017 г. 12:00:33