É necessário usar wp_reset_query () em uma chamada WP_Query?

25

Estou usando o seguinte código para recuperar postagens:

<?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; ?>

Preciso usar wp_reset_query() ? Se eu fizer, onde devo colocá-lo?

    
por janoChen 29.01.2011 / 07:52
fonte

4 respostas

10

Oi @janoChen:

Resposta simples: não.

O que segue é o código PHP para a função wp_reset_query() de /wp-includes/query.php no WordPRess v3.0.4, bem como as funções posteriormente chamadas. Você pode ver que é principalmente sobre como modificar variáveis globais.

Quando você usa new WP_Query($args) , você estará atribuindo o valor de retorno dos valores a uma variável local, a menos que você esteja fazendo algo tão complexo que já conheça a resposta a essa pergunta, pois não, você não precisa chamar 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

    
por MikeSchinkel 29.01.2011 / 07:55
fonte
20

Não é necessário para WP_Query , mas é necessário (ou pelo menos algo bom a fazer) se você usar quaisquer funções / métodos relacionados (como the_post() ou setup_postdata() ) para preencher variáveis globais com seus dados.

Basicamente, criar um novo objeto WP_Query é meramente a recuperação de dados, mas usá-lo para executar o loop ativo e tornar os dados acessíveis às tags de modelo modifica o ambiente e é bom redefinir tudo posteriormente.

No geral - não é uma penalidade de desempenho significativa chamá-lo, então é mais fácil chamá-lo do que decidir se você deve ou não ter algo misteriosamente quebrado.

Atualizar

A função

wp_reset_postdata() parece ser mais adequada escolha. wp_reset_query() redefine global $wp_query (qual objeto WP_Query personalizado não afeta) e $post (que pode ser como acima) variáveis. wp_reset_postdata() apenas restaura $post , o que deve ser suficiente.

    
por Rarst 29.01.2011 / 14:50
fonte
2

Não. Se você instanciar seu próprio objeto WP_Query, o seu será o que você fará. No entanto, se você adulterar a variável global $wp_query , bem, então seu no namespace global afetará o script de qualquer pessoa que estiver usando essa variável simultaneamente. E se você fizer algo para alterar os dados, você também deve redefini-lo depois de terminar de usá-lo.

    
por RebelPhoenix 13.07.2013 / 18:54
fonte
0

Se você estiver usando uma 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(); 

Então você não terá problemas. Caso contrário, se na mesma página houver outro loop, você terá alguns resultados inesperados. Eu não usei wp_reset_query () no código acima (que foi colocado no meu arquivo header.php. Então, quando eu cheguei em single.php principalmente eu recebo as páginas de detalhes de outras categorias que foi frustrante. Mais tarde, percebi que eu esqueceu-se de repor a consulta no topo. Em breve, começou a funcionar como um encanto.

    
por Katie 16.06.2011 / 12:19
fonte

Tags