Страница архива типа записи не работает

15 мая 2013 г., 15:57:20
Просмотры: 15.1K
Голосов: 2

Я зарегистрировал пользовательский тип записи с помощью 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' => 'Родительский рецепт',
    ),
    )
);
4
Комментарии

Пожалуйста, опубликуйте фактический код регистрации пользовательского типа записи. Также: что происходит, если вы установите постоянные ссылки по умолчанию (т.е. без перезаписи) и/или сбросите настройки постоянных ссылок?

Chip Bennett Chip Bennett
15 мая 2013 г. 16:01:21

Добавил код в редактировании, попробовал стандартные постоянные ссылки и похоже, что все работает как ожидалось

markyeoj markyeoj
15 мая 2013 г. 16:11:10

Ваш код, похоже, работает нормально и у меня. Пожалуйста, смотрите: http://wordpress.stackexchange.com/q/98995/21376 Я считаю, что это может быть функциональным дубликатом того вопроса.

s_ha_dum s_ha_dum
15 мая 2013 г. 16:44:53

Судя по установленному вами слагу перезаписи, вы пытаетесь убрать префикс типа записи, чтобы он работал как страницы? Если это так, то это не сработает, и вам придется сделать намного больше, чем просто изменить несколько флагов в register_post_type, а также это может привести к потенциально критичным ошибкам на сайте (конфликты постоянных ссылок между страницами/категориями и новыми URL типа записи)

Tom J Nowell Tom J Nowell
15 мая 2013 г. 16:45:38
Все ответы на вопрос 2
5
11

При стандартной регистрации у вас должно быть следующее:

  • Тип записи с названием '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

15 мая 2013 г. 16:53:44
Комментарии

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

markyeoj markyeoj
15 мая 2013 г. 18:26:42

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

Tom J Nowell Tom J Nowell
15 мая 2013 г. 18:58:13

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

markyeoj markyeoj
15 мая 2013 г. 19:21:26

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

Tom J Nowell Tom J Nowell
15 мая 2013 г. 19:46:00

Отлично, спасибо @tom за ваше терпение, в этой ветке я многому у вас научился. Огромное вам спасибо.

markyeoj markyeoj
15 мая 2013 г. 19:51:44
2
-2

Добавьте этот фильтр в файл 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' );
9 мар. 2015 г. 14:37:29
Комментарии

Пожалуйста, добавьте объяснение к вашему ответу: почему это может решить проблему?

fuxia fuxia
9 мар. 2015 г. 14:38:33

Это даже отдалённо не отвечает на вопрос.

TheDeadMedic TheDeadMedic
9 мар. 2015 г. 15:49:46