Blog sobre desarrollo WordPress en Español Desarrollo WordPress en Español
template single

Cómo definir una plantilla diferente por categoría para el detalle de los posts

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 comunmente. 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.

Vamos 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:

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');

NOTA

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. Éste aporte es gracias a Juan Padial

Con éste simple código podremos crear plantillas diferentes en función de nuestras necesidades para los posts de cada categoría.

Puede que también te interese

Sácale partido al personalizador de WordPress
Sácale partido al personalizador de WordPress
Con este título he tenido el honor y el privilegio de participar como ponente en la WordCamp Santander 2016. El personalizador de WordPress apareció en…
Cómo permitir a un colaborador subir archivos en WordPress
Cómo permitir a un colaborador subir archivos en WordPress
Como sabéis, existen diferentes tipos de usuarios en WordPress: Administrador, Editor, Autor, Colaborador y Suscriptor: Cada uno de estos roles tiene permitidas una serie de…
Cómo personalizar AMP en WordPress
Cómo personalizar AMP en WordPress
AMP es el proyecto de Google y varios partners (entre los que se encuentra WordPress) para ofrecer a los usuarios páginas ultra rápidas. Son las…
Cómo desactivar Emojis en WordPress
Cómo desactivar Emojis en WordPress
A partir de la versión 4.2 de WordPress se ha introducido una nueva característica: Emojis Icons. Permite el uso de los iconos Emoji en los…