Problema con WP_Query personalizado mostrando posts duplicados

10 jul 2014, 20:40:26
Vistas: 15.3K
Votos: 0

OK,

He creado un WP_Query personalizado que obtiene el post_type post y lo muestra como una lista con estilos. Funciona bien y muestra la lista con estilos, pero debajo muestra todos los posts nuevamente pero en un formato completamente diferente (sin estilos).

<?php

// obtener todos los tipos de post
$args = array (
    'post_type'              => 'post',
    'post_status'            => 'publish',
    'pagination'             => true,
    'paged'                  => (get_query_var('paged') ? get_query_var('paged') : 1),
    'posts_per_page'         => 20,
    'order'                  => 'ASC',
    'orderby'                => 'date',
); ?>
<?php $wp_query = new WP_Query($args); ?>

<?php if ($wp_query->have_posts()): ?>
    <?php while($wp_query->have_posts()): $wp_query->the_post() ?>
        <div class="row">
            <div class="col-md-5">
                <a href="<?php the_permalink() ?>" class="fancybox">
                    <?php the_post_thumbnail('medium'); ?>
                </a>
            </div>
            <div class="col-md-7">

                <!-- título y extracto -->
                <h5><?php the_title() ?></h5>
                <?php the_excerpt() ?>

                <!-- botones del post -->
                <a href="<?php the_permalink() ?>" class="btn btn-primary">Ver historia completa</a>
                <?php if(get_field('comments_enable') !== false): ?>
                    <a href="<?php the_permalink() ?>#disqus_thread" class="btn btn-default"> Comentarios</a>
                <?php endif; ?>

            </div>
        </div>

        <hr style="margin: 10px 0; border-style: dotted; border-color: #333" class="row">

    <?php endwhile; ?>

    <!-- fila -->
    <div class="row">
        <div class="col-xs-6">
            <?php previous_posts_link('<i class="fa fa-arrow-left"></i> <span class="text">Página anterior</span>'); ?>
        </div>
        <div class="col-xs-6 text-right">
            <?php next_posts_link('<span class="text">Página siguiente</span> <i class="fa fa-arrow-right"></i>'); ?>
        </div>

    </div>

<?php else: ?>

    <p class="text-muted">No hay noticias en este momento, por favor revisa más tarde.</p>

<?php endif; unset($wp_query); wp_reset_postdata(); ?>

Todo esto está en una plantilla parcial y se llama usando el método get_template_part(). Si asigno el WP_Query a una variable diferente de $wp_query no se duplica, pero necesito que sea $wp_query para que los enlaces de paginación funcionen. También estoy eliminando $wp_query y reiniciando los datos del post al final del bucle. ¡Estoy desconcertado y espero que puedas ayudar!

2
Comentarios

¿Qué pasa si colocas wp_reset_postdata(); antes del else: y eliminas unset($wp_query);

Brad Dalton Brad Dalton
10 jul 2014 20:54:06

@BradDalton gracias por tu sugerencia pero sigue igual. Además de esa manera el postdata no se reiniciaría si no hay posts - aunque no estoy seguro si funcionalmente eso es un problema o no.

Chris Chris
10 jul 2014 21:33:16
Todas las respuestas a la pregunta 2
1

Utiliza wp_reset_query() para restaurar la consulta original. Esto también llama a wp_reset_postdata, por lo que puedes simplemente reemplazarlo.

10 jul 2014 22:25:04
Comentarios

Esto funcionó para mí, después de revisar el wp-includes/query.php puedo ver que esencialmente utiliza la técnica de @pieter-goosen al restaurar la consulta original. ¡Gracias por tu ayuda!

Chris Chris
11 jul 2014 11:25:15
2

Es una preferencia personal, pero no me gusta mucho usar $wp_query y complicar las cosas. Hay dos formas de resolver este problema, una, usando una variable temporal con $wp_query y dos, cambiando el nombre de tu variable y arreglando la paginación, lo cual recomendaría, de nuevo, es una preferencia personal.

MÉTODO 1

Como dije, puedes asignar una variable temporal a $wp_query y también eliminarla

<?php

// obtener todos los tipos de post
$args = array (
    'post_type'              => 'post',
    'post_status'            => 'publish',
    'pagination'             => true,
    'paged'                  => (get_query_var('paged') ? get_query_var('paged') : 1),
    'posts_per_page'         => 20,
    'order'                  => 'ASC',
    'orderby'                => 'date',
);
$temp = $wp_query; 
  $wp_query = null; 
  $wp_query = new WP_Query(); 
  $wp_query->query( $args );

<--- TU LOOP ETC--->

$wp_query = null; 
  $wp_query = $temp;  // Reset

MÉTODO 2

Este es el método que prefiero. Dale a tu variable un nombre único, por ejemplo, $my_query y corrige la paginación en next_posts_link. Así es como se verá ahora tu consulta personalizada. (Nota No es necesario abusar de la etiqueta php. Si no estás cambiando de php a html y viceversa, no tienes que abrir y cerrar etiquetas php para cada elemento como lo hiciste. Revisa mi código a continuación)

<?php

// obtener todos los tipos de post
$args = array (
    'post_type'              => 'post',
    'post_status'            => 'publish',
    'pagination'             => true,
    'paged'                  => (get_query_var('paged') ? get_query_var('paged') : 1),
    'posts_per_page'         => 20,
    'order'                  => 'ASC',
    'orderby'                => 'date',
); 

$my_query = new WP_Query($args); 

if ($my_query->have_posts()): 
    while($my_query->have_posts()): $my_query->the_post() ?>

<---TU LOOP ETC--->

OK, esto desordena la paginación. Para solucionarlo, necesitas establecer el parámetro $max_pages en next_posts_link, así que tu next_posts_link se verá algo así

<?php previous_posts_link('<i class="fa fa-arrow-left"></i> <span class="text">Página anterior</span>', $my_query->max_num_pages); ?>

Esto resolverá tu problema de paginación

10 jul 2014 23:18:10
Comentarios

Gracias por proporcionar una respuesta clara y concisa. Estoy de acuerdo en que $wp_query no es ideal para usar ya que añade complicación al asunto. ¡Gracias por tu ayuda!

Chris Chris
11 jul 2014 11:27:48

Fue un placer, me alegra que entre mis respuestas y las de @Milo hayas resuelto tu problema. ¡Disfruta! :-)

Pieter Goosen Pieter Goosen
11 jul 2014 11:35:19