Problema con WP_Query personalizado mostrando posts duplicados
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!

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

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

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!
