Как сделать пункт меню верхнего уровня без ссылки, но с связанными подменю?

5 окт. 2011 г., 05:47:46
Просмотры: 229K
Голосов: 37

Я создаю горизонтальное меню, и некоторые пункты этого меню будут иметь выпадающие списки (подменю), а некоторые нет. Те пункты, которые имеют подменю, на самом деле не являются страницами. Они предназначены только для организации выпадающих списков.

Например, допустим, горизонтальное меню выглядит следующим образом:

Главная | О нас | Продукты | Направления | Контакты

И пункт меню "продукты" должен иметь 3 связанные страницы в вертикальном выпадающем списке под ним, поэтому сам "продукты" фактически не представляет страницу, как это можно реализовать в WordPress?

(Я использую WordPress как CMS, со статической главной страницей и внутренними страницами. Я создаю собственные шаблоны, стилизую меню в CSS, затем регистрирую меню в functions.php и вызываю их в шаблонах.) В WordPress вы добавляете записи в меню через список страниц или через произвольные ссылки. Но я не хочу, чтобы "продукты" были со ссылкой. Если я не добавлю ссылку в произвольную ссылку, система не позволит мне добавить её в меню.

Можно ли это сделать через административную панель меню или нужно использовать другой подход?

Спасибо за любую помощь!

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

Вот решение, которое отлично работает, проверьте его http://wordpress.org/support/topic/no-page-menu-item

User User
10 мар. 2014 г. 11:30:11

Вы можете сделать это с помощью JavaScript. Попробуйте эту статью. http://www.kvcodes.com/2014/07/make-menu-link-wordpress-without-adding-page/

Kvvaradha Kvvaradha
16 февр. 2016 г. 06:50:58

Оставьте поле URL пустым.

AMY WANG AMY WANG
11 июл. 2018 г. 20:03:45

Никто не упомянул класс WP_NAV_MENU_WALKER, но вы можете написать свой собственный walker, который будет выводить нужную вам разметку.

user3135691 user3135691
18 сент. 2018 г. 22:24:13
Все ответы на вопрос 18
6
35

Самый простой способ сделать это без плагинов — использовать функцию "Меню" в WordPress. Вот инструкция для WordPress 4.8:

  1. В админке WordPress перейдите в раздел "Внешний вид → Меню"
  2. Во вкладке "Редактировать меню" выберите "Произвольные ссылки"
  3. В поле "URL" введите "#" (без кавычек)
  4. В поле "Текст ссылки" введите желаемый текст для верхнего уровня выпадающего меню
  5. Нажмите кнопку "Добавить в меню"
  6. Перетащите пункт меню в нужное положение внутри вашего меню
  7. Для только что добавленного пункта меню нажмите на стрелку вниз справа от пункта (слева от него будет написано "произвольная ссылка")
  8. Удалите символ "#" из URL. Это преобразует ссылку в обычный текст во всех браузерах.
  9. Нажмите кнопку "Сохранить меню"
5 окт. 2011 г. 06:02:37
Комментарии

Спасибо за совет. Это просто, хотя и не идеально, так как метки все еще выглядят как "ссылки" при наведении курсора, но никуда не ведут. Так что в крайнем случае это сработает.

PVA PVA
6 окт. 2011 г. 00:15:47

Ты прочитал весь комментарий? После добавления ссылки нажми на стрелку выпадающего списка рядом с именем ссылки и удали "#" из текстового поля URL. Это во всех браузерах сделает ссылку некликабельной.

GavinR GavinR
6 окт. 2011 г. 16:10:58

Да, спасибо, я прочитал весь комментарий. Я вернулся и попробовал снова, и понял свою проблему. Когда я оставляю #, слово появляется в навигационной панели, но как "мертвая ссылка". Когда я удалил #, слово не отображалось в навигационной панели, пока я не навел на него курсор, и тогда оно появлялось в состоянии наведения. Так что я предполагаю, что мне нужно применить CSS к этому слову, чтобы оно отображалось без привязки к ссылке. Не уверен, почему появляется состояние наведения...

PVA PVA
7 окт. 2011 г. 01:13:54

Это всё ещё актуально в версии 4.9.5, однако я не уверен, так как это больше похоже на хак, использующий баг. Если это не так... это избавит многих от головной боли... Это чем-то похоже на то, что WordPress считает "1 2 3 4 5 6" надёжным паролем... до сих пор.

