URL пользовательского типа записи – фильтр по таксономии

Вопрос или проблема

Созданный CPT = новости

использует категории по умолчанию (ИТ и рекрутинг) Я пытаюсь просмотреть архив записей по их категории

mysite/news/ – показывает все записи для этого CPT вне зависимости от категории – хорошо

mysite/news/recruitment – 404

mysite/category/recruitment – 404

mysite/news/category/recruitment – 404

(не уверен, какая из последних трех должна работать)

Вот код, который я использую – я предполагаю, что я упускаю что-то основное – спасибо

add_action( 'init', 'cptui_register_my_cpts' );
   function cptui_register_my_cpts() {
   $labels = array(
     "name" => "Новости",
     "singular_name" => "Новость",
   );

$args = array(
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "show_ui" => true,
    "has_archive" => false,
    "show_in_menu" => true,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => true,
    "rewrite" => array( "slug" => "news", "with_front" => true ),
    "query_var" => true,

    "taxonomies" => array( "category" )
);
register_post_type( "news", $args );

// Конец cptui_register_my_cpts()
}

Надеюсь, вы уже сделали красивые URL на своем сайте (Настройки>Постоянные ссылки). Если да, предположим, что ваш Категория База там пуста.

Вам нужно добавить пользовательские записи в архив категории, используя фильтр. Для этого добавьте это в function.php:

function go_add_custom_types( $query ) {
  if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) {
    $query->set( 'post_type', array(
     'post', 'nav_menu_item', 'ваш-пользовательский-типа-записи-сюда'
        ));
      return $query;
    }
}
add_filter( 'pre_get_posts', 'go_add_custom_types' );

В настройках по умолчанию, структура WordPress работает так (на основе наблюдений на моем блоге)

Для категории по умолчанию,

site.com/category/catgory-name

или site.com/category-name

Для пользовательской таксономии (случайным образом)

site.com/custom-taxonomy-slug/category-name

Для одной новости (CPT)

site.com/news/post-name.

Для одной записи по умолчанию:

site.com/<зависит-от-структуры-постоянных-ссылок>

Ответ или решение

Для того чтобы реализовать архивирование пользовательского типа записей (CPT) под названием news с фильтрацией по категориям, необходимо внести несколько изменений в ваш код и структуру.

1. Регистрация пользовательского типа записей

Ваш текущий код регистрации CPT выглядит в целом правильно. Однако есть несколько важных моментов, на которые следует обратить внимание:

  • Для того чтобы ваш CPT имел архив, параметр has_archive должен быть установлен в true.
  • Убедитесь, что ваш CPT поддерживает таксономии, что вы уже сделали, добавив 'taxonomies' => array( 'category' ).

Обновленный код будет выглядеть следующим образом:

add_action( 'init', 'cptui_register_my_cpts' );
function cptui_register_my_cpts() {
    $labels = array(
        "name" => "News",
        "singular_name" => "News",
    );

    $args = array(
        "labels" => $labels,
        "description" => "",
        "public" => true,
        "show_ui" => true,
        "has_archive" => true, // изменено на true
        "show_in_menu" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => true,
        "rewrite" => array( "slug" => "news", "with_front" => true ),
        "query_var" => true,
        "taxonomies" => array( "category" ),
    );
    register_post_type( "news", $args );
}

2. Настройка фильтрации по категориям

Чтобы ваши записи CPT отображались по категориям, необходимо использовать фильтр pre_get_posts. Ваш код выглядит хорошо, но не забудьте заменить your-custom-post-type-here на news. Вот как это может выглядеть:

function go_add_custom_types( $query ) {
    if( ( is_category() || is_tag() ) && empty( $query->query_vars['suppress_filters'] ) ) {
        $query->set( 'post_type', array( 'post', 'news' ) );
    }
    return $query;
}
add_filter( 'pre_get_posts', 'go_add_custom_types' );

3. Настройка постоянных ссылок

Для того чтобы ссылки работали корректно, важно настроить структуру постоянных ссылок. Перейдите в админку WordPress:

  1. Перейдите в НастройкиПостоянные ссылки.
  2. Убедитесь, что структура сохранена (можете выбрать «Имя записи» или другую подходящую структуру и сохранить изменения).

4. Проверка URL

После внесения всех изменений убедитесь, что вы проверяете правильные URL:

  • Для архива всех новостей: mysite/news/
  • Для архива новостей по категории recruitment: mysite/news/category/recruitment/
  • Стандартные категории не будут работать с CPT news, поэтому URL mysite/category/recruitment/ не будет действительным.

Если вы всё сделали правильно, переход на mysite/news/recruitment должен отобразить записи CPT, относящиеся к категории recruitment.

Заключение

Следуя данным шагам, вы сможете реализовать корректное архирование пользовательского типа записей с возможностью фильтрации по категориям. Важно помнить, что правильная настройка структуры ссылок и регистрация CPT играет ключевую роль в успешной реализации этой функциональности. Успехов в настройках вашего сайта!

Оцените материал
Добавить комментарий

Капча загружается...