RSS

태그 보관물: WP_Query

워드프레스 루프 총 정리

워드프레스에서 루프를 이용하는 방법은 총 4가지이다.

  • 기본 루프
  • WP_Query를 이용하는 루프
  • query_posts()를 이용하는 루프
  • get_posts()를 이용하는 루프

첫 번째, 기본 루프는 별다른 조작없이 디폴트 쿼리를 실행해 보여준다. (참고 : 워드프레스의 루프는 어떻게 돌아가는가.) 대부분의 테마에서 가장 많이 사용된다. 템플릿 태그를 통해 콘텐츠 정보를 확인할 수 있다.

두 번째, WP_Query를 이용하는 루프는 다수의 인스턴스를 생성해 데이터를 활용하고자 할 때 주로 사용한다. 멀티 루프를 통해 각각의 콘텐츠를 사용자 입맛대로 출력할 때 유용하다. (참고 : 워드프레스 루프 만들기[1])

세 번째, query_posts()를 이용하는 루프는 기본 쿼리 자체를 변경하고자 할 때 사용한다. 주로 Single 루프에 사용된다. (참고 : 워드프레스 루프 만들기[2])

마지막 get_posts()를 이용하는 루프는 쉽고 간편하게 콘텐츠 데이터를 불러올 때 사용한다. 주로 멀티 루프에 사용된다. (참고 : 워드프레스 루프 만들기[3])

Advertisements
 
 

태그: , , ,

워드프레스 루프 만들기[2]

커스텀 쿼리를 만드는 두 번째 방법을 알아보자. 바로 query_posts()다.

워드프레스 페이지가 호출되면 콘텐츠 정보가 전역변수인 $wp_query에 생성된다. 루프를 통해 데이터를 불러오더라도 기본 쿼리는 변경하지 않고 파라메터를 이용해 데이터를 조작한다. 하지만 이 기본 쿼리를 변경할 필요가 있을 때 사용하는 게 query_posts()이다.

query_posts()는 로우레벨 접근방식으로 기본 쿼리를 변경하는 장점이 있지만, 반대로 기본 쿼리를 변경하기 때문에  캐시가 지워져 성능에 영향을 미칠 수 있다. 재활용성과 데이터베이스 성능 저하를 고려해야 한다.

전역변수인 $wp_query를 변경하기 때문에 한 번 이상 호출하거나, 루프 내에서 호출하게 되면 메인 루프 내용이 달라져 잘못된 콘텐츠가 반환되므로 주의가 필요하다.

