Creare una pagina 'single' per un Custom Post Type
Ok, ho installato il plugin Custom Post Type UI e ne ho creato uno. Ho poi aggiunto un nuovo post. Nel mio tema, ho un pezzo di codice come questo:
<?php
$loop = new WP_Query( array(
'post_type' => 'case studies', /* modifica questa riga */
'posts_per_page' => 15 ) );
?>
<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>" >
<?php the_post_thumbnail('thumbnail'); ?>
</a>
<?php endwhile; ?>
Ora, innanzitutto se clicco sulla miniatura, ottengo un errore nel browser che indica un loop di reindirizzamento, ma in secondo luogo vorrei sapere esattamente quali file devo creare per visualizzare un singolo post di questo custom post type. E cosa inserire in quel file.

Utilizza single-{posttype}.php
per il template singolo. Inoltre, se registri il tuo post type con l'argomento has_archive
impostato a true
, puoi usare archive-{posttype}.php
per il tuo template archivio, il che ti permetterà di saltare quella query che hai lì, dato che l'oggetto globale $wp_query
sarà già popolato con il tuo custom post type.
A proposito, hai uno spazio nel tuo argomento post_type
, che causerà un problema.
Dai un'occhiata alla Gerarchia dei Template, e considera di registrare i tuoi CPT usando codice in un plugin piuttosto che utilizzare un plugin CPT UI.

Non è necessario poiché WordPress utilizzerà il template di pagina predefinito, tuttavia puoi creare un file personalizzato single-cpt.php dove cpt è il nome del tuo tipo di post registrato.
<?php
get_header(); ?>
<div id="main-content" class="main-content">
<div id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php
// Avvia il Loop.
while ( have_posts() ) : the_post();
// Includi il template del contenuto della pagina.
get_template_part( 'content', 'page' );
endwhile;
?>
</div><!-- #content -->
</div><!-- #primary -->
</div><!-- #main-content -->
<?php
get_sidebar();
get_footer();

Potresti semplicemente scrivere questo nel tuo file single.php (all'interno del loop) e visualizzare i campi necessari all'interno dell'istruzione if.
if($post_type == 'case_studies') { // potrebbe essere necessario senza spazi (nome macchina)
echo '<h1>'.get_the_title().' varianti</h1>';
// ID del post
$post_id = get_the_ID();
get_post_meta($post_id, 'nome_campo_personalizzato', true);
<a href="<?php the_permalink() ?>"><?php the_post_thumbnail(); ?></a>
<?php endwhile; ?>
}
Un'altra opzione è creare un template di pagina. Copia il tuo file single.php e rinominalo in case_studies.php... all'inizio, all'interno dei tag php aggiungi:
<?php
/*
Template Name: Output Brand 04/12
*/
?>
e poi aggiungi la stessa istruzione if all'interno del loop di single.php come nell'esempio precedente...

Funziona, ma è una pessima, pessima pratica, il massimo a cui dovresti avvicinarti è get_template_part('stuff',$post->post_type);

Perché è codice sporco, hai una tonnellata di istruzioni if else e codice duplicato. Saresti meglio a creare un file template come 'content.php' e usare get_template_part('content',$post_type);
e usare content-case_studies.php
per sovrascriverlo su base per tipo di post

In questo modo il tuo single.php rimane leggibile. Anche in quel caso sarebbe meglio farlo nel modo corretto e usare single-case_studies.php

Custom Post Type in WordPress. Quattro passi fondamentali. Passo 1: Percorso del file: theme/function.php nel tuo tema. Incolla il codice in function.php (registra il custom post type)
<?php
add_action( 'init', 'custom_post_type_func' );
function custom_post_type_func() {
//posttypename = services
$labels = array(
'name' => _x( 'Servizi', 'services' ),
'singular_name' => _x( 'servizio', 'services' ),
'add_new' => _x( 'Aggiungi nuovo', 'services' ),
'add_new_item' => _x( 'Aggiungi nuovo servizio', 'services' ),
'edit_item' => _x( 'Modifica servizio', 'services' ),
'new_item' => _x( 'Nuovo servizio', 'services' ),
'view_item' => _x( 'Visualizza servizio', 'services' ),
'search_items' => _x( 'Cerca servizi', 'services' ),
'not_found' => _x( 'Nessun servizio trovato', 'services' ),
'not_found_in_trash' => _x( 'Nessun servizio trovato nel cestino', 'services' ),
'parent_item_colon' => _x( 'Servizio genitore:', 'services' ),
'menu_name' => _x( 'Servizi', 'services' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'description' => 'Ciao, questo è il mio custom post type.',
'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'page-attributes' ),
'taxonomies' => array( 'category', 'post_tag', 'page-category' ),
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'has_archive' => true,
'query_var' => true,
'can_export' => true,
'rewrite' => true,
'capability_type' => 'post'
);
register_post_type( 'services', $args );
}
?>
Passo 2: come mostrare il custom post type di WordPress in una pagina template?
Puoi mostrarlo ovunque nella pagina template in questo modo:
<?php $args = array( 'post_type' => 'services', 'posts_per_page' => 20 );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post(); ?>
<div class="services-items">
<?php the_title();
if ( has_post_thumbnail( $post->ID ) ) {
echo '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( $post->post_title ) . '">';
echo get_the_post_thumbnail( $post->ID, 'thumbnail' );
echo '</a>'; }
?>
</div>
<?php endwhile; ?>
Passo 3: Crea un nuovo template per mostrare il singolo post in questo modo
single-{nome custom post type}.php oppure single-services.php
Passo 4: Incolla il codice nel file single-services.php
<?php /* The loop */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<div class="main-post-div">
<div class="single-page-post-heading">
<h1><?php the_title(); ?></h1>
</div>
<div class="content-here">
<?php the_content(); ?>
</div>
<div class="comment-section-here"
<?php //comments_template(); ?>
</div>
</div>
<?php endwhile; ?>
Questo è un esempio di custom post type con pagina singola post.
