RSS

태그 보관물: 워드프레스 루프

인사말 플러그인 기능 개선(포스팅 이용)

플러그인 관리자 페이지 등록을 통해 인사말 목록을 관리할 수 있게 되었다. 처음 소스코드에 랜덤하게 인사말을 가져오는 방식에서 데이터베이스를 쿼리하는 방식으로 변경해 보자.

1. 테마 화면에 인사말과 사용자명 나타내기

function hello_all() {

       global $current_user;

       query_posts(‘orderby=rand&post_type=howdynotices’);

       if (have_posts()){

           the_post();

             $rtngreeting = get_the_title();

       }

       $chosen = $rtngreeting.’ ‘.$current_user->display_name;

       echo “<p id=’greeting’>$chosen</p>”;

}

add_action(‘wp_head’, ‘hello_all’);

query_posts의 인자로 “orderby=rand”과 “post_type=howdynotices'”를 전달한다. 포스트 타입이 howdynotices인 랜덤 포스트를 추출해 가져온다.

$chosen 변수에는 포스트에서 가져온 타이틀(인사말)과 현 사용자 이름($current_user->display_name)이 담겨 출력된다. 출력을 좀 더 보기 좋게 만들기 위해 css를 추가했다.

2. css 코드

function hn_greeting_css() {

       $x = is_rtl() ? ‘left’ : ‘right’;

       echo

       <style type=’text/css’>

       #greeting {

       float: $x;

       padding-$x: 155px;

       padding-top: 5px;

       margin: 0;

       font-size: 15px;

       color:red;

}

</style>

“;

}

add_action(‘wp_head’, ‘hn_greeting_css’ );

3. 결과 화면

p4오른쪽 위에 인사말(Happy New Year)과 사용자 이름(admin)이 보인다. 페이지가 갱신될 때마다 랜덤하게 인사말이 변경된다.

 
 

태그: ,

워드프레스 루프 총 정리

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

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

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

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

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

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

 
 

태그: , , ,

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

커스텀 쿼리를 만드는 가장 간단한 방법, get_posts()를 알아보자.

get_posts()는 내부적으로 WP_Query를 이용한다. 하지만 포스트와 관련된 모든 탬플릿 태크를 바로 사용할 수 는 없다. 탬플릿 태그와 관련된 전역 데이터가 자동으로 생성되지 않기 때문이다. 이를 위해서는 setup_postdata()를 호출해 값을 채워주는 과정이 필요하다.

그리고 get_posts()의 반환값이 배열이라는 점에 주의해야 한다. 리턴값을 받으려면 foreach를 통해 각각의 루프 코드를 받아야 한다. 아래 소스에서 확인해 보자.

<ul>
<?php
global $post;
$args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 );
$myposts = get_posts( $args );
foreach( $myposts as $post ) :	setup_postdata($post); ?>
	<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>

이 함수는 사이드바나 풋터에 관계없이 다중 루프를 구성하거나 간편하게 데이터를 가져올 때 주로 사용한다.

 
 

태그: , ,

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

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

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

 

 
 

태그: , , ,