brooklynsweb brooklynsweb
22 мая 2018 г. 19:52:43

К вашему сведению, если вы выполните Шаг 8 (по какой-то веской причине), то курсор не будет превращаться в указатель при наведении на пользовательскую ссылку. В этом случае вы можете стилизовать его с помощью pointer:cursor.

Kalnode Kalnode
17 нояб. 2018 г. 04:57:52

Да, ссылка не кликабельна при использовании этого метода, но текст всё ещё обёрнут в тег anchor, что семантически неверно!

Lovor Lovor
27 авг. 2020 г. 23:29:15
Показать остальные 1 комментариев
4
16

У меня есть несколько идей:

  1. Установить пользовательскую ссылку на #, которая ничего не возвращает
  2. Добавить пользовательский класс к элементам, а затем использовать jQuery для удаления ссылок.
  3. Использовать PHP-эквивалент метода jQuery
  4. Использовать плагин Disable Parent Menu Link (или разобрать его и написать свой собственный)
5 окт. 2011 г. 05:59:28
Комментарии

Спасибо за советы и ссылки! Как предложил Гэвин, использование # для пользовательской ссылки "работает"; другие варианты могут работать лучше, но они не такие простые. Ну, плагин, вероятно, простой, но я не люблю использовать плагины, если могу добиться того же более прямым способом. Мне придётся выбрать лучший подход. Ещё раз спасибо!

PVA PVA
6 окт. 2011 г. 00:17:11

Если вы планируете использовать это на тактильных устройствах, будьте осторожны с использованием пустого href="", потому что большинство пользователей тактильных устройств не смогут увидеть выпадающее меню без использования JS

Simon Simon
21 нояб. 2013 г. 17:05:32

Ссылки ломаются. Возможно, вам стоит включить некоторые из этих идей в свой ответ

shea shea
13 мая 2015 г. 04:33:10

Также, пункты #2 и #3 относятся к wp_list_pages(), а не к wp_nav_menu()

shea shea
13 мая 2015 г. 04:34:32
1
10

Самый простой метод, который я придумал, — это создать пункт меню "Произвольная ссылка" со значением URL-адреса #. Это отправляет пользователя к пустому хэшу на той же странице, то есть фактически никуда не ведет.

Однако у использования пустых хэшей для заглушек ссылок есть побочные эффекты. Ссылка все равно будет отображаться и вести себя как ссылка, что может сбить пользователя с толку, когда он кликает на то, что выглядит как ссылка, но ничего не происходит. Другой эффект заключается в том, что клик по ссылке с пустым хэшем перезапишет любой существующий хэш, отправляя пользователя в начало страницы. Это может быть не так критично для меню, которое и так находится вверху страницы, но довольно раздражает, когда страница неожиданно прыгает, особенно если это меню в подвале сайта.

Решение — комбинировать метод с пустым хэшем с фрагментом кода, который обнаруживает такие ссылки в меню и полностью удаляет атрибут href из этих ссылок. Элемент a без атрибута href — это правильный метод в HTML 5 для создания заглушки ссылки.

/**
 * Удаляет атрибут href из пустых ссылок `<a href="#">` в навигационных меню
 * @param string $menu текущий HTML меню
 * @return string измененный HTML меню
 */
add_filter( 'wp_nav_menu_items', function ( $menu ) {
    return str_replace( '<a href="#"', '<a', $menu );
} );
27 сент. 2014 г. 14:00:03
Комментарии

Вы можете изменить даже весь тег a: <?php add_filter( 'wp_nav_menu_items', function ( $menu ) { return str_replace( ['<a href="#"', '/a>'], ['<span', '/span>'], $menu ); } ); ?>. Только не забудьте добавить выпадающее меню с помощью css или js.

quasi quasi
2 апр. 2020 г. 15:54:08
2

Это сработало для меня:

Я активировал CSS Классы в разделе Меню > Настройки экрана > CSS Классы. Затем я назначил элементу меню, который хотел деактивировать, класс ".nolink" и добавил этот код в панель пользовательского CSS:

.nolink {
   pointer-events: none; /* Отключает события мыши */
   cursor: default; /* Устанавливает курсор по умолчанию */
}
14 окт. 2016 г. 00:37:31
Комментарии

Это также отключает выпадающие меню.

user385917 user385917
28 июн. 2017 г. 21:06:59

