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

Начиная с WordPress версии 4.7, вы можете назначать пользовательские шаблоны страниц не только для страниц, но и для других типов записей.
Для этого, помимо заголовка файла Template Name, можно указать типы записей, поддерживаемые шаблоном, с помощью Template Post Type, как показано ниже.
<?php
/*
Template Name: Шаблон с полной шириной
Template Post Type: post, page, product
*/
Вы можете получить больше информации об этом на следующих страницах.
https://wptavern.com/wordpress-4-7-brings-custom-page-template-functionality-to-all-post-types https://make.wordpress.org/core/2016/11/03/post-type-templates-in-4-7/

Вы можете создать шаблон для пользовательских типов записей, создав файлы, например:
single-mycustomposttype.php
Смотрите Иерархию шаблонов в кодексе.
Примечание: этот вопрос уже был отвечен ранее.

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

Понятно. Если вам нужны разные шаблоны для отдельных записей, возможно, стоит создать несколько пользовательских типов записей, соответствующих каждому необходимому шаблону. Думаю, это зависит от того, сколько разных шаблонов вам нужно. Что именно в шаблонах должно отличаться для каждой записи?

Вот что работает у меня:
add_filter('single_template', function($original){
global $post;
$post_name = $post->post_name; // Получаем slug записи
$post_type = $post->post_type; // Получаем тип записи
$base_name = 'single-' . $post_type . '-' . $post_name . '.php'; // Формируем имя шаблона
$template = locate_template($base_name); // Ищем шаблон
if ($template && ! empty($template)) return $template; // Если найден - возвращаем
return $original; // Иначе возвращаем оригинальный шаблон
});
Таким образом, для записи пользовательского типа foobar
с ярлыком hello-world
этот код загрузит шаблон single-foobar-hello-world.php
, если он существует.

Для тех, кто попал на эту страницу из Google, в WP 4.7 были добавлены шаблоны для всех типов записей. Подробное руководство можно найти на Make WP Core. Теперь вы не ограничены одним шаблоном для всех ваших CPT (пользовательских типов записей) — вы можете назначать индивидуальные шаблоны для каждой записи, так же как это делается со Страницами.

Это немного устарело, но вы также можете попробовать такой вариант:
Создайте шаблон для пользовательского типа записи:
single-*custom-post-type-slug*.php
Файл должен проверять slug и убеждаться, существует ли файл, если нет — использовать шаблон по умолчанию:
<?php
$slug = get_post_field( 'post_name', get_post() );
$slug = ( locate_template( 'templates/*custom-post-type-slug*/' . $slug . '.php' ) ) ? $slug : 'default';
get_template_part( 'templates/*custom-post-type-slug*/' . $slug );
?>
Замените все вхождения custom-post-type-slug на реальный slug вашего пользовательского типа записи.
Я делаю так для удобства и организации. Мне кажется, это чище, чем хранить все файлы в корневой папке темы.
Пример структуры папок:
themeroot
| |single-cases.php
|-templates
| --cases
| |default.php
| |case-one.php
| |case-two.php

Это очень просто сделать.
Создайте новый PHP-файл в корневой директории вашей темы и добавьте в начало следующее:
<?php /*
* Template Name: Мой кастомный шаблон
* Template Post Type: Post_typename // здесь нужно указать название вашего типа записи
*/ ?>
Полный пример будет выглядеть следующим образом:
<?php /*
* Template Name: Мой кастомный шаблон
* Template Post Type: Post_typename // здесь нужно указать название вашего типа записи
*/ ?>
<?php get_header();?>
<div class="container pt-5 pb-5">
<?php if (has_post_thumbnail()):?>
<img src="<?php the_post_thumbnail_url('largest');?>" class="img-fluid">
<?php endif;?>

Сначала создайте страницу с названием "Товары" (или любым другим на ваше усмотрение), которая будет отображать контент из типа записей "Товары". Затем создайте файл шаблона, как показано ниже, и назовите его template-items. Выберите этот шаблон для созданной вами страницы.
<div class="container">
<div class="row">
<div class="col-md-9">
<div class="panel panel-default text-center">
<?php $loop = new WP_Query( array( 'post_type' => 'items', 'posts_per_page' => 5 ) ); ?>
<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
<?php the_title();?>
<?php if(has_post_thumbnail() ) { the_post_thumbnail(); } ?>
<?php the_content();?>
<?php endwhile; ?>
<?php wp_reset_query(); ?>
</div>
</div>
</div>
</div>

Мы разработали еще одно решение с использованием плагина пользовательских шаблонов записей
