Crear single.php para una categoría específica por ID de categoría

18 nov 2014, 15:04:02
Vistas: 14.1K
Votos: 0

Estoy intentando crear una plantilla para una categoría específica con ID 1, por ejemplo. La plantilla debería aplicarse a todas las páginas que pertenecen a esta categoría. Por lo tanto, debería ser algo como single-1.php.

He probado muchas soluciones que encontré en la web, incluyendo esta, pero parece que nada funciona para mí.

1
Comentarios

O podrías usar solo el single.php y en el contenido ajustas basado en una declaración if (por ejemplo, <?php if ( in_category(20) ) { ?>).

Aibrean Aibrean
5 ago 2015 17:05:16
Todas las respuestas a la pregunta 4
15

Puedes usar esta función para añadir plantillas específicas de categoría en las páginas individuales de tu sitio web. Esto va en el archivo functions.php.

Puedes definir tantas plantillas individuales como desees.

function wpse_category_single_template( $single_template ) {
    global $post;
    $all_cats = get_the_category();

    if ( $all_cats[0]->cat_ID == '1' ) {
        if ( file_exists(get_template_directory() . "/single-cat1.php") ) return get_template_directory() . "/single-cat1.php";
    } elseif ( $all_cats[0]->cat_ID == '2' ) {
        if ( file_exists(get_template_directory() . "/single-cat2.php") ) return get_template_directory() . "/single-cat2.php";
    }
    return $single_template;
}
add_filter( 'single_template', 'wpse_category_single_template' );

Aquí he usado single-cat1.php para la categoría con ID 1 y single-cat2.php para la categoría con ID 2. Puedes nombrar estas plantillas individuales como consideres adecuado.

Esta función también utiliza como respaldo predeterminado single.php si no existen single-cat1.php o single-cat2.php.

EDIT 1

He estado usando el código anterior en 2 de mis sitios web y funciona correctamente en la última versión de WordPress.

Pega esto en tu archivo functions.php:

function show_template() {
    global $template;
    print_r($template);
}
add_action( 'wp_head', 'show_template' );

Esto mostrará el archivo de plantilla utilizado en cada página/entrada. Ahora accede a tu sitio web y comprueba si se está utilizando el archivo de plantilla correcto o no. Si sigue mostrando single.php, entonces hay algo mal en tu código.

EDIT 2

Aquí está tu código para eso.

function wpse_category_single_template( $single_template ) {
    global $post;
    $all_cats = get_the_category();

    if ( in_category(6) ) {
        if ( file_exists(get_template_directory() . "/page-custom.php") ) {
          return get_template_directory() . "/page-custom.php";
        } else {
          return get_template_directory() . "/page.php";
        }
    }
    return $single_template;
}
add_filter( 'single_template', 'wpse_category_single_template' );
18 nov 2014 15:13:10
Comentarios

No uses TEMPLATEPATH. Mira esto

Pieter Goosen Pieter Goosen
18 nov 2014 15:33:01

Y es mejor usar locate_template() en lugar de "if file_exists() then return"

cybmeta cybmeta
18 nov 2014 15:38:05

@PieterGoosen acaba de hacer ese cambio. Aunque el ticket dice que TEMPLATEPATH está obsoleto, no muestra ninguna advertencia en WordPress. Gracias :)

Robert hue Robert hue
18 nov 2014 15:39:36

¡Gracias chicos!

Intenté aplicar este código y todavía no funciona para mí.

Después de agregar esta función a mi function.php y definí el single-cat.php, las páginas relacionadas (con el mismo ID de categoría) permanecieron sin cambios con la plantilla básica single.php. ¿Alguna idea de por qué?

Netsh Netsh
18 nov 2014 21:10:27

@Netsh Por favor revisa la edición en mi respuesta. Y también si todavía tienes problemas, edita tu pregunta y publica el código que agregaste en tu functions.php.

Robert hue Robert hue
18 nov 2014 21:28:22

Hola. ¡Fue una gran idea! ¡gracias! ahora veo que debería definir la plantilla de categoría para page.php y no para single.php. ¿Qué debería cambiar para que el código funcione para mí?

Netsh Netsh
18 nov 2014 23:18:53

Debería ser algo así: si el ID de la categoría de la página es 6, usa page-custom.php, de lo contrario, usa page.php

Netsh Netsh
19 nov 2014 00:52:17

@Netsh ¿podrías revisar mi código? Este código no puede funcionar, porque Robert asume que la categoría verificada es la primera que fue asignada. Esto es incorrecto. ¿Qué pasa si el cat_ID 1 es el tercer elemento de $all_cats?

Marcin Marcin
19 nov 2014 09:54:52

@Netsh por favor revisa Edit 2 para tu respuesta exacta.

Robert hue Robert hue
19 nov 2014 10:00:23

@Roberthue tu código está mal... ¿Qué pasa si el objeto de categoría con cat_ID == 6 está en $all_cats con el índice [1]? ¿Qué pasa si $all_cat[0]->cat_ID == 6 es falso pero $all_cat[1]->cat_ID es verdadero?

Marcin Marcin
19 nov 2014 11:05:35

Bueno, primero que nada gracias. ¡Aprecio tu ayuda! Probé este código y todavía no funciona para mí. Parece que el sistema no reconoce esta función, y aparece el estilo predeterminado de page.php...

Netsh Netsh
19 nov 2014 11:48:45

@Netsh prueba el último código de nuevo y avísame, agregué la sugerencia de marcin. Debería funcionar porque lo he estado usando en 2 de mis sitios web sin ningún problema. También asegúrate de que ninguna otra función sobrescriba su código/efecto.

Robert hue Robert hue
20 nov 2014 11:21:28

Lo siento... no funciona para mí... pero gracias a todos por los esfuerzos... revisé mis otros functions.php y no encontré ninguna función problemática... intentaré en otra dirección.. Gracias de nuevo.

Netsh Netsh
20 nov 2014 21:55:22

¿Por qué no usar in_category() o has_category() para probar si un post tiene una categoría específica asignada? ;-)

Pieter Goosen Pieter Goosen
1 ene 2016 22:15:00

Probé este código. Descubrí que get_template_directory() obtiene el tema padre, no el tema hijo. Por lo tanto, no puede encontrar el nuevo archivo de plantilla.

Nora McDougall-Collins Nora McDougall-Collins
17 mar 2021 18:21:05
Mostrar los 10 comentarios restantes
1

Usa el filtro single_template para cambiar el archivo de plantilla y la función in_category para verificar si esta entrada pertenece a una categoría.

add_filter( 'single_template', 'my_single_template' );
function my_single_template($single_template)
{
    if (in_category(1)) {
        $file = get_template_directory().'/single-cat-1.php';
        if ( file_exists($file) ) {
            return $file;
        }
    }
    return $single_template;
}
18 nov 2014 15:56:10
Comentarios

¿Podría recibir retroalimentación? ¿Qué está mal con mi respuesta? Si votas negativo, por favor agrega un comentario.

Marcin Marcin
19 nov 2014 08:47:31
0

Puedes hacer uso del filtro single_template, la condición in_category() y el objeto consultado para verificar si la publicación actual está asociada a nuestra categoría especificada y, de ser así, incluir nuestra plantilla deseada

add_filter( 'single_template', function ( $template )
{
    // Obtener la publicación individual actual
    $post_id = $GLOBALS['wp_the_query']->get_queried_object_id();

    // Verificar si nuestra publicación pertenece a la categoría 1
    if ( !in_category( 1, $post_id ) ) {
        return $template;
    }

    // Nuestra publicación está asociada a la categoría 1, busquemos single-1.php
    $locate_template = locate_template( 'single-1.php' );

    // Verificar si nuestra plantilla existe, si es así incluirla, de lo contrario salir
    if ( !$locate_template ) {
        return $template;
    }

    return $locate_template;
});
6 mar 2016 07:29:07
0

Vale la pena mencionar que si estás usando un tema hijo, entonces utiliza el siguiente código para recuperar la plantilla de publicación única de categoría.

function wpse_category_single_template( $single_template ) {
    global $post;
    $all_cats = get_the_category();
    if ( $all_cats[0]->slug == 'cat1' ) {
        if ( file_exists(get_stylesheet_directory() . "/single-cat1.php") ) return get_stylesheet_directory() . "/single-cat1.php";
    }
    return $single_template;
}
add_filter( 'single_template', 'wpse_category_single_template' );
26 nov 2018 01:08:10