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

5 дек. 2011 г., 17:37:57
Просмотры: 15.9K
Голосов: 9

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

Также ссылка должна становиться активной, когда пользователь находится на этой странице. Возможно, это невозможно сделать стандартными средствами, но есть ли какой-то плагин для этого? Я никак не могу его найти :(

Я нашел только этот плагин под названием Custom Post Type Archives in Nav Menus, который на самом деле ничего не делает, кроме как добавляет произвольную ссылку в меню... с полным URL сайта. Он не становится активным и не очень динамичен.

Я подумал, что, вероятно, самым простым способом будет переопределить wp_nav_menu() и добавить свои ссылки вручную, а затем использовать информацию из $_GET для управления "текущей активной ссылкой".

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

После форка ответа Стивена я пришел к такому решению: http://wordpress.org/support/topic/how-to-add-custom-post-type-archive-slug-to-nav-menu?replies=5#post-2482529 Надеюсь, это поможет кому-то в будущем :)

Kalle H. Väravas Kalle H. Väravas
5 дек. 2011 г. 22:05:55
Все ответы на вопрос 2
0

Начиная с 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',
            ),
        )
    );
});

С этими дополнениями вы увидите новую метабокс на странице администрирования Внешний вид > Меню.

Ссылка на архив типа записи находится во вкладке 'Просмотреть все' внутри метабокса типа записи:

WordPress Custom Post Type Archive Nav Menus Link

Примечание: Возможно, вам потребуется открыть панель "Настройки экрана" и убедиться, что название "Архивы типов записей" (например, Фильмы) отмечено галочкой, чтобы оно появилось на экране Меню.

25 янв. 2017 г. 21:59:32
3

Это один из методов, который, по моему мнению, должен работать (хотя и не тестировался).

// Подключение к фильтру для (пользовательского) главного меню
// Фильтр '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 (при условии, что используются пользовательские постоянные ссылки...).

5 дек. 2011 г. 18:21:32
Комментарии

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

Kalle H. Väravas Kalle H. Väravas
5 дек. 2011 г. 20:11:11

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

Kalle H. Väravas Kalle H. Väravas
5 дек. 2011 г. 20:15:10

Ой, двойные извинения, не увидел $wp_query->query_vars['post_type']=='myposttype'. В основном работает. Это хорошая основа для более динамичного решения, спасибо!

Kalle H. Väravas Kalle H. Väravas
5 дек. 2011 г. 20:18:17