WordPress : Plantilla single.php
→ La plantilla single.php muestra el contenido de las entradas o post que viene hacer una publicación individual.
→ Si has creado tu propio tema y no has Declarado la compatibilidad con WooCommerce el detalle de nuestros productos lo mostara usando la plantilla single.php
Recuerda con el archivo archive.php nos servira para listar las entradas y con single.php vemos su contenido.
Por defecto, WordPress usa la plantilla de publicación única basada en la jerarquía de plantillas de WordPress. Todos los temas vienen con una plantilla single.php que se usa como predeterminada para mostrar todas sus publicaciones individuales.
El archivo single.php se usa cuando hace clic en el título de la publicación en la página de inicio del blog y se ve solo la publicación individual.
Jerarquia de single.php en WordPress

<!-- Recuerda como estamos en single.pgp solo nos mostrara un solo post es decir el post
que estamos viendo actualmente -->
<div class="single_post" id="single_post_id">
<?php
if ( have_posts() ){ /* si existen post */
while ( have_posts()) { /* hacemos un recorrido de los post */
/* the_post() recuperar información referida a la entrada específica usando cualquier Template Tag de WordPress */
the_post(); /* imprimimos el post - */
/* Si hay categorias o etiquetas en la publicacion actual */
if ( has_category() || has_tag() ){ ?>
<div class="cat_post">
<span>Categorias</span>
<h3><?php the_category(' - ') ?></h3>
</div>
<?php
} /* fin si existe categoria */
} /* fin while recorrido post*/
} /* fin si existen post */
?>
</div>
En WordPress se usa la plantilla single.php para el detalle de los posts. Podemos crear plantillas para los posts de un custom post type concreto siguiendo la nomenclatura single-{$posttype}.php
¿pero qué pasa si queremos tener plantillas single.php diferentes para cada categoría?
El poder diferenciar las plantillas de los posts por categoría es una una situación que nos podemos encontrar comúnmente. Por ejemplo, tener una categoría «noticias» y querer que la plantilla de todos los posts de noticias tenga una maquetación diferente, o cargue algún elemento adicional en el sidebar, etc…
En este artículo vamos a ver un par de soluciones a este problema. La primera pasa por duplicar el archivo single.php y renombrarlo por single-default.php. A continuación editamos el archivo single.php y usando los condicionales de WordPress podemos filtrar la categoría (por ID o por slug) y cargar mediante PHP la plantilla correspondiente:
<?php
// Filtrando por ID
if (in_category(1)) {
include(TEMPLATEPATH . '/single1.php');
} elseif (in_category(2)) {
include(TEMPLATEPATH . '/single2.php');
} else {
include(TEMPLATEPATH . '/single-default.php');
}
// Filtrando por slug
if (in_category('noticias')) {
include(TEMPLATEPATH . '/single-noticias.php');
} elseif (in_category('eventos')) {
include(TEMPLATEPATH . '/single-eventos.php');
} else { // Sino, cargo otro single por defecto
include(TEMPLATEPATH . '/single-default.php');
}
De este modo incluiremos el archivo correspondiente si cumple cualquier condición de las que hemos planteado, y en caso contrario cargaremos el archivo single-default.php, que recordemos es copia del archivo single.php original.
amos a ver ahora otra solución más elegante: utilizaremos el filtro single_template de WordPress, donde llamaremos a una función que recorrerá las categorías del post, y cargará si encuentra un archivo single-nombredelacategoria.php (buscaremos por el slug de la categoría). En caso contrario devolverá single.php. Pondremos en nuestro functions.php:
<?php
function custom_single_template($the_template) {
foreach ( (array) get_the_category() as $cat ) {
if ( locate_template("single-{$cat->slug}.php") ) {
return locate_template("single-{$cat->slug}.php");
}
}
return $the_template;
}
add_filter( 'single_template', 'custom_single_template');
Hay que tener en cuenta que el nombre que asignemos al fichero no coincida con el patrón single-{$posttype}.php de un custom post type existente. Es decir, si tenemos un custom post type Eventos y una categoría con el mismo nombre, se produciría un conflicto.Utilizamos la función locate_template() para buscar en nuestro tema la plantilla correspondiente. Busca primero en STYLESHEETPATH, luego en TEMPLATEPATH. De este modo, un tema hijo puede sobreescibir una plantilla del tema padre.
Comentarios
Muy bueno, gracias…pero una pregunta, como puedo quitar el encabezado y el pie solo en
single-nombredelacategoria.php. se puede hacer esto? como? .
Entiendo que lo que quieres hacer es quitar parte de lo que se carga en el header y footer sólo para el caso de una categoría concreta, no es así?
Con la función condicional is_category() pasándole el id de la categoría concreta puedes hacerlo. Tienes más info en el codex: https://developer.wordpress.org/reference/functions/is_category/
Quizá lo más fácil es lo siguiente:
Imaginamos que tu categoría concreta se llama «Noticias»
– duplica tu archivo header.php y llámalo header-noticias.php
– Edítalo y borra los menús, el logo, o lo que no quieras que aparezca en la categoría noticias.
– Edita la plantilla single-noticias.php y donde tienes la llamada a get_header() cámbialo por get_header( ‘noticias’ );
– De este modo, cuando estés en esa plantilla, cargarás la cabecera donde has eliminado el menú, el logo o lo que tengas
– Lo mismo para el footer