Plantilla single personalizada para una categoría específica
¿Cuál es la mejor manera (en términos de rendimiento y estructura de código) de crear una plantilla personalizada para una Entrada de WordPress que pertenezca a una categoría específica? Me di cuenta que no se puede simplemente crear single-catname.php
.
Hasta ahora he probado dos formas de cambiar la plantilla. Pero ¿cuál de estas (u otra) es la mejor?
EDICIÓN:
¿Alguna idea de cómo incluir todas las subcategorías/categorías padre y demás? Me acabo de dar cuenta que solo muestra la categoría principal...
1. Agregado a functions.php
function get_custom_cat_template($single_template) {
global $post;
if ( in_category( 'movies' )) {
$single_template = dirname( __FILE__ ) . '/single-movies.php';
}
return $single_template;
}
add_filter( "single_template", "get_custom_cat_template" ) ;
2. Colocar el siguiente código en single.php (en lugar de todo el otro código) y crear un single-template.php
(con el código de single.php) y un single-movies.php
personalizado
<?php
if(has_term('movies', 'category', $post)) {
get_template_part('single-movies', 'movies');
} else {
// usar el archivo de plantilla predeterminado single-template.php
get_template_part('single-template');
}
?>

Desde mi comentario al OP
Mi opinión, usa con lo que te sientas cómodo. Si hay alguna diferencia de rendimiento será mínima/irrelevante. Mi preferencia, usa el filtro
Para llegar a tu verdadera preocupación/pregunta, en mi opinión, el mejor enfoque será usar el ID de la categoría padre y trabajar desde ahí. Será el que menos recursos consuma. La ingeniería inversa puede convertirse en un gasto innecesario de recursos.
Utiliza get_categories
para obtener las categorías hijas de la categoría dada. Puedes usar cualquiera de estos dos parámetros: parent
o child_of
parent (entero)
Muestra solo categorías que sean descendientes directos (es decir, solo hijos) de la categoría identificada por su ID. Esto NO funciona como el parámetro 'child_of'. No hay valor por defecto para este parámetro. [Desde la versión 2.8.4]
child_of (entero)
Muestra todas las categorías que sean descendientes (es decir, hijos y nietos) de la categoría identificada por su ID. No hay valor por defecto para este parámetro. Si se usa este parámetro, hide_empty se establece en false.
Una vez que tengas estas categorías, usa wp_list_pluck
para obtener los campos catID, name o slug del array de categorías devuelto. Este array se usará para verificar si un post pertenece a alguna de estas categorías. Puedes usar has_category
o in_category
Así es como puedes extender tu código para asegurarte de que los posts que pertenecen a la categoría padre o a sus descendientes usen la plantilla dada
add_filter( 'single_template', function ( $single_template ) {
$parent = '21'; //Cambia por tu ID de categoría
$categories = get_categories( 'child_of=' . $parent );
$cat_names = wp_list_pluck( $categories, 'name' );
if ( has_category( 'movies' ) || has_category( $cat_names ) ) {
$single_template = dirname( __FILE__ ) . '/single-movies.php';
}
return $single_template;
}, PHP_INT_MAX, 2 );

¿Algún comentario sobre esto? Sería apreciado (y de buena educación) si puedes dejar comentarios en tus preguntas abiertas. No solo te beneficiaría a ti, sino también a otros usuarios que encuentren tus preguntas a través de motores de búsqueda. Simplemente abandonar tus preguntas como lo has hecho podría llevar a que otros usuarios ignoren tus preguntas en el futuro. Por favor, ayúdanos (y a ti mismo) a mantener este sitio y tus preguntas constructivas. Gracias por entender :-)

paso 1: Crear o copiar content-single.php y crear un nuevo archivo. Ejemplo: content-tuCategoria.php
paso 2: Abrir single.php y reemplazar este get_template_part('content','single');
por el siguiente código
if(is_category('tuCategoria')){
get_template_part('content','tuCategoria');
}else{
get_template_part('content','single');
}
El parámetro puede ser ID de Categoría, Título de Categoría, Slug de Categoría o un Array de IDs, nombres y slugs.

Esta es una forma conveniente de hacerlo, encontrada aquí. Pega este código en tu archivo function.php
.
// Plantilla personalizada para entradas individuales por categoría
// https://halgatewood.com/wordpress-custom-single-templates-by-category
add_filter('single_template', 'check_for_category_single_template');
function check_for_category_single_template( $t )
{
foreach( (array) get_the_category() as $cat )
{
if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php";
if($cat->parent)
{
$cat = get_the_category_by_ID( $cat->parent );
if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php";
}
}
return $t;
}
Para más información, visita https://halgatewood.com/wordpress-custom-single-templates-by-category

function get_custom_cat_template($single_template) {
global $post;
if ( in_category( 'nombre-de-categoria' )) { // Comprueba si el post está en la categoría especificada
$single_template = dirname( __FILE__ ) . '/single-template.php'; // Asigna una plantilla personalizada
}
return $single_template; // Devuelve la plantilla modificada
}
add_filter( "single_template", "get_custom_cat_template" ) ; // Aplica el filtro para modificar la plantilla

¿LAS SOLUCIONES ANTIGUAS NO FUNCIONAN PARA LAS NUEVAS PLANTILLAS DE WORDPRESS (PLANTILLAS DE BLOQUES)?
Para aquellos que lleguen aquí desde google después del 2022:
Si estás trabajando con plantillas de bloques, el nuevo sistema de plantillas para WP, donde los archivos de plantilla no son archivos .php sino simplemente archivos .html que incluyen códigos de bloques, puedes usar esta respuesta:
Simplemente crea single-post-[slug de categoría]-article.html. Funciona.
Más precisamente, este es el orden que sigue WP para buscar archivos de plantilla para single posts:
- single-post-[slug de categoría]-article.html
- single-post.html
- single.html
