Страница архива типа записи не работает
Я зарегистрировал пользовательский тип записи с помощью Custom Post Type UI и создал страницу архива с именем archive-recipe.php, где 'recipe' - название моего типа записи. Но она не работает, вместо этого используется стандартный archive.php
. Я установил has-archive
в true
, но это не помогло. Как это исправить?
Вот мой код:
register_post_type(
'recipe', array(
'label' => 'Рецепты',
'description' => 'Это пользовательский тип записи для рецептов',
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'capability_type' => 'post',
'hierarchical' => true,
'rewrite' => array('slug' => ''),
'query_var' => true,
'has_archive' => true,
'exclude_from_search' => false,
'supports' => array('title','editor','excerpt','trackbacks','custom-fields','comments','revisions','thumbnail','author','page-attributes',),
'labels' => array (
'name' => 'Рецепты',
'singular_name' => 'Рецепт',
'menu_name' => 'Рецепты',
'add_new' => 'Добавить рецепт',
'add_new_item' => 'Добавить новый рецепт',
'edit' => 'Редактировать',
'edit_item' => 'Редактировать рецепт',
'new_item' => 'Новый рецепт',
'view' => 'Просмотреть рецепт',
'view_item' => 'Просмотреть рецепт',
'search_items' => 'Искать рецепты',
'not_found' => 'Рецепты не найдены',
'not_found_in_trash' => 'В корзине нет рецептов',
'parent' => 'Родительский рецепт',
),
)
);
При стандартной регистрации у вас должно быть следующее:
- Тип записи с названием 'recipe' (рецепт)
- Архив записей рецептов по адресу example.com/recipe/
- Записи рецептов с URL вида example.com/recipe/helloworldrecipe/
- Шаблон
archive-recipe.php
- Шаблон
single-recipe.php
Однако в вашем коде регистрации я вижу:
'rewrite' => array('slug' => ''),
Это говорит о том, что вы пытаетесь убрать префикс 'recipe' из URL рецептов. В результате архив записей рецептов теперь доступен по:
URL сайта + ''
Что уже занято главной страницей, поэтому доступ к архиву записей становится невозможным.
Кроме того, это не делает того, что вы ожидаете. Вы не можете убрать часть '/recipe/' из URL пользовательского типа записи, используя только параметры rewrite в register_post_type. Для этого требуются другие изменения, которые также могут привести к критическим ошибкам на сайте.
Например, если у вас есть страница с названием 'pumpkin' и рецепт с таким же названием, как WordPress должен определить, что загружать при посещении example.com/pumpkin? Он не может, поэтому загрузит то, что найдет первым по правилам rewrite.
Так что если у вас есть рецепт для 'pie', но нет страницы с таким названием, система будет искать страницу, не найдет ее, и вместо рецепта вы получите ошибку 404.
Поэтому я настоятельно рекомендую отказаться от этой затеи. Это делает ваши URL менее логичными, и вопреки утверждениям SEO-"экспертов", с большей вероятностью навредит, а не поможет вашим позициям в поисковиках (если вообще окажет какое-то влияние).
Так что удалите параметр rewrite и пересохраните постоянные ссылки.
Обновление
После того как вы предоставили эту ссылку:
http://seemynewwebsite.com/g2bm/recipecategory/appetizers/
Стало ясно, что вы загружаете таксономию, ожидая архив типа записи. Таксономия - это не тип записи, как видно здесь, у них разные резервные варианты:
Более того, это и не имеет смысла. Например, какой шаблон архива типа записи должен использоваться в этих сценариях:
- Таксономия, содержащая 2 типа записей: люди и места. Будет использоваться archive-location.php или archive-people.php?
- Таксономия пользователей, относящаяся к пользователям, а не записям
Вместо этого используйте шаблон таксономии для вашей таксономии, а не шаблон архива типа записи. В данном случае taxonomy-recipecategry.php

Спасибо, хорошее улучшение, рецепт теперь отображает записи, предыдущий выдавал 404.. но я все еще не понимаю, на самом деле я думал, что если я просматриваю отдельную категорию пример, то будет использоваться созданный мной archive-recipe.php, но вместо этого все еще используется archive.php. В чем проблема?

Аааа, archive-recipe.php предназначен для архива записей, а это не архив записей, это вывод таксономии, вам нужен шаблон таксономии.

Спасибо, я создал taxonomy-recipe.php, но все равно не работает, все еще используется archive.php..

Ваша таксономия не называется recipe, recipe — это тип записи, а не таксономия. taxonomy-taxonomyname.php
, тип записи, которую перечисляет таксономия, здесь совершенно не имеет значения

Добавьте этот фильтр в файл functions.php:
function namespace_add_custom_types( $query ) {
if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) {
$query->set( 'post_type', array(
'post', 'nav_menu_item', 'your-custom-post-type-here'
));
return $query;
}
}
add_filter( 'pre_get_posts', 'namespace_add_custom_types' );
