Пользовательские типы записей на страницах категорий
Я работаю с пользовательским типом записей, который использует стандартные категории WordPress.
Мне удалось изменить шаблон категории для отображения моих пользовательских типов записей именно так, как мне нужно.
Проблема в том, что после этих изменений затрагиваются и обычные записи блога.
Конечно, я могу ограничить либо обычные записи блога, либо пользовательский тип записей одной категорией и создать category-ID.php для работы только с этой категорией.
Но я хочу узнать, есть ли более гибкое решение?
Возможно ли создать шаблоны категорий, специфичные для разных типов записей, т.е. один для отображения обычных записей, другой для пользовательских типов записей и т.д.?
Это вообще возможно? Если нет, какой лучший способ обойти эту проблему?

Для пользовательских типов записей с пользовательской таксономией вы можете создать шаблон для этой таксономии. Ваш шаблон пользовательской таксономии должен называться taxonomy-{taxonomy}.php
. Например, если ваша таксономия называется "cooking-categories", вы должны назвать файл taxonomy-cooking-categories.php
.
Больше информации о файлах шаблонов для специальных архивов таксономий можно найти в кодексе здесь: http://codex.wordpress.org/Template_Hierarchy#Custom_Taxonomies_display

Вы можете организовать это на основе типа записи следующим образом:
допустим, у вас есть category.php
для обычных записей и your-custom-type-category.php
для записей вашего пользовательского типа, тогда просто добавьте этот код в самый верх вашего обычного category.php.
<?php if (have_posts()){
the_post();
if( 'your_custom_type' == get_post_type( $post ) ) {
rewind_posts();
get_template_part('your-custom-type-category');
exit();
}
rewind_posts();
}
?>
Теперь при запросе категории система будет проверять наличие вашего пользовательского типа записи, и если он найден, будет использован шаблон your-custom-type-category.php
, а все обычные записи будут отображаться с помощью category.php
без изменений.
Надеюсь, это поможет

Привет, @Kelvin Jayanoris:
Есть ли причина, по которой ты не можешь просто проверить значение $post->post_type
с помощью оператора if..elseif
внутри своего цикла (Loop), вот так:
<?php if ($post->post_type=='foo'): ?>
Размести HTML для типа записи 'foo' здесь...
<?php else if ($post->post_type=='bar'): ?>
Размести HTML для типа записи 'bar' здесь...
<?php else if ($post->post_type=='post'): ?>
Размести HTML для типа записи 'post' здесь...
<?php endif; ?>
Или есть причина, по которой ты не можешь создать свою собственную иерархию имен файлов шаблонов в виде имен файлов, таких как post-foo.php
, post-bar.php
, post-post.php
, также внутри цикла?
Вот такой код может это сделать:
<?php include("post-{$post->post_type}.php"); ?>

Более простое решение, если вы не хотите создавать новые файлы или возиться с запросами — использовать этот код в functions.php:
function sql_where_clause($sql) {
if (is_category()) {
$sql = str_replace("cms_posts.post_type = 'post'", "cms_posts.post_type='post' OR cms_posts.post_type = 'news' OR cms_posts.post_type='event'", $sql);
}
return $sql;
}
add_filter('posts_where', 'sql_where_clause');
Конечно, вам нужно будет изменить его, добавив свои собственные типы записей. Я использовал этот подход, чтобы мой category.php работал со всеми пользовательскими типами записей, как если бы они должны были там быть по умолчанию. Это избавляет от множества проблем.
Примечание: Будьте внимательны к версии WordPress, на которой используете этот код. В более старых версиях WordPress использовалась таблица wp_posts вместо cms_posts, поэтому проверьте, какие имена таблиц вам нужны, иначе можно получить странные результаты (например, записи просто не будут отображаться)
