Crear una página 'single' para un Tipo de Publicación Personalizada
Ok, instalé el plugin Custom Post Type UI y creé uno. Luego añadí una nueva publicación. En mi tema, tengo un código como este:
<?php
$loop = new WP_Query( array(
'post_type' => 'case studies', /* edita esta línea */
'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; ?>
Ahora, primero, si hago clic en la miniatura, obtengo un error en el navegador diciendo que está en un bucle de redirección, pero segundo, me gustaría saber exactamente qué archivos necesito crear para ver una publicación individual de este tipo de publicación personalizada. Y qué poner en ese archivo.

Utiliza single-{posttype}.php
para la plantilla de entrada individual. Además, si registras tu tipo de contenido con el argumento has_archive
establecido en true
, entonces podrás usar archive-{posttype}.php
para tu plantilla de archivo, lo que te permitirá omitir esa consulta que tienes ahí, ya que el objeto global $wp_query
ya estará poblado con tu tipo de contenido personalizado.
Por cierto, tienes un espacio en tu argumento post_type
, lo cual será un problema.
Consulta la Jerarquía de Plantillas, y considera registrar tus CPTs usando código en un plugin en lugar de utilizar un plugin de interfaz para CPTs.

No es necesario ya que WordPress usará la plantilla de página predeterminada, sin embargo puedes crear un archivo personalizado single-cpt.php donde cpt es el nombre de tu tipo de entrada registrado.
<?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
// Inicia el Loop.
while ( have_posts() ) : the_post();
// Incluye la plantilla de contenido de página.
get_template_part( 'content', 'page' );
endwhile;
?>
</div><!-- #content -->
</div><!-- #primary -->
</div><!-- #main-content -->
<?php
get_sidebar();
get_footer();

En la carpeta de tu tema hijo, donde cpt es el nombre de tu tipo de contenido personalizado.

Podrías simplemente escribir esto en tu archivo single.php (dentro del loop) y mostrar los campos que necesites dentro de la sentencia if.
if($post_type == 'case_studies') { // puede que necesites esto sin espacios (nombre de máquina)
echo '<h1>'.get_the_title().' sabores</h1>';
// ID del post
$post_id = get_the_ID();
get_post_meta($post_id, 'nombre_del_campo_personalizado', true);
<a href="<?php the_permalink() ?>"><?php the_post_thumbnail(); ?></a>
<?php endwhile; ?>
}
Otra opción es crear una plantilla de página. Copia tu archivo single.php y renómbralo como case_studies.php... en la parte superior dentro de las etiquetas php añade:
<?php
/*
Plantilla: Salida de marca 04/12
*/
?>
y luego añade la misma sentencia if dentro del loop de single.php como en el ejemplo anterior...

Esto funciona, pero es una mala, mala práctica, lo más cercano que deberías hacer es get_template_part('stuff',$post->post_type);

Porque es código impuro, tienes una tonelada de sentencias if else, y código duplicado. Sería mejor crear un archivo de plantilla como 'content.php', y usar get_template_part('content',$post_type);
y utilizar content-case_studies.php
para sobrescribirlo según el tipo de publicación

De esa manera tu single.php sigue siendo legible. Aun así, sería mejor hacerlo de la manera correcta y usar single-case_studies.php

Tipo de entrada personalizada en WordPress. Cuatro pasos básicos. Paso 1: Ubicación del archivo: tema/functions.php en tu tema. Pega el código en functions.php (registrar tipo de entrada personalizada)
<?php
add_action( 'init', 'custom_post_type_func' );
function custom_post_type_func() {
//posttypename = services
$labels = array(
'name' => _x( 'Servicios', 'services' ),
'singular_name' => _x( 'servicios', 'services' ),
'add_new' => _x( 'Añadir nuevo', 'services' ),
'add_new_item' => _x( 'Añadir nuevo servicio', 'services' ),
'edit_item' => _x( 'Editar servicio', 'services' ),
'new_item' => _x( 'Nuevo servicio', 'services' ),
'view_item' => _x( 'Ver servicio', 'services' ),
'search_items' => _x( 'Buscar servicios', 'services' ),
'not_found' => _x( 'No se encontraron servicios', 'services' ),
'not_found_in_trash' => _x( 'No se encontraron servicios en la papelera', 'services' ),
'parent_item_colon' => _x( 'Servicio padre:', 'services' ),
'menu_name' => _x( 'Servicios', 'services' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'description' => 'Hola, este es mi tipo de entrada personalizada.',
'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 );
}
?>
Paso 2: ¿Cómo mostrar el tipo de entrada personalizado de WordPress en la plantilla de página de WordPress?
Puedes mostrarlo en cualquier lugar de la plantilla de página así:
<?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; ?>
Paso 3: Crear una nueva plantilla para mostrar una entrada individual así
single-{nombre del tipo de entrada personalizada}.php o single-services.php
Paso 4: Pega el código en el archivo 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; ?>
Este es un ejemplo de tipo de entrada personalizada con página de entrada individual.
