Plantilla single personalizada para una categoría específica

29 nov 2014, 12:33:04
Vistas: 51.4K
Votos: 15

¿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');
}
?>
3
Comentarios

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

Pieter Goosen Pieter Goosen
29 nov 2014 12:40:43

Gracias por la rápida respuesta. ¿Alguna idea de cómo incluir también todas las subcategorías/padres y así sucesivamente? Me acabo de dar cuenta que ahora solo muestra la categoría principal...

NewUser NewUser
29 nov 2014 12:42:05
Todas las respuestas a la pregunta 5
2
13

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 );
29 nov 2014 21:33:14
Comentarios

¿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 :-)

Pieter Goosen Pieter Goosen
14 abr 2015 09:12:15

Funciona correctamente para mí. ¡Gracias!

FladeX FladeX
8 ago 2020 10:35:06
2

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.

1 dic 2014 05:13:41
Comentarios

in_category() *

Avishay28 Avishay28
19 abr 2016 12:42:27

Por favor corrige tu respuesta

Chris Pink Chris Pink
28 jun 2024 13:36:09
0

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

18 ago 2017 08:52:48
0
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
24 sept 2019 11:38:02
1
-1

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

  1. single-post-[slug de categoría]-article.html
  2. single-post.html
  3. single.html
15 mar 2023 17:03:30
Comentarios

No funciona en la versión 6.6.2

th00ht th00ht
24 sept 2024 11:01:37