Cómo mostrar publicaciones de la taxonomía actual en la página de archivo

8 jun 2013, 18:44:20
Vistas: 15.4K
Votos: 4

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(); ?>
1
Comentarios

posts_per_page no funciona, solo devuelve un post.

Chozen Chozen
20 ene 2015 23:06:21
Todas las respuestas a la pregunta 2
5
11

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

8 jun 2013 19:43:47
Comentarios

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

Milo Milo
8 jun 2013 21:35:09

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

s_ha_dum s_ha_dum
8 jun 2013 21:36:47

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

Milo Milo
8 jun 2013 21:43:02

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

s_ha_dum s_ha_dum
8 jun 2013 21:48:35

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

Chozen Chozen
21 ene 2015 20:12:21
2

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.

8 jun 2013 19:36:57
Comentarios

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

Milo Milo
8 jun 2013 21:14:02

Ok, si necesitas el WP_Query adicional, deberías revisar la buena respuesta proporcionada por @s_ha_dum más abajo.

birgire birgire
8 jun 2013 21:40:16