¿Puedo asignar una plantilla a un tipo de entrada personalizada?
¿Puedo asignar un archivo de plantilla a un tipo de entrada personalizada?
He creado un tipo de entrada personalizada llamado items
, y me gustaría asignar plantillas a los items como se puede hacer con las páginas.

A partir de la versión 4.7 de WordPress, ahora puedes asignar plantillas personalizadas de páginas a otros tipos de entradas además de las páginas.
Para lograr esto, además del encabezado de archivo "Template Name", los tipos de entradas compatibles con una plantilla se pueden especificar usando "Template Post Type:" como se muestra a continuación.
<?php
/*
Template Name: Diseño de página de ancho completo
Template Post Type: post, page, product
*/
Puedes obtener más información sobre esto en las siguientes páginas.
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/

Puedes crear plantillas para tipos de posts personalizados creando archivos, como por ejemplo:
single-mycustomposttype.php
Consulta la Jerarquía de Plantillas en el codex.
Nota: esto ya ha sido respondido anteriormente.

Gracias por eso, pero lo que me gustaría saber es si es posible agregar plantillas personalizadas a tipos de publicaciones personalizadas. Por ejemplo, ¿puedo crear dos plantillas y asignar cada una a su respectiva publicación? Según entiendo, eso solo permite especificar un archivo de plantilla para manejar ese tipo de publicación específica.

Entiendo, si necesitas diferentes plantillas para publicaciones individuales, es posible que desees crear varios tipos de publicaciones personalizadas, según cada plantilla necesaria. Supongo que eso depende de cuántas plantillas diferentes necesites. ¿Qué vas a hacer en las plantillas que necesita ser diferente en cada publicación?

Esta respuesta ahora está desactualizada. Consulta la respuesta de Vinod Dalvi.

Esto es lo que funciona para mí:
add_filter('single_template', function($original){
global $post;
$post_name = $post->post_name;
$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;
});
Por lo tanto, dado un post de tipo de post personalizado foobar
y un slug de hello-world
, el código anterior cargaría la plantilla single-foobar-hello-world.php
, si existiera.

Para aquellos que lleguen a este hilo a través de Google, WP 4.7 introdujo plantillas para todos los tipos de publicaciones. Consulta Make WP Core para una guía completa. Ya no estás restringido a una sola plantilla para todos tus CPT (Custom Post Types), puedes asignar plantillas individuales publicación por publicación, al igual que puedes hacer con las Páginas.

Esto es un poco antiguo pero también puedes probar esto:
Crea una plantilla para el tipo de contenido personalizado:
single-*slug-del-tipo-de-contenido-personalizado*.php
El archivo debe verificar el slug y comprobar si existe un archivo, si no, recurrir a un archivo de plantilla predeterminado:
<?php
$slug = get_post_field( 'post_name', get_post() );
$slug = ( locate_template( 'templates/*slug-del-tipo-de-contenido-personalizado*/' . $slug . '.php' ) ) ? $slug : 'default';
get_template_part( 'templates/*slug-del-tipo-de-contenido-personalizado*/' . $slug );
?>
Reemplaza todas las instancias de custom-post-type-slug con el slug real de tu tipo de contenido personalizado.
Yo hago esto para facilitar el uso y por organización. Me parece más limpio que tener todos los archivos en la carpeta raíz del tema.
Ejemplo de estructura de carpetas:
raiz-del-tema
| |single-cases.php
|-templates
| --cases
| |default.php
| |case-one.php
| |case-two.php

Esto es muy sencillo de hacer.
Crea un nuevo archivo PHP en el directorio raíz de tu tema y agrega esto al inicio:
<?php /*
* Template Name: Mi vista personalizada
* Template Post Type: Post_typename // aquí necesitas añadir el nombre de tu tipo de entrada personalizado
*/ ?>
Un ejemplo completo sería el siguiente:
<?php /*
* Template Name: Mi vista personalizada
* Template Post Type: Post_typename // aquí necesitas añadir el nombre de tu tipo de entrada personalizado
*/ ?>
<?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" alt="Miniatura del post" title="Miniatura destacada">
<?php endif;?>

Primero crea una página llamada "Artículos" (o el nombre que prefieras) que muestre el contenido del tipo de entrada "items", luego crea un archivo de plantilla como el siguiente y nómbralo "template-items". Selecciona esa plantilla para la página que has creado.
<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>

Trabajamos en otra solución utilizando el plugin de plantillas personalizadas para entradas
