Posso assegnare un template a un tipo di post personalizzato?
Posso assegnare un file template a un tipo di post personalizzato?
Ho creato un tipo di post personalizzato chiamato items
e vorrei assegnare dei template agli elementi come si può fare con le pagine.

A partire dalla versione 4.7 di WordPress, è ora possibile assegnare modelli di pagina personalizzati ad altri tipi di post oltre alle pagine.
Per ottenere questo risultato, oltre all'intestazione del file Template Name, i tipi di post supportati da un modello possono essere specificati utilizzando Template Post Type: come segue.
<?php
/*
Template Name: Layout a larghezza intera
Template Post Type: post, page, product
*/
Puoi ottenere maggiori informazioni su questa funzionalità nelle seguenti pagine.
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/

Puoi creare un template per i custom post type creando dei file, ad esempio:
single-mycustomposttype.php
Consulta la Gerarchia dei Template nel codex.
PS: questa domanda è già stata risposta in precedenza.

Grazie per il tuo contributo, ma quello che vorrei sapere è se è possibile aggiungere template personalizzati ai custom post type. Ad esempio, posso creare due template e assegnare ciascun template al rispettivo post? Per quanto ne so, questo permette di specificare solo un file template per gestire quel particolare post type.

Capisco, se hai bisogno di template diversi per i singoli post, potresti voler creare diversi custom post type, in base a ciascun template necessario. Immagino che dipenda da quanti template diversi ti servono. Cosa hai intenzione di fare nei template che deve essere diverso per ogni post?

Questa risposta è ora obsoleta. Consulta la risposta di Vinod Dalvi.

Ecco cosa funziona per me:
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;
});
Quindi, dato un post di tipo personalizzato foobar
con slug hello-world
, il codice sopra caricherebbe il template single-foobar-hello-world.php
, se esistesse.

Per chi arriva a questo thread tramite Google, WP 4.7 ha introdotto i template per tutti i tipi di post. Consulta Make WP Core per una guida completa. Non sei più limitato a un solo template per tutti i tuoi CPT, puoi assegnare template individuali post per post proprio come puoi fare con le Pagine.

Questo è un po' datato ma puoi anche provare questo:
Crea un template per il custom post type:
single-*slug-del-custom-post-type*.php
Il file dovrebbe verificare lo slug e controllare se esiste un file corrispondente, altrimenti utilizzare un template di fallback predefinito:
<?php
$slug = get_post_field( 'post_name', get_post() );
$slug = ( locate_template( 'templates/*slug-del-custom-post-type*/' . $slug . '.php' ) ) ? $slug : 'default';
get_template_part( 'templates/*slug-del-custom-post-type*/' . $slug );
?>
Sostituisci tutte le occorrenze di slug-del-custom-post-type con lo slug effettivo del tuo custom post type.
Io lo faccio per semplicità d'uso e scopi organizzativi. Mi sembra più pulito rispetto ad avere tutti i file nella cartella principale del tema.
Esempio di struttura delle cartelle:
radice-del-tema
| |single-cases.php
|-templates
| --cases
| |default.php
| |case-one.php
| |case-two.php

È molto semplice da fare.
Crea un nuovo file PHP nella directory principale del tuo tema e aggiungi questo in cima:
<?php /*
* Template Name: La mia vista personalizzata
* Template Post Type: Post_typename // qui devi aggiungere il nome del tuo custom post type
*/ ?>
Un esempio completo sarà il seguente:
<?php /*
* Template Name: La mia vista personalizzata
* Template Post Type: Post_typename // qui devi aggiungere il nome del tuo custom post type
*/ ?>
<?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="<?php the_title();?>" title="<?php the_title();?>">
<?php endif;?>

Per prima cosa crea una pagina chiamata Elementi (o come preferisci) che mostri il contenuto dal post type elementi, poi crea un file template come quello qui sotto e chiamalo template-elementi. Seleziona questo template per la pagina che hai creato.
<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>

Abbiamo sviluppato un'altra soluzione utilizzando il plugin per template di post personalizzati
