WP_Query a veces devuelve cero resultados cuando hay publicaciones coincidentes, ¿por qué?

6 minutos de lectura

avatar de usuario
jon ewing

Este me tiene perplejo.

Tengo un archivo category.php que contiene este ciclo:

<?php
if ( have_posts() ) : ?>
    <?php
    while ( have_posts() ) : the_post(); ?>
        <div class="entry-content description clearfix">
            <h2 class="category-subtitle"><a href="https://stackoverflow.com/questions/31547473/<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
            <?php echo the_content(); ?>
            <?php global $withcomments; $withcomments = 1;
    ?>
        </div><!-- .entry-content -->
    <?php
    endwhile;
else :
    get_template_part( 'content', 'none' );
endif;
?>

Este bloque de código funciona bien y siempre devuelve los resultados esperados.

Además, fuera del ciclo (después, en caso de que eso importe), tengo una columna a un lado con este ciclo. Me referiré a esto como el ciclo de suministro de noticias en aras de la claridad:

<h3 class="newsfeed-heading"><a href="https://stackoverflow.com/category/news/">Latest News</a></h3>
<?php
    // wp_reset_query(); * Same results with or without wp_reset_query
    $args = array(
    'cat' => 89,
    'order'   => 'ASC'
    );
    $custom_query = new WP_Query($args);
    //echo "<h2>Found: $custom_query->found_posts</h2>";
    while($custom_query->have_posts()) : $custom_query->the_post();
?>
    <div <?php post_class(); ?> id="post-<?php the_ID(); ?>">
        <h4 class="highlight1"><a href="https://stackoverflow.com/questions/31547473/<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
        <p><?php $content = get_the_content(); echo mb_strimwidth($content, 0, 160, '...');?></p><div class="morelink"><a title="<?php the_title(); ?>" href="https://stackoverflow.com/questions/31547473/<?php the_permalink(); ?>">Read more</a></div>
    </div>
<?php endwhile; 
  // wp_reset_postdata();  * Same results with or without wp_reset_postdata
?>

Ahora, en la mayoría de los casos, estos dos bucles funcionan bien juntos y ambos bucles devuelven el conjunto de resultados que esperaría. Pero no siempre.

Por lo que puedo decir, creo que si el bucle de categoría principal solo contiene un resultado, entonces el bucle de suministro de noticias siempre es correcto. Pero si el bucle de categoría principal tiene varias publicaciones en el conjunto de resultados, el bucle de suministro de noticias suele funcionar bien. Así que no he sido capaz de detectar un patrón.

he probado a poner wp_reset_query(); en diferentes lugares, aferrándose a pajitas, pero no hace ninguna diferencia.

Por cierto, cuando el bucle de suministro de noticias funciona, siempre devuelve el conjunto de resultados correcto. Pero cuando no lo hace, siempre no devuelve nada y $custom_query->found_posts devuelve cero.

Realmente agradecería algún consejo sobre dónde buscar una posible solución.

  • Editado para mostrar que he explorado la necesidad o no de wp_reset_postdata y wp_reset_query()

    – Jon Ewing

    31 de julio de 2015 a las 14:37

Para cualquiera que busque, found_posts devuelve 0 si los argumentos están usando 'no_found_rows' => true.

avatar de usuario
Pieter Goosen

Estás perdido wp_reset_postdata(); después de su consulta personalizada. Tan pronto como llames the_post()usted está configurando el $post global al valor de la publicación actual. Esto es cierto para la consulta principal y cualquier instancia personalizada de WP_Query. En get_postsesto pasa cuando llamas setup_postdata().

Como ya se ha señalado, wp_reset_query() se usa con query_posts que deberías nunca use ya que rompe el objeto de consulta principal y cualquier cosa que dependa del objeto de consulta principal, como publicaciones relacionadas, paginación y funcionalidad de página.

Si lo anterior no funciona, busque cualquier posts_** filtros o cualquier instancia de pre_get_posts que está mal escrito en su tema o en un complemento. Aparte de estas sugerencias, su código debería funcionar.

  • Es wp_reset_postdata() realmente necesario, ya que este segundo bucle se produce fuera de/después del bucle predeterminado? Tenía la impresión de que esto solo era necesario para bucles anidados.

    – rnevio

    30 de julio de 2015 a las 16:19


  • Sí, lo es, recuerde, cualquier consulta personalizada que utilice the_post() o setup_postdata establece el $post global a la publicación de esa consulta personalizada actual. No restablecer esto causa resultados inesperados.

    – Pieter Goosen

    30 de julio de 2015 a las 16:25

  • Insertar wp_reset_postdata() antes de ejecutar la consulta personalizada no hace ninguna diferencia en el resultado final. La consulta personalizada aún devuelve un conjunto de resultados a veces y ningún resultado en otras ocasiones. Y todavía no puedo ver un patrón. Tiene razón, por supuesto, wp_reset_query() no es necesario antes de la consulta personalizada. De nuevo, sin embargo, eliminarlo no afecta la salida. Eliminé por completo cualquier cosa de functions.php que usaba pre_get_posts o posts_** y no hizo ninguna diferencia en este problema.

    – Jon Ewing

    31/07/2015 a las 14:30

  • wp_reset_postdatadebe ir después de la consulta personalizada, no antes

    – Pieter Goosen

    31 de julio de 2015 a las 16:06

  • Lo siento, Peter, puse el reinicio después de la consulta. ¡Por desesperación, incluso lo probé tanto antes como después! Pero lo que debería haber pensado antes era deshabilitar los complementos uno por uno para ver si alguno de ellos estaba causando un conflicto.

    – Jon Ewing

    6 de agosto de 2015 a las 13:23

¡Resuelto!

Estaba convencido de que el problema no estaba en el código y debería haberlo solucionado antes.

El problema fue causado por un complemento de WordPress llamado Reordenar publicación dentro de categorías https://wordpress.org/plugins/reorder-post-within-categories/

Este complemento le permite reordenar manualmente las Categorías seleccionadas a través de una interfaz de arrastrar y soltar en el Tablero.

Esto explica por qué la consulta personalizada funcionó la mayor parte del tiempo: solo unas diez de las más de 80 categorías se reordenaron manualmente y, por supuesto, esas son las que causan el conflicto con mi WP_Query.

No estoy en condiciones de comenzar a piratear el complemento, por lo que la solución es deshabilitar el complemento y reordenar las publicaciones alterando las fechas de publicación.

Gracias a los colaboradores que intentaron responderme esta pregunta.

avatar de usuario
praba

Yo había experimentado un problema similar. Finalmente como se recomienda, eliminado

'no_found_rows' => true,

sin embargo, no funciona. Así que he reorganizado los argumentos de consulta.

'posts_per_page' => 10,

El post_per_page al final de los argumentos de consulta da como resultado “0” found_posts. Más tarde, desplazada a la parte superior de los argumentos de la consulta, la consulta da como resultado el resultado real como “100” found_post.

El problema que enfrenté por mi parte fue que la consulta estaba recuperando tipos de publicaciones personalizadas privadas. Esto requerirá que el usuario registrado tenga los privilegios correctos para acceder a las publicaciones. Por lo tanto, debe asegurarse de usar un usuario con los roles correctos y, cuando use una API, asegúrese de pasar la clave nonce.

avatar de usuario
desarrollador de vinilo

Si alguien viene aquí buscando una respuesta y ninguna de las otras soluciones funciona. Pude hacer que esto funcione agregando wp_die(); justo antes del final de mi llamada de función.

¿Ha sido útil esta solución?