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

25

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 debería colocarlo?

    
pregunta janoChen 29.01.2011 - 07:52

4 respuestas

10

Hola @janoChen:

Respuesta simple: no.

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

Cuando use new WP_Query($args) , asignará el valor de retorno de los valores a una variable local, de modo que, a menos que esté haciendo algo tan complejo que ya sabría la respuesta a esta pregunta, entonces no. Necesito llamar a 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;
}

-Mike

    
respondido por el MikeSchinkel 29.01.2011 - 07:55
20

No es necesario para WP_Query por sí mismo, pero es necesario (o al menos es algo positivo) si utiliza alguna función / método relacionado (como the_post() o setup_postdata() ) para llenar variables globales con sus datos.

Básicamente, crear un nuevo objeto WP_Query es simplemente recuperar datos, pero usarlo para ejecutar un 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 pena de rendimiento significativa llamarlo, por lo que es más fácil llamarlo siempre que decidir si deberías o olvidarlo y tener algo misteriosamente roto.

Actualizar

La función

wp_reset_postdata() parece ser más adecuada elección. wp_reset_query() restablece las variables globales $wp_query (a las que no afecta el objeto personalizado WP_Query ) y $post (que pueden ser las anteriores). wp_reset_postdata() solo restaura $post , lo que debería ser suficiente.

    
respondido por el Rarst 29.01.2011 - 14:50
2

No. Si crea una instancia de su propio objeto WP_Query, puede hacerlo con lo que quiera. Sin embargo, si manipula la variable global $wp_query , bueno, entonces está en el espacio de nombres global que afecta la secuencia de comandos de cualquiera que esté utilizando esa variable simultáneamente. Y si haces algo para cambiar los datos en él, también debes restablecerlo después de que hayas terminado de usarlo.

    
respondido por el RebelPhoenix 13.07.2013 - 18:54
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 bucle, está obligado a obtener algunos resultados inesperados. No utilicé wp_reset_query () en el código anterior (que se colocó en mi archivo header.php. Luego, cuando ingresé en single.php, en su mayoría obtuve las páginas de detalles de otras categorías, lo cual fue frustrante. Más tarde, me di cuenta de que Olvidé restablecer la consulta en la parte superior. Pronto, comenzó a funcionar como un encanto.

    
respondido por el Katie 16.06.2011 - 12:19

Lea otras preguntas en las etiquetas