werner
  • 0
Новичок

Пользовательские архивы типов сообщений по дате и таксономии

  • 0

Давайте воспользуемся классическим примером пользовательского типа записей под названием «фильмы» с собственной таксономией под названием «жанр».

При регистрации пользовательского типа сообщения (с слагом «фильм») постоянные ссылки уже настроены для

<domain>/movie/action/ 

…посмотреть все фильмы в жанре экшн.

Но, архивы по дате, например

<domain>/2010/09/

… не знаю о пользовательском типе сообщений.

Ближайший архив на основе даты, с которым я могу работать, это:

<domain>/2010/?post_type=movies

… в котором перечислены все пользовательские типы сообщений, опубликованные в текущем году (2010). По какой-то причине месяц, таксономия и термин не могут быть добавлены к URL-адресу для получения ожидаемого результата.

Что нужно сделать, чтобы включить такие URL-адреса…

<domain>/2010/09/movie/action/

… работать как положено, чтобы вывести список всех боевиков, опубликованных в сентябре 2010 года?

Share
  1. Да, в настоящее время нет встроенной поддержки CPT-архивов, но это не значит, что вы не можете расширить WP, чтобы обеспечить ее. Я сам так сделал на днях…

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

    ПРИМЕР: у вас есть собственный тип «фильмов» и один пост о фильме под названием «Унесенные ветром». Этот код даст вам структуру URL-адреса website.com/movies/gone-with-the-wind. Кроме того, при переходе на сайт website.com/movies будут перечислены только фильмы (точно так же, как архив категорий, хотя он не будет вызывать шаблон archive.php для вывода, а отформатирует вывод так же, как стандартный шаблон цикла index.php).

    function register_post_type_archives( $post_type, $base_path = '' ) {
        global $wp_rewrite;
        if ( !$base_path ) {
            $base_path = $post_type;
        }
        $rules = $wp_rewrite->generate_rewrite_rules($base_path);
        $rules[$base_path.'/?$'] = 'index.php?paged=1';
        foreach ( $rules as $regex=>$redirect ) {
            if ( strpos($redirect, 'attachment=') == FALSE ) {
                $redirect .= '&post_type='.$post_type;
                if (  0 < preg_match_all('@\$([0-9])@', $redirect, $matches) ) {
                    for ( $i=0 ; $i < count($matches[0]) ; $i++ ) {
                        $redirect = str_replace($matches[0][$i], '$matches['.$matches[1][$i].']', $redirect);
                    }
                }
            }
            add_rewrite_rule($regex, $redirect, 'top');
        }
    }
    

    вызовите эту функцию сразу после создания пользовательского типа записи:

    register_post_type('movies', $args);
    register_post_type_archives('movies');
    

    Затем, если вы хотите иметь возможность использовать настраиваемые шаблоны для управления выводом этих квазиархивных списков, вы можете использовать это:

    add_action('template_redirect', 'post_type_templates');
    function post_type_templates() {
        $post_type = get_query_var('post_type');
        if (!empty($post_type)) {
            locate_template(array("{$post_type}.php","index.php"), true);
            die;
        }
    }
    

    Теперь вы можете создать шаблон «movies.php» в своей теме и настроить вывод цикла по своему вкусу.

    ОБНОВЛЕНИЕ: иметь функциональность архива для пользовательских типов — это здорово, но я понял, что мне нужен способ получить к ним доступ. Очевидно, вы можете где-то жестко запрограммировать кнопки, которые указывают на слаги, но я сделал функцию для создания панели навигации wp3.0 со всеми моими пользовательскими типами в ней. Прямо сейчас он порождает новую панель навигации и делает ее основной, но вы можете сделать ее вторичной или просто добавить элементы в существующую панель навигации. Примечание: навигационные ссылки будут работать только в том случае, если вы используете приведенные выше правила перезаписи.

    function register_typenav() {
        $mainnav = wp_get_nav_menu_object('Types Nav');
        if (!$mainnav) {
            $menu_id = wp_create_nav_menu( 'Types Nav' );
            // vav item for each post type
            $types = get_post_types( array( 'exclude_from_search' => false ), 'objects' );
            foreach ($types as $type) {
                if (!$type->_builtin) {
                    wp_update_nav_menu_item( $menu_id, 0, array(
                        'menu-item-type' => 'custom',
                        'menu-item-title' => $type->labels->name,
                        'menu-item-url' => get_bloginfo('url') . '/' . $type->rewrite['slug'] . '/',
                        'menu-item-status' => 'publish'
                        )
                    );
                }
            }
        if ($mainnav && !has_nav_menu( 'primary-menu' ) ) {
            $theme = get_current_theme();
            $mods = get_option("mods_$theme");
            $key = key($mods['nav_menu_locations']);
            $mods['nav_menu_locations'][$key] = $mainnav->term_id;
            update_option("mods_$theme", $mods);
        }
    }
    add_action('init', 'register_typenav');
    
    • 0
  2. Пользовательские типы сообщений не предназначены для предоставления архива, как это делает обычный тип сообщений в блогах. Это может быть что-то, что будет изменено в будущем.

    Это недостающее звено: улучшения Custom Post Types (CPT), которые заслуживают рассмотрения в версии 3.1.

    • 0
  3. Этот плагин обеспечивает именно то, что вы хотите. Он хорошо работает с WordPress 3.3.1.

    • 0

Оставить ответ

You must login to add an answer.