¿Es necesario usar wp_reset_query () en una llamada WP_Query?

26

Estoy usando el siguiente código para recuperar publicaciones:

<?php
$featuredPosts = new WP_Query();
$featuredPosts->query('showposts=5&cat=3');

while ($featuredPosts->have_posts()) : $featuredPosts->the_post(); ?>

    <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
    <div class="meta">
        By <?php the_author() ?>
    </div>
    <div class="storycontent">
        <?php the_excerpt(); ?>
    </div>

<?php endwhile; ?>

¿Necesito usar wp_reset_query()? Si lo hago, ¿dónde debo colocarlo?

janoChen
fuente
2
Si confía en el objeto de consulta principal en otro lugar de la página, ¡Sí! debe llamarlo para asegurarse de que el objeto de consulta principal contenga los datos antes de iterar sobre su consulta personalizada. Cuando llama al the_post()método (es decir $my_custom_query->the_post()), rellena las variables de publicación que mira la consulta principal, el restablecimiento rellena estos vars con los datos anteriores cuando lo llama. Es una buena práctica usar restablecimientos después de consultas personalizadas.
t31os

Respuestas:

10

Hola @janoChen:

Respuesta simple: no.

Lo que sigue es lo que el código PHP para la función wp_reset_query()de /wp-includes/query.phpWordPRess v3.0.4, así como las funciones llamadas posteriormente. Puede ver que se trata principalmente de modificar variables globales.

Cuando lo use new WP_Query($args), asignará el valor de retorno de los valores a una variable local, por lo tanto, a menos que esté haciendo algo tan complejo que ya sepa la respuesta a esta pregunta, entonces no, no necesita llamar wp_reset_query():

function wp_reset_query() {
  unset($GLOBALS['wp_query']);
  $GLOBALS['wp_query'] =& $GLOBALS['wp_the_query'];
  wp_reset_postdata();
}

function wp_reset_postdata() {
  global $wp_query;
  if ( !empty($wp_query->post) ) {
    $GLOBALS['post'] = $wp_query->post;
    setup_postdata($wp_query->post);
  }
}

function setup_postdata($post) {
  global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;

  $id = (int) $post->ID;

  $authordata = get_userdata($post->post_author);

  $day = mysql2date('d.m.y', $post->post_date, false);
  $currentmonth = mysql2date('m', $post->post_date, false);
  $numpages = 1;
  $page = get_query_var('page');
  if ( !$page )
    $page = 1;
  if ( is_single() || is_page() || is_feed() )
    $more = 1;
  $content = $post->post_content;
  if ( strpos( $content, '<!--nextpage-->' ) ) {
    if ( $page > 1 )
      $more = 1;
    $multipage = 1;
    $content = str_replace("\n<!--nextpage-->\n", '<!--nextpage-->', $content);
    $content = str_replace("\n<!--nextpage-->", '<!--nextpage-->', $content);
    $content = str_replace("<!--nextpage-->\n", '<!--nextpage-->', $content);
    $pages = explode('<!--nextpage-->', $content);
    $numpages = count($pages);
  } else {
    $pages = array( $post->post_content );
    $multipage = 0;
  }

  do_action_ref_array('the_post', array(&$post));

  return true;
}

-Micro

MikeSchinkel
fuente
@janoChen - je. Definitivamente me ha estado presionando últimamente, ¡eso es seguro! Supongo que, como dicen, la competencia mejora la raza (¡pero seguro que me impide hacer algo más productivo! '-)
MikeSchinkel
1
Solo para otros que lean esto, ya que esta sigue siendo la respuesta aceptada (la respuesta de @Rarst debe aceptarse). Dado que el OP usa the_post()en su código, las mejores prácticas dictan que debe usar wp_reset_postdata(). wp_reset_query()llamadas wp_reset_postdata(), por lo que funcionará, aunque la otra cosa wp_reset_query()sí, restablecer la $wp_queryvariable global, no es necesaria, pero no es perjudicial en este caso. Entonces la respuesta es realmente
Tom Auger
21

No es necesario WP_Querypor sí mismo, pero es necesario (o al menos algo bueno que hacer) si utiliza alguna función / método relacionado (como the_post()o setup_postdata()) para completar las variables globales con sus datos.

Básicamente, crear un nuevo WP_Queryobjeto es simplemente recuperar datos, pero usarlo para ejecutar el bucle activo y hacer que los datos sean accesibles para las etiquetas de plantilla modifica el entorno y es bueno restablecer todo después.

En general, no es una penalización de rendimiento significativa llamarlo, por lo que es más fácil llamarlo siempre que decidir si debe hacerlo u olvidarlo y tener algo misteriosamente roto.

Actualizar

wp_reset_postdata()La función parece ser una opción más adecuada. wp_reset_query()restablece las variables globales $wp_query(que WP_Queryobjeto personalizado no afecta) y $post (que podría ser como el anterior). wp_reset_postdata()solo restaura $post, lo que debería ser suficiente.

Rarst
fuente
2

No. Si crea una instancia de su propio objeto WP_Query, es suyo para que haga lo que quiera. Sin embargo, si manipulas la global $wp_queryvariable, bueno, entonces estás en el espacio de nombres global que afecta el script de cualquier persona que esté usando esa variable simultáneamente. Y si hace algo para cambiar los datos que contiene, también debe restablecerlo una vez que haya terminado de usarlo.

Rebelde Fénix
fuente
0

Si está utilizando una consulta personalizada como esta

$cat = new WP_query(); 
$cat->query("cat=19,20,-23&showposts=5&orderby=rand"); 
while ($cat->have_posts()) : $cat->the_post(); 
  $data = get_post_meta( $post->ID, 'key', true );
$img_arrays []= $data['productimage']; 
$lnk_arrays[] =get_permalink($post_ID); 
endwhile; 
wp_reset_query(); 

Entonces no tendrás problemas. De lo contrario, si en la misma página hay otro ciclo, seguramente obtendrá resultados inesperados. No utilicé wp_reset_query () en el código anterior (que se colocó en mi archivo header.php. Luego, cuando entré en single.php, principalmente obtuve las páginas de detalles de otras categorías, lo cual fue frustrante. Más tarde, me di cuenta de que yo olvidé restablecer la consulta en la parte superior. Pronto, comenzó a funcionar como un encanto.

Katie
fuente