WP_Query 호출에서 wp_reset_query ()를 사용해야합니까?


26

게시물을 검색하기 위해 다음 코드를 사용하고 있습니다.

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

사용해야 wp_reset_query()합니까? 그렇다면 어디에 배치해야합니까?



2
페이지의 다른 곳에서 기본 쿼리 개체에 의존하는 경우 예! 사용자 지정 쿼리를 반복하기 전에 주 쿼리 개체에 데이터가 포함되어 있는지 확인하기 위해 호출해야합니다. the_post()메소드 (예 :) 를 호출 $my_custom_query->the_post()하면 기본 쿼리가 보는 사후 변수를 리필하고, 재설정하면 이러한 변수를 호출 할 때 이전 변수로 해당 변수를 리필합니다. 사용자 정의 쿼리 후에 재설정을 사용하는 것이 좋습니다.
t31os

답변:


10

안녕하세요 @janoChen :

간단한 대답 : 아닙니다.

다음은 함수에 대한 PHP 코드 무엇입니까 wp_reset_query()에서 /wp-includes/query.php워드 프레스 v3.0.4뿐만 아니라 기능 이후했다. 주로 전역 변수 수정에 관한 것임을 알 수 있습니다.

사용할 때 new WP_Query($args)값의 반환 값을 로컬 변수에 할당하므로 너무 복잡한 작업을 수행하지 않으면이 질문에 대한 답변을 이미 알고 있지 않은 한 아니오를 호출 할 필요가 없습니다 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;
}

-마이크


@janoChen-h. 그는 확실히 최근에 나를 밀고 있었다, 그것은 확실하다! 그들이 말하는 것처럼, 경쟁은 번식을 향상시킵니다 (그러나 다른 생산적인 것을 얻지 못하게합니다! '-)
MikeSchinkel

1
이것은 여전히 ​​허용 된 답변이므로 (@Rarst의 답변을 수락해야 함) 다른 사람들이 이것을 읽습니다. OP는 the_post()자신의 코드에서 사용하기 때문에 모범 사례에 따라 사용해야합니다 wp_reset_postdata(). wp_reset_query()전화 wp_reset_postdata(), 그 의지의 작업, 다른 일을하지만 그래서 wp_reset_query()않습니다 - 리 세트 $wp_query전역 변수를 - 필요는 없습니다 만,이 경우에는 유해하지 않습니다. 따라서 대답은 실제로 그렇습니다
Tom Auger

21

그것은 필요하지 않습니다 WP_Query자체, 하지만 당신은 (예 : 모든 관련 기능 / 방법을 사용하는 경우 필요가있다 (또는 적어도 좋은 일을 할) the_post()또는 setup_postdata()데이터와 글로벌 변수를 채우기 위해).

기본적으로 새 WP_Query객체를 만드는 것은 데이터 검색에 불과하지만,이를 사용하여 활성 루프를 실행하고 템플릿 태그에 데이터에 액세스 할 수있게하면 환경이 수정되므로 나중에 모든 것을 재설정하는 것이 좋습니다.

전반적으로 전화를 걸면 의미있는 성능 저하가 없으므로 전화를 걸거나 잊어 버렸는지 여부를 결정하고 불가사의하게 부서지는 것을 결정하는 것보다 항상 전화하는 것이 더 쉽습니다.

최신 정보

wp_reset_postdata()기능이 더 적합한 선택 인 것 같습니다. wp_reset_query()전역 $wp_query(사용자 정의 WP_Query객체에는 영향을 미치지 않음) $post (위와 같이) 변수를 재설정 합니다. wp_reset_postdata()복원 만하면 $post충분합니다.


2

아니요. 자신의 WP_Query 객체를 인스턴스화하면 원하는 작업과 관련이 있습니다. 그러나 global $wp_query변수 를 변조 하면 전역 네임 스페이스에서 해당 변수를 동시에 사용하는 모든 사람의 스크립트에 영향을 미칩니다. 또한 데이터를 변경하기 위해 무언가를 수행 한 후에는 데이터를 사용한 후에 재설정해야합니다.


0

이와 같은 사용자 정의 쿼리를 사용하는 경우

$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(); 

그러면 문제가 발생하지 않습니다. 그렇지 않으면 같은 페이지에 다른 루프가 있으면 예기치 않은 결과가 발생합니다. 위의 코드에서 wp_reset_query ()를 사용하지 않았습니다 (이는 header.php 파일에 있습니다. 그런 다음 single.php에 들어갔을 때 주로 다른 카테고리의 세부 정보 페이지가 실망 스럽습니다. 나중에, 나는 쿼리를 상단에서 재설정하는 것을 잊어 버렸습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.