Использование # в качестве цели ссылки с последующим применением пользовательского CSS-класса для стилизации, на мой взгляд, является наименее костыльным решением. Однако установка pointer-events: none не кажется мне логичной, так как это сломает подменю. Не могли бы вы пояснить, зачем вы установили этот атрибут?

user1438038 user1438038
4 июл. 2019 г. 12:32:25
0

Хотя это старая тема, но быстрый и простой способ создания ссылки в WordPress — указать URL ссылки как:

#_

Обратите внимание на подчеркивание после хэштега. Таким образом, если ваше меню фиксировано и прокручивается вместе со страницей, при клике на ссылку не будет прыжка в начало страницы, и для этого не потребуются плагины или скрипты.

21 нояб. 2017 г. 00:41:43
0

Создайте пункт меню "Пользовательские ссылки" и добавьте javascript:; в поле URL. Это лучше, чем использование #, так как при клике страница не будет прокручиваться вверх.

13 авг. 2018 г. 23:22:32
0

Используя PHP подход, я добавил этот код в functions.php:

function remove_link_contact_menu($item_output, $item) {
    if ($item->post_name == 'contact')
        return '<span>' . $item->title . '</span>';

    return $item_output;
}
add_filter('walker_nav_menu_start_el', 'remove_link_contact_menu', 20, 2);
add_filter('megamenu_walker_nav_menu_start_el', 'remove_link_contact_menu', 20, 2);

Этот код заменяет ссылку на элемент span для пункта меню с post_name == "contact", что мне и было нужно. Вы можете легко изменить это условие для проверки заголовка меню или ID, или добавить код для проверки наличия дочерних пунктов меню и т.д.

11 нояб. 2017 г. 20:39:47
0
  1. Установите пользовательскую ссылку на #, которая ничего не возвращает (элемент списка)
  2. Добавьте этот фильтр:

    add_filter( 'wp_nav_menu_items', 'wpse_remove_empty_links' );
    
    function wpse_remove_empty_links( $menu ) {
    
        return preg_replace("/<a href=\"#\">(.+?)<\/a>/is", "<span>$1</span>", $menu);
    
    }
    
  3. Отредактируйте CSS для элемента <span>, чтобы получить такой же стиль как у <a>, не забудьте добавить cursor: context-menu;.

22 июн. 2018 г. 19:28:44
0

Это отключит клик (и уберет стилизацию элемента). Таким образом, вам не нужно использовать кастомные # ссылки в вашем меню.

add_action( 'wp_footer', function(){
    ?>
    <script>
    (function( $ ) {
        var itemm = $('#main-menu .menu-item-has-children > a');
        itemm.click(function(){
            document.activeElement && document.activeElement.blur();
            return false;
        });
    })(jQuery);
    </script>
<?php
 }, 1, 0 );
18 мар. 2016 г. 14:54:37
0

Как уже предлагали другие участники, вы можете создать пользовательский пункт меню в виде ссылки с символом # в качестве URL. Затем удалите # после добавления пункта в меню. И наконец, можно использовать простое регулярное выражение для удаления тега <a> из таких ссылок.

preg_replace('/<a>([^<]+)<\/a>/i', '<span class="no-link">$1</span>', $navHTML);
7 мая 2015 г. 07:09:26
0

Я понимаю, что немного запоздал с этим, но вот два метода, которые я использую:

1) Сделать родительский пункт меню дубликатом первого подпункта и изменить его название. Например, если первый пункт в разделе "Продукты" — это "Продукт 1", используйте "Продукт 1" в качестве родительского пункта меню, а затем измените его название на "Продукты". Таким образом, и "Продукты", и "Продукт 1" будут вести на страницу Продукт 1.

2) Добавить редирект, чтобы страница "Продукты" перенаправляла на "Продукт 1". Преимущество этого варианта в том, что он позволяет создать пустую страницу "Продукты" для иерархического списка в разделе "Страницы", но если кто-то попытается перейти на пустую страницу "Продукты", его автоматически перенаправит.

21 дек. 2017 г. 18:55:44
2

Перейдите в раздел "Внешний вид", затем нажмите на "Меню". В этом разделе найдите структуру меню и кликните по стрелке вниз, чтобы развернуть страницу. Вы увидите чекбокс с надписью "Отключить ссылку". Отметьте этот чекбокс и сохраните изменения.

26 янв. 2018 г. 21:06:18
Комментарии

Эта функциональность не предоставляется ядром WordPress. Возможно, какая-то тема или плагин добавляет её в вашу систему?

Dave Romsey Dave Romsey
26 янв. 2018 г. 23:58:21

Я тоже сталкивался с этим, жаль, что не знаю, какой именно плагин или тема это делает.

DavGarcia DavGarcia
15 янв. 2019 г. 14:53:12
1

Я решил это следующим образом: в файле header.php (вашей темы) я нашел:

'link_before'     => '',
'link_after'      => '',

и заменил на:

'link_before'     => '<script>var scriptTag=document.getElementsByTagName("script");scriptTag=scriptTag[scriptTag.length-1];if(scriptTag.parentNode.href)if(scriptTag.parentNode.href.slice(-1)=="#")document.write("<span onclick=\"return false\">")</script>',
'link_after'      => '<script>var scriptTag=document.getElementsByTagName("script");scriptTag=scriptTag[scriptTag.length-1];if(scriptTag.parentNode.href)if(scriptTag.parentNode.href.slice(-1)=="#")document.write("</span>")</script>',

Простыми словами, этот скрипт проверяет, заканчивается ли родительская ссылка на "#", и в этом случае добавляет элемент span вокруг содержимого тега A, что отключает клик.

Надеюсь, это поможет :-)

28 июл. 2014 г. 12:06:50
Комментарии

Привет, я знаю, что это старый ответ, но на будущее: я бы не рекомендовал просто изменять файл заголовка вашей темы, потому что при следующем обновлении все ваши изменения будут перезаписаны. Лучшее решение в этом случае — создать дочернюю тему с вашим пользовательским кодом.

Scott Scott
21 мар. 2017 г. 16:29:25
0

Начиная с 1/2019, правильное решение для создания валидного HTML5 выглядит следующим образом.

  1. Добавьте "Пользовательскую ссылку" (Custom Link) с URL, установленным в #, и любым названием. Оба поля обязательны для заполнения.
  2. Отредактируйте только что добавленную ссылку, оставив поле URL пустым.
  3. Сохраните изменения.

В результате получится навигационный элемент верхнего уровня в виде <a>Меню</a>, что является правильным способом представления неактивной (некликабельной) ссылки.

15 янв. 2019 г. 14:55:44
0

Создайте пользовательскую ссылку в меню, как указано ранее. Просмотрите исходный код и найдите атрибут href подменю, например: #mm-1. Вставьте это значение в URL пользовательской ссылки и сохраните меню. Это обеспечит корректную работу мобильной версии при нажатии на текст меню.

23 дек. 2019 г. 20:05:06
0

Моя версия выглядит так:

сначала в меню админ-панели в нужной ссылке в поле href ставим # или оставляем пустым, а затем в function.php темы добавляем:

function replace_empty_menu_links( $item_output, $item, $depth, $args ) {
  if ( $item->url == '#' || $item->url == '' ) {
    $item_output = sprintf( '%1$s<' . 'div' . '%2$s>%3$s%4$s%5$s</' . 'div' . '>%6$s',
      $args->before,
      $attributes,
      $args->link_before,
      apply_filters( 'the_title', $item->title, $item->ID ),
      $args->link_after,
      $args->after
    );
  }
  return $item_output;
}
add_filter( 'walker_nav_menu_start_el', 'replace_empty_menu_links', 10, 4 );

Вы можете заменить 'div' на любой элемент, который вам подходит.

Это работает для версии 5.3.2 (проверено в этой версии, но должно работать и в других).

В такой форме сохраняется работа всех аргументов 'before', 'after', 'link_before', 'link_after' и т.д. из wp_nav_menu().

Также это работает и для подменю.

28 мар. 2020 г. 23:25:25
0
-1

Более простое решение можно найти в другом вопросе:

Админ-меню - Подсветка родительского пункта меню при нахождении на странице подменю (без отображения подменю)

Ищите ответ пользователя Askelon. Работает идеально, без необходимости использовать preg_replaces или jQuery.

3 февр. 2015 г. 22:05:08
0
-1

Вы можете отключить события на теге <a> для всех пунктов меню первого уровня с помощью чистого CSS. Класс .main-menu может иметь другое название в зависимости от именования вашего меню.

/* отключаем кликабельность родительских пунктов меню */
ul.main-menu > li > a {
    pointer-events: none;
}
9 мар. 2019 г. 10:36:29