Вопрос или проблема
Созданный 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:
- Перейдите в Настройки → Постоянные ссылки.
- Убедитесь, что структура сохранена (можете выбрать «Имя записи» или другую подходящую структуру и сохранить изменения).
4. Проверка URL
После внесения всех изменений убедитесь, что вы проверяете правильные URL:
- Для архива всех новостей:
mysite/news/
- Для архива новостей по категории
recruitment
:mysite/news/category/recruitment/
- Стандартные категории не будут работать с CPT
news
, поэтому URLmysite/category/recruitment/
не будет действительным.
Если вы всё сделали правильно, переход на mysite/news/recruitment
должен отобразить записи CPT, относящиеся к категории recruitment
.
Заключение
Следуя данным шагам, вы сможете реализовать корректное архирование пользовательского типа записей с возможностью фильтрации по категориям. Важно помнить, что правильная настройка структуры ссылок и регистрация CPT играет ключевую роль в успешной реализации этой функциональности. Успехов в настройках вашего сайта!