<?php
// retrieve one post with an ID of 5
query_posts( 'posts_per_page=3&paged='.$paged' );

// set $more to 0 in order to only get the first part of the post
global $more;
$more = 0;

// the Loop
while (have_posts()) : the_post();
	the_content( 'Read the full post »' );
endwhile;

wp_reset_query();
?>

query_posts( ‘posts_per_page=3&paged=’.$paged’)의 결과로 기본 추출된 포스트 콘텐츠가 변경된다. 즉, query_posts()가 없었다면 출력되었을 콘텐츠는 더 이상 나타나지 않는다.

query_post()는 $query_string을 변경하여 기본 쿼리를 변경하므로, 사용후에는 wp_reset_query() 함수를 호출해서 쿼리 복원을 해주는 게 좋다.

query_post()는 주로 single 루프의 결과값을 바꾸고 싶을 때 주로 사용한다. 포스트의 개수나 어떤 카테고리에서 제외하고픈 포스트나 테그등을 제한할 때 사용하면 좋다. 다중 루프에서도 사용할 수는 있지만, WP_Query를 사용하는 편이 낫다.

참고 : 파라메터 사용 법 : http://codex.wordpress.org/Function_Reference/WP_Query#Parameters

 
 

태그: , , ,

워드프레스 루프 만들기[1]

맛있는 음식이 매일매일 나오는 자판기가 있다. 처음엔 편하고 신경 쓸 게 없어서 좋지만, 사람의 호기심이란 게 그냥 가만있지 못한다. 이곳저곳을 살펴보다가 결국 뜯어보고 역으로 추적해본다. 그럼, 결론은 두 가지다.

  • 하나는 그 기계가 망가져서 회복불능상태가 된다. 선무당이 사람 잡는 꼴이다.
  • 다른 하나는 그 원천을 찾아내서 더 좋은 자판기를 만든다.

이를 워드프레스에 적용하면 첫 번째처럼 망가지는 일은 절대 없다. 오픈소스이기 때문에 늘 다시 받아 회복할 수 있다. 그러나 항상 두 번째처럼 성공하는 것은 아니다. 이리저리 찾다가 길을 잃고 헤매거나 포기하는 경우가 다반사다. 하지만 그것을 넘어서면 새로운 맛을 느끼고 더 좋은 자판기를 만들게 된다.

커스텀 쿼리가 그것이다. 워드프레스를 원하는 대로 다듬고 뽐낼 수 있는 내가 만든 자판기인 셈이다. 어떻게 구성되는지 알아보자.

처음으로 소개할 커스텀 쿼리는 WP_Query()의 인스턴스를 직접 조작하는 방법이다. 워드프레스 페이지가 호출되면,  $wp_query 전역변수에 포스트/페이지 관련된 메타 데이터가 저장된다. 기본 루프를 사용하면 별도의 조작 없이 템플릿 태그를 통해 $wp_query 정보를 이용할 수 있다. 그러나 원하는 데이터를 가져오는 데는 한계가 있다. 좀 더 상세하게 사용하기 위해서는 WP_Query()의 인스턴스를 직접 생성해 조작해야 한다. 커스텀 쿼리를 얼마나 잘 쓰느냐에 따라 워드프레스의 성능과 UI가 결정된다.

다음은 페이지에 5개의 포스트를 가져오는 커스텀 쿼리이다.

<?php

$myPosts = new WP_Query();

   $myPosts->query(‘posts_per_page=5’);

while ($myPosts->have_posts()) : $myPosts->the_post();

?>

<!– 필요한 작업 수행 –>

<?php endwhile; ?>

기본 쿼리와 비교해 보자. 기본 쿼리일 때는 전역 함수인 have_posts(), the_post()를 호출하여 WP_Query 클래스에 접근한다. 전역함수 내에서 $wp_query 인스턴스를 생성해 WP_Query 클래스 메소드를 호출하는 식이다. 다양한 활용을 위해선 query() 메소드의 파라메타 사용법에 익숙해져야 한다.

  • query()와 그 파라메터 설명 : http://codex.wordpress.org/Function_Reference/query_posts

$myPosts->query(‘posts_per_page=5’) 호출되면 WP_Query의 query메소드가 get_posts()를 호출하여 콘텐츠 정보를 메모리상에 올려놓는다.

function query( $query ) {
$this->init();
$this->query = $this->query_vars = wp_parse_args( $query );
return $this->get_posts();
}

WP_Query()는 기본 쿼리를 변경하지 않으므로 다중 루프에 맘껏 사용할 수 있다.

<?php // Loop 1
$first_query = new WP_Query('cat=-1'); // exclude category
while($first_query->have_posts()) : $first_query->the_post();
...
endwhile;
wp_reset_postdata();

// Loop 2
$second_query = new WP_Query('cat=-2'); // exclude category
while($second_query->have_posts()) : $second_query->the_post();
...
endwhile;
wp_reset_postdata();

// Loop 3
$third_query = new WP_Query('cat=-3'); // exclude category
while($third_query->have_posts()) : $third_query->the_post();
...
endwhile;
wp_reset_postdata();
?>
 
 

태그: , , ,

워드프레스의 루프는 어떻게 돌아가는가.

루프를 구성하는 최소한의 소스를 보자.

<?php

if (have_posts()) :

while (have_posts()) :

the_post();

// loop content (template tags, html, etc)

end while;

end if;

?>

콘텐츠가 있으면 루프를 돌려서 출력한다는 내용이다. 일반 프로그래밍에서 흔히 볼 수 있는 패턴이다. 하지만 어디서 어떻게 원본 데이터를 가져오는지에 대한 코드가 보이지 않는다. 즉, 매개 되는 변수가 없다. 아마도 내부에서 전역으로 사용되는 변수에 값이 담겨 있을 것 같다는 추축을 하게 된다. 답답함이 몰려올 것이다.

이 간단한 소스를 이해하기 위해서는 워드프레스의 동작 원리를 알아야 한다. 이전 포스팅(워드프레스 이해하기 – 어떻게 원하는 콘텐츠를 불러올까?)을 참고하자.

요청 페이지가 호출되면, 워드프레스는 이미 기본 쿼리 객체 내에서 get_posts() 메소드를 호출하여 콘텐츠 목록을 작성하고 전역 변수에 저장한다. 이때 WP_Query 객체의 $wp_query가 저장소 역할을 한다. 이게 핵심이다. 그 다음은 루프가 해당 목록을 출력한다.

the_post() 메소드의 정의를 보면 $wp_query 변수를 확인 할 수 있다.

function the_post() {

     global $wp_query;

     $wp_query->the_post();
}

 
 

태그: , , , ,

워드프레스 이해하기 – 어떻게 원하는 콘텐츠를 불러올까?


워드프레스는 최적화된 오픈 소스다. 유수의 뛰어난 프로그래머가 끊임없이 다듬고 또 많은 사용자에 의해 버그 리포팅이 된다. 소스는 더욱 정규화되고 단단해지지만, 코어 엔진이 어떻게 원하는 데이터를 던져 주는지 파악하기란 더욱 어려워 진다. 오픈 소스임에도 불구하고 말이다.

과연, 워드프레스는 어떤 방식으로 콘텐츠를 불러올까?

한 사용자가 나의 블로그에 접속하여 특정 태그 (Xdebug)를 클릭했다고 하자.

태그

웹 브라우저 URL이 다음과 같이 나온다.

https://guspark.wordpress.com/tag/xdebug

워드프레스는 해당 URL을 분석하고 아래와 같은 작업을 한다.

  1. 태그 페이지를 요청했군.
  2. 태그에 해당하는 템플릿을 준비하자.
  3. “xdebug”라는 태그가 첨부된 포스트를 찾아 출력하자.

세부적으로 알아보자.

1. 요청 URL을 해석해 콘텐츠를 선택하는 동작은 WP_Query 객체의 parse_query() 메소드가 수행한다. URL에서 쿼리 매개 변수를 추출한다. https://guspark.wordpress.com/tag/xdebug/와 https://guspark.wordpress.com?tag=xdebug/는 같다.(xdebug 값을 가진 태그를 추출)

2. 추출된 쿼리 매개변수를 MySQL 쿼리로 변환하여 콘텐츠를 가져온다. 이 과정에서는 WP_Query 객체의 get_posts() 메소드를 이용한다. get_posts()는 쿼리 매개변수를 모두 SQL문으로 변환한 후 MySQL에 쿼리를 직접 요청하여 원하는 콘텐츠를 추출한다.

3. 추출된 콘텐츠는 WP_Query 객체에 저장되어 워드프레스 루프에서 사용되고 필요 시 캐시로 저장된다.

4. 워드프레스는 쿼리 타입과 반환된 포스트의 개수를 근거로 테마에서 템플릿을 결정하며, 쿼리의 결과는 루프에 전달된다.

 

 
 

태그: , , ,