Cómo mostrar publicaciones de la taxonomía actual en la página de archivo
Estoy usando el siguiente código para mostrar una publicación aleatoria de la categoría actual en la página de archivo de categoría (usando archive.php). Sin embargo, en las páginas de archivo de Etiquetas o Taxonomías, la publicación no se muestra correctamente desde la Etiqueta o Taxonomía actual (debido a la limitación de solo categorías). ¿Cómo puedo modificarlo para que funcione con Etiquetas y Taxonomías (o solo Taxonomías ya que Categoría y Etiqueta también son Taxonomías)? ¡Gracias!
// asignar la variable como categoría actual
$currentcategory = $cat;
// concatenar la consulta
$args = 'showposts=1&cat=' . $currentcategory . '&orderby=rand';
$random_query = new WP_Query( $args );
// El Loop
if ( $random_query->have_posts() ) {
while ( $random_query->have_posts() ) {
$random_query->the_post();
// plantilla personalizada para la publicación aleatoria
}
} else {
// no se encontraron publicaciones
}
// Restaurar datos originales de la publicación
wp_reset_postdata();
Código editado según la respuesta de s_ha_dum:
<?php // La Consulta
if (is_tax() || is_category() || is_tag() ){
$qobj = $wp_query->get_queried_object();
// concatenar la consulta
$args = array(
'posts_per_page' => 1,
'orderby' => 'rand',
'tax_query' => array(
array(
'taxonomy' => $qobj->taxonomy,
'field' => 'id',
'terms' => $qobj->term_id
)
)
);
}
$random_query = new WP_Query( $args );
// El Loop
if ( $random_query->have_posts() ) {
while ( $random_query->have_posts() ) {
$random_query->the_post(); ?>
//Plantilla HTML
<?php }
} else {
// no se encontraron publicaciones
}
/* Restaurar datos originales de la publicación */
wp_reset_postdata(); ?>
Necesitarás obtener el objeto de consulta para la página y rellenar la información de tu taxonomía de forma dinámica.
if (is_tax() || is_category() || is_tag() ){
$qobj = get_queried_object();
// var_dump($qobj); // solo para depuración
// concatenar la consulta
$args = array(
'posts_per_page' => 1,
'orderby' => 'rand',
'tax_query' => array(
array(
'taxonomy' => $qobj->taxonomy,
'field' => 'id',
'terms' => $qobj->term_id,
// también es posible usar un slug
// 'field' => 'slug',
// 'terms' => $qobj->name
)
)
);
$random_query = new WP_Query( $args );
// var_dump($random_query); // solo para depuración
if ($random_query->have_posts()) {
while ($random_query->have_posts()) {
$random_query->the_post();
// Mostrar
}
}
}
No está claro si necesitas este Loop además de el Loop principal o como reemplazo del mismo. Asumo que es "además", ya que eliminaría la funcionalidad de archivo si reemplazara la consulta principal. No tendrías archivos reales, solo una publicación aleatoria del archivo, lo cual no es muy útil por sí solo.
Podrías usar las plantillas de archivo category.php
y tag.php
para procesar etiquetas y categorías por separado. No necesitas usar archive.php
.
Referencia
http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
http://codex.wordpress.org/Function_Reference/get_queried_object

¡Gracias! El código es genial pero muestra todo el "objeto" de la taxonomía actual (¿debido a var_dump?). Lo modifiqué un poco para eliminar el var_dump y funciona bien sin mostrar el "objeto". No estoy seguro si el siguiente código es correcto en lógica, por favor ayúdame a revisarlo.

Sí, un var_dump
casi siempre es para depuración. Lo puse ahí para que pudieras "ver" con qué estás trabajando. ¿Qué "siguiente código"?

¡Ups! No puedo agregar código en el comentario. He añadido el código modificado en la pregunta original.

@Milo : Quieres que esa consulta esté tanto dentro del condicional como del Loop que la usa. Mira la edición. Mi culpa.

Lo siento, debería haber sido más específico, necesito este Loop además del Loop principal. Estoy haciendo un slider en la parte superior de la página category.php para mostrar la publicación más vista de la categoría actual que se está viendo. enlace

Podrías considerar usar la consulta principal con un hook personalizado pre_get_posts
:
add_action( 'pre_get_posts', 'custom_pre_get_posts' );
function custom_pre_get_posts( $query ) {
if ( is_admin() or ! $query->is_main_query() )
return;
if ( is_archive() ) {
$query->set( 'orderby', 'rand' );
$query->set( 'posts_per_page', 1 );
}
}
y el loop habitual, en lugar del WP_Query()
adicional.

¡Gracias! pre_get_posts
es genial pero modifica el loop principal y no podré mostrar publicaciones en las páginas de archivo. Pero realmente es una buena idea para alcanzar el objetivo de manera inteligente.
