( Примечание модератора: изначально называлось "класс предков wp_nav_menu без дочерних элементов в структуре навигации")
У меня wp_nav_menu
в заголовке есть три страницы. Когда я нахожусь на одной из этих страниц, li
содержащая эту страницу в меню получает класс .current_page_item
. Эти три страницы имеют шаблоны, и эти шаблоны содержат пользовательские запросы для получения всех сообщений определенного типа контента. По сути, воспринимаемые «дети» этой страницы верхнего уровня на самом деле не являются детьми, они просто относятся к типу контента, который я связал с этой страницей верхнего уровня с помощью шаблона.
Мне бы хотелось, чтобы элементы меню верхнего уровня получали 'current-ancestor'
класс, когда пользователь просматривает одну страницу определенного типа, опять же, связанную с этой страницей только в пользовательском запросе в файле шаблона.
Надеюсь, что это имеет смысл - если нет, дайте мне знать, где я потерял тебя! Очень ценю любую помощь.
- Отредактировано для специфики: например, у меня есть статическая страница под названием Мастерские, которая использует шаблон. Его слизняк - мастерские . Шаблон имеет собственную функцию get_posts и цикл внутри нее, который извлекает и отображает все сообщения с пользовательским типом контента, называемым мастер- классами . Если я нажму на название одного из этих семинаров, я перейду к полному содержанию этого фрагмента контента. Структура постоянной ссылки для пользовательского типа сообщения установлена на мастер-класс / имя сообщениятак что, как видит пользователь, эти фрагменты контента являются дочерними элементами страницы «Семинары», когда на самом деле все они относятся к одному типу контента, но не связаны со страницей. Это тот пробел, который мне нужно эффективно закрыть в меню, выделив пункт меню «Мастерские» при просмотре контента типа «мастерская».
Опять же, надеюсь, что это имеет смысл, я думаю, я сказал «семинар» более 20 раз в одном абзаце!
источник
/workshops/
и когда пользователь находится на странице семинара (т. Е./workshops/example-workshop/
), Вы хотите, чтобы пункт меню «Мастерские» имелcurrent_page_item
назначенный класс , правильно?Ответы:
Есть более простое решение. Забудьте о создании страниц для каждого типа сообщений, чтобы иметь элементы навигации, поскольку, как вы узнали, WP не может распознать, что пользовательские типы, которые вы просматриваете, связаны с этой страницей.
Вместо этого создайте пользовательскую ссылку в Appearance-> Menus. Просто введите URL-адрес, который вернет ваш пользовательский тип, и присвойте ему метку, затем нажмите «Добавить в меню».
или non-pretty-permalinks:
одно это просто создаст кнопку навигации, которая отображает все сообщения с этим пользовательским типом записи, а также добавит класс элемента текущего меню, когда вы щелкнете по этому элементу навигации, но пока не добавит класс навигации URL, отличный от этого
Затем, после того, как он будет создан, перейдите в конфигурацию для этого нового элемента и введите кусок настраиваемого типа записи в поле «Атрибут заголовка» (вы также можете использовать поле описания, но это скрыто в настройках экрана администратора). по умолчанию).
Теперь вам нужно подключить
nav_menu_css_class
фильтр (который запускается для каждого элемента навигации) и проверить, относится ли просматриваемый контент к типу записи, указанному в вашем пользовательском элементе навигации:В этом случае мы собираемся проверить, что содержимое поля «Атрибут заголовка» не пустое и соответствует ли оно текущему запрашиваемому типу post_type. Если это так, мы добавляем класс current-menu-item в его массив классов, а затем возвращаем модифицированный массив.
Вы можете изменить это так, чтобы он просто совпадал с заголовком элемента навигации, но если по какой-то причине вы хотите присвоить заголовку элемента навигации другой заголовок, чем обычный фрагмент типа сообщения, использование поля «Атрибут заголовка» или «Описание» дает вам такую гибкость.
Теперь каждый раз, когда вы просматриваете один элемент (или, возможно, даже архивные списки) с типом записи, который соответствует элементу навигационного меню, этому элементу будет присвоен класс current-menu-item класса CSS, чтобы ваше выделение работало.
Нет страниц или шаблонов страниц, необходимых ;-) URL-запрос заботится о получении правильных сообщений. Ваш шаблон цикла заботится о выводе запроса. Эта функция заботится о распознавании того, что отображается, и о добавлении класса CSS.
БОНУС
Вы даже можете автоматизировать процесс, используя
wp_update_nav_menu_item
пункты меню, автоматически генерируемые для всех ваших типов записей. Для этого примера сначала нужно получить$menu_id
меню навигации, в которое вы хотите добавить эти элементы.источник
current_page_parent
Мне пришлось удалить из элемента навигации, который был мой блог - но в противном случае это сработало. thx$item->attr_title
вытащил название, и я написал заглавными буквами. поэтому я изменил атрибут на$item->post_name
и теперь он отлично работает для меня.portfolio
. Я использовал приведенный выше код. В чем может быть проблема?вместо использования
Вы можете попробовать:
Как правило, тип сообщения не указывается в запросе var. Это случай для post_type по умолчанию «post», поэтому, если вы хотите выделить сообщение, которое было перечислено на странице со списком, вам нужно будет использовать это. get_very_var () просто возвращает пустую строку для типов сообщений, которые не являются пользовательскими.
источник
@ Соматик - это фантастика! Я немного изменил ваш код, чтобы он также работал для конкретной таксономии (которую я использую только для соответствующего post_type). Идея состоит в том, чтобы использовать атрибут Title элемента меню для хранения как имени post_type, так и имени таксономии, разделенных точкой с запятой, а затем разнесенных функцией.
источник
Вот мое решение, если вы хотите работать с wp_list_pages.
добавьте это в ваши functions.php
Теперь просто добавьте в таблицу wp_options новую строку с option_name из page_for_custom_post_type-хххх и OPTION_VALUE с страницы-ID и хотите подключиться.
Возможно, вы узнали, что уже есть опция с именем page_for_posts . Если у вас есть только 1 пользовательский тип записи, вы можете установить свою страницу в /wp-admin/options-reading.php в раскрывающемся списке, и навигация установит правильную текущую страницу.
Я думаю, что ядро WordPress должно расширить этот раздел выпадающим списком для каждого зарегистрированного типа поста.
источник
Я решил придерживаться страниц и использовать имя шаблона страницы как класс для элемента навигации. Это позволяет мне не загромождать атрибут title, который мне не нравился в некоторых других решениях.
У меня также есть классы тела, добавленные в header.php
Наконец, это решение требует дополнительных CSS, чтобы применить выбранное / активное состояние к вашим элементам навигационного меню. Я использую его для отображения архивов таксономии и пользовательских типов записей, связанных со страницей, в качестве дочерних элементов этой страницы:
источник
Warning: join() [function.join]: Invalid arguments passed in /home/path/to/wp-includes/nav-menu-template.php on line 76
Есть идеи, что здесь произошло?return $classes
наружу и после этого,if
похоже, решить вышеуказанную ошибку.@ Соматик - Отличный код! Я сделал одно изменение сам. Я хотел сохранить атрибут заголовка по назначению, поэтому вместо этого я поместил слаг «Настраиваемый тип публикации» в свойствах расширенного меню «Связь» (XFN), которые можно включить в «Параметры экрана». Я модифицировал
и изменил его на
источник
Отличная работа Соматика.
К сожалению, я не понимаю, как вы можете перечислить ваши собственные типы сообщений на странице, как вы объясняете. Если я не использую page-portfolio.php и не добавляю его на страницу, все, что я получаю, - это страница 404.
Если я делаю так, как делает Гэвин, я немного изменил вашу функцию, чтобы также убрать «current_page_parent» со страницы блога, как это.
}
источник