Пользовательские типы записей на страницах категорий

22 февр. 2011 г., 19:47:27
Просмотры: 43.2K
Голосов: 6

Я работаю с пользовательским типом записей, который использует стандартные категории WordPress.
Мне удалось изменить шаблон категории для отображения моих пользовательских типов записей именно так, как мне нужно.

Проблема в том, что после этих изменений затрагиваются и обычные записи блога.

Конечно, я могу ограничить либо обычные записи блога, либо пользовательский тип записей одной категорией и создать category-ID.php для работы только с этой категорией.

Но я хочу узнать, есть ли более гибкое решение?
Возможно ли создать шаблоны категорий, специфичные для разных типов записей, т.е. один для отображения обычных записей, другой для пользовательских типов записей и т.д.?

Это вообще возможно? Если нет, какой лучший способ обойти эту проблему?

1
Комментарии

У меня есть решение: ваш шаблон произвольной таксономии должен называться taxonomy-{taxonomy}.php. Например, если ваша таксономия называется "cooking-categories", то ваш файл должен называться taxonomy-cooking-categories.php.

Kiran Kumar Kadavakollu Kiran Kumar Kadavakollu
4 апр. 2019 г. 11:34:48
Все ответы на вопрос 4
0

Для пользовательских типов записей с пользовательской таксономией вы можете создать шаблон для этой таксономии. Ваш шаблон пользовательской таксономии должен называться taxonomy-{taxonomy}.php. Например, если ваша таксономия называется "cooking-categories", вы должны назвать файл taxonomy-cooking-categories.php.

Больше информации о файлах шаблонов для специальных архивов таксономий можно найти в кодексе здесь: http://codex.wordpress.org/Template_Hierarchy#Custom_Taxonomies_display

22 февр. 2011 г. 20:13:13
0

Вы можете организовать это на основе типа записи следующим образом: допустим, у вас есть 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 без изменений.

Надеюсь, это поможет

22 февр. 2011 г. 20:36:29
0

Привет, @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"); ?>
23 февр. 2011 г. 06:51:42
1
-1

Более простое решение, если вы не хотите создавать новые файлы или возиться с запросами — использовать этот код в 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, поэтому проверьте, какие имена таблиц вам нужны, иначе можно получить странные результаты (например, записи просто не будут отображаться)

13 апр. 2011 г. 21:18:37
Комментарии

Насколько я помню, WordPress никогда не использовал по умолчанию префикс cms_ и всегда применял wp_, хотя этот префикс можно изменить для каждого сайта индивидуально. Правильнее использовать $wpdb->posts, а не пытаться угадать конкретный префикс.

s_ha_dum s_ha_dum
5 июн. 2013 г. 15:53:21