Добавление пользовательских архивов типов записей в меню WordPress
10
Есть ли способ (помимо добавления пользовательской ссылки) добавить пользовательский архив записей в меню в WordPress? Если он добавлен с использованием пользовательской ссылки (например, / cpt-archive-slug /), WordPress не применяет классы, подобные current-menu-itemэлементу списка, что создает проблемы при стилизации меню.
Если пользовательская ссылка содержит полный URL-адрес (например, http://site.com/cpt-archive-slug/ ), эти классы добавляются. Тем не менее, это, вероятно, не «лучшая практика».
лучше всего использовать пользовательскую ссылку с полным URL-адресом, так как пользовательские архивы типов записей представляют собой различные архивы на основе таксономии (категории, теги, любые пользовательские таксономии) и архивы на основе дат, в которых есть собственный архив.
Имея пользовательский элемент меню ссылки с URL #post_type_album, вы можете использовать его следующим образом:
# Where you defined your custom post type (could be anywhere anyway)
KB_Custom_Menu_Walker::custom_post_types('album');# And display the menu
wp_nav_menu(array('theme_location'=>'primary-nav','walker'=>new KB_Custom_Menu_Walker(),));
Примечание. Предполагается, что слаг и название вашего поста совпадают.
+1 за поздний качественный ответ. Это хорошо для сообщества!
Брайан Фегтер
2
Я немного расширил ответ tungd, чтобы обеспечить более общий подход к этому подходу. Эта реализация позволяет добавлять произвольные отображения между «макросами» меню и внутренними URL-адресами Wordpress, о которых знает только серверная часть.
Я также решил использовать !в качестве префикса для этих макросов, чтобы они не конфликтовали с именованными якорями - это включает накладные расходы на удаление http: // из URL ссылки (так как Wordpress попытается нормализовать эти странные ссылки) , Если эта реализация вас беспокоит, вы всегда можете удалить preg_replace()вызов и использовать в #качестве префикса ссылки, как и раньше.
Вы можете создать страницу, а затем применить к ней пользовательский шаблон архива. Я создаю и использую archive- {post-type} .php для имени шаблона так же, как вы делаете это для архива по умолчанию, я просто вручную применяю его к странице.
Если вы сделаете это, я бы порекомендовал установить для вашего CPT значение has_archive = 'false', чтобы избежать коллизий с постоянными ссылками, независимо от того, просто убедитесь, что ваша страница имеет другой постоянный ссылочный порог, чем установленный для вашего архивного слаг CPT.
Я столкнулся с той же самой проблемой и нашел это решение:
// $menu is the menu as a string if( check if youa re on the page you are looking for)
$menu = str_replace('<li class="menu-item"><a href="http://bla.com/bloop/">','<li class="current-menu-item menu-item"><a href="http://bla.com/bloop/">'>, $menu );
Я думаю, что мне нужно будет создать новый «родительский» тип записи, поэтому пользовательский тип публикации, который я хочу показать, станет «дочерним», и этот родитель будет отображаться в меню.
Это должно быть вариантом. Создание фиктивного родителя только для того, чтобы перечислить его в меню - это слишком много работы.
Я хотел бы сделать это из шаблона или функций, поэтому мне не нужно делать это в настройках каждого меню для каждого сайта в моей многоузловой установке.
Я имел в виду, что посты пользовательского пост-типа, которые я хотел показать в меню, будут единственным подтипом вновь созданного родителя, и я надеюсь, что он будет указан под родителем в настройках меню.
Серхио
0
Я нашел этот ответ при поиске аналогичной проблемы. Я просто скопировал код в свой файл finctions.php, и он работал прямо из коробки :) надеюсь, это поможет!
Вместо добавления ссылки я создаю пустую страницу. На этой странице я добавляю что-то вроде «Контент, сгенерированный из cpt-name» в редакторе, чтобы мой клиент знал, откуда все эти материалы.
Затем я добавляю эту страницу в меню и, следуя следующему коду, гарантирую, что она подсвечивается при запуске archives-cpt или single-cpt.
/**
* Fix to add Custom post types to nav menu
* If you custom post is called "concepts"
* create a new empty page called concepts and add this
*/function additional_active_item_classes($classes = array(), $menu_item =false){global $wp_query;if(in_array('current-menu-item', $menu_item->classes)){
$classes[]='current-menu-item';}if( $menu_item->title =='PAGE TITLE'&& is_post_type_archive('cpt-slug')){
$classes[]='current-menu-item';}if( $menu_item->title =='PAGE TITLE'&& is_singular('cpt-slug')){
$classes[]='current-menu-item';}return $classes;}
add_filter('nav_menu_css_class','additional_active_item_classes',10,2);
Это проверит заголовок меню / страницы и, если мы действительно видим архив или отдельную страницу пользовательского типа поста. Если это правда, он добавит класс current-menu-item.
Я немного расширил ответ tungd, чтобы обеспечить более общий подход к этому подходу. Эта реализация позволяет добавлять произвольные отображения между «макросами» меню и внутренними URL-адресами Wordpress, о которых знает только серверная часть.
Я также решил использовать
!
в качестве префикса для этих макросов, чтобы они не конфликтовали с именованными якорями - это включает накладные расходы на удаление http: // из URL ссылки (так как Wordpress попытается нормализовать эти странные ссылки) , Если эта реализация вас беспокоит, вы всегда можете удалитьpreg_replace()
вызов и использовать в#
качестве префикса ссылки, как и раньше.источник
Вы можете создать страницу, а затем применить к ней пользовательский шаблон архива. Я создаю и использую archive- {post-type} .php для имени шаблона так же, как вы делаете это для архива по умолчанию, я просто вручную применяю его к странице.
Если вы сделаете это, я бы порекомендовал установить для вашего CPT значение has_archive = 'false', чтобы избежать коллизий с постоянными ссылками, независимо от того, просто убедитесь, что ваша страница имеет другой постоянный ссылочный порог, чем установленный для вашего архивного слаг CPT.
источник
Я столкнулся с той же самой проблемой и нашел это решение:
Источник: http://www.wptavern.com/forum/plugins-hacks/2169-current-page-custom-post-type-archive.html
источник
Я думаю, что мне нужно будет создать новый «родительский» тип записи, поэтому пользовательский тип публикации, который я хочу показать, станет «дочерним», и этот родитель будет отображаться в меню.
Это должно быть вариантом. Создание фиктивного родителя только для того, чтобы перечислить его в меню - это слишком много работы.
Я хотел бы сделать это из шаблона или функций, поэтому мне не нужно делать это в настройках каждого меню для каждого сайта в моей многоузловой установке.
источник
Я нашел этот ответ при поиске аналогичной проблемы. Я просто скопировал код в свой файл finctions.php, и он работал прямо из коробки :) надеюсь, это поможет!
Динамическая навигация для пользовательского типа поста (страницы)
источник
Вместо добавления ссылки я создаю пустую страницу. На этой странице я добавляю что-то вроде «Контент, сгенерированный из cpt-name» в редакторе, чтобы мой клиент знал, откуда все эти материалы.
Затем я добавляю эту страницу в меню и, следуя следующему коду, гарантирую, что она подсвечивается при запуске archives-cpt или single-cpt.
Это проверит заголовок меню / страницы и, если мы действительно видим архив или отдельную страницу пользовательского типа поста. Если это правда, он добавит класс current-menu-item.
источник