Crear single.php para una categoría específica por ID de categoría
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í.

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

No uses TEMPLATEPATH
. Mira esto

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

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

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

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í?

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

@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?

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

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.

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

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;
}

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

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