Как добавить ссылки на архивные страницы пользовательских типов записей в меню навигации?
Не могу разобраться с этой проблемой. Похоже, нет чекбокса или аналогичной функции для добавления в меню ссылки на архивную страницу только что созданного пользовательского типа записи.
Также ссылка должна становиться активной, когда пользователь находится на этой странице. Возможно, это невозможно сделать стандартными средствами, но есть ли какой-то плагин для этого? Я никак не могу его найти :(
Я нашел только этот плагин под названием Custom Post Type Archives in Nav Menus, который на самом деле ничего не делает, кроме как добавляет произвольную ссылку в меню... с полным URL сайта. Он не становится активным и не очень динамичен.
Я подумал, что, вероятно, самым простым способом будет переопределить wp_nav_menu()
и добавить свои ссылки вручную, а затем использовать информацию из $_GET
для управления "текущей активной ссылкой".

Начиная с WordPress 4.4 (декабрь 2015 года), ссылки на архивы пользовательских типов записей теперь официально поддерживаются в ядре WordPress без необходимости использования стороннего кода или плагинов.
Вы можете прочитать полное обсуждение в Trac #16075 или ознакомиться с постом на Make WordPress Core для краткого описания дополнительных меток.
Чтобы включить новую встроенную поддержку ссылок на архивы в меню, пользовательские типы записей должны быть зарегистрированы с не ложными (т.е. true) значениями для параметров has_archive
, publicly_queryable
и show_in_nav_menus
:
add_action( 'init', function () {
register_post_type( 'movies',
array(
'labels' => array(
'name' => __( 'Фильмы' ),
'singular_name' => __( 'Фильм' ),
'archives' => __( 'Фильмы' ),
),
'public' => true,
'has_archive' => true,
'rewrite' => array(
'slug' => 'movies',
),
)
);
});
С этими дополнениями вы увидите новую метабокс на странице администрирования Внешний вид > Меню.
Ссылка на архив типа записи находится во вкладке 'Просмотреть все' внутри метабокса типа записи:
Примечание: Возможно, вам потребуется открыть панель "Настройки экрана" и убедиться, что название "Архивы типов записей" (например, Фильмы) отмечено галочкой, чтобы оно появилось на экране Меню.

Это один из методов, который, по моему мнению, должен работать (хотя и не тестировался).
// Подключение к фильтру для (пользовательского) главного меню
// Фильтр 'wp_list_pages' используется как запасной вариант, когда пользовательское меню не используется
add_filter( 'wp_list_pages', 'new_nav_menu_items' );
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items' );
// Также можно подключиться к конкретному меню...
//add_filter( 'wp_nav_menu_{$menu->slug}_items', 'new_nav_menu_items' );
function new_nav_menu_items($items) {
global $wp_query;
$class ='';
// Проверяем, просматриваем ли мы CPT 'myposttype', если да — добавляем класс 'active'
if(isset($wp_query->query_vars['post_type'])&& $wp_query->query_vars['post_type']=='myposttype')
$class = 'current_page_item';
// Генерируем URL страницы архива CPT
$url = add_query_arg('post_type','myposttype',site_url());
$myitem = '<li class="'.$class.'"><a href="'.$url.'">Мой пользовательский тип записи</a></li>';
$items = $items . $myitem;
return $items;
}
Мне кажется, это не самое чистое решение, но я не знаю другого способа. Если он есть, я бы хотел его увидеть!
Наконец, URL-адрес, на который ведет пользовательский пункт меню, не является "красивым" — но его можно сделать таковым, если знать ярлык CPT (при условии, что используются пользовательские постоянные ссылки...).

Спасибо за ответ. В целом это работает. Однако форматирование URL требует некоторой доработки. И я надеялся, что возможно вы знаете о WP больше чем я. В данный момент URL выглядит так: example.com/?post_type=myposttype, но должен быть example.com/myposttype. Может просто $url = site_url() . 'myposttype';
? И классы не включаются, включая текущий активный.

Ой, извините, не заметил $class = '';
. Однако, не могу ли я получить стандартные классы динамически, а также как сделать текущую активную ссылку рабочей?
