워드프레스 루프

루프(Loop)는 워드프레스가 동작하는 가장 기본적인 원리이다. 루프는 다음과 같이 생겼다.

<?php
//The Loop
if (have_posts()) : while (have_posts()) : the_post();
...
endwhile; else;
...
endif;
?>

이는 일반적인 프로그래밍의 while 루프와 비슷하게 생겼는데, PHP에서 사용하는 while 루프의 문법을 그대로 따르고 있다. 루프를 돌기 이전에 표시할 포스트가 있는지 확인하고 매 포스트마다 반복적으로 the_post() 함수를 실행한다. 이 함수는 루프 속에서 동작하는 함수들에 대해 기본적으로 사용하는 포스트를 지정해주는 역할을 한다. 지정된 수만큼의 루프를 돌며 the_post()가 실행되다음에는 루프가 종료된다.

다음은 보다 구체적인 루프의 모습이다.

<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_posts(); ?>
<div class="post" id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>

<?php echo get_post_meta($post->ID, 'PostThumb', true; ?>
<p class="meta">
<span>Posted on</span> <?php the_time('F js, Y'); ?> <span>by<span> <?php the_author(); ?>
</p>

<?php the_content('Read Full Article'); ?>

<p><?php the_tags('Tags: ', ', ', '<br />'); ?>
Posted in <?php the_category(', '); ?>
<?php comments_popup_link('No comments;', '1 Comment', '% Comments'); ?></p>

</div>

<?php endwhile; ?>

<?php next_posts_link('Older Entries'); ?> <?php previous_posts_link('Newer Entries'); ?>

<?php else : ?>

<h2>Nothing Found</h2>

<?php endif; ?>

위 코드를 분석하자면 다음과 같다.

  1. 먼저 작성된 포스팅이 있는지를 검사한다. 포스팅이 없다면 Nothing Found를 출력한다.
  2. while 문으로 루프를 시작한다. Setting > Read 에서 설정한 수만큼 루프를 돌게 된다.
  3. 각 포스팅에 대해서 머리글을 쓴다. 머리글에는 각 포스팅의 영구주소로 링크를 건다.
  4. get_post_meta()는 포스팅의 메타정보나 커스텀 필드를 가져올 수 있다. 이 예시에서는 <img /> 태그를 가져올 것으로 보인다.
  5. 포스팅된 날짜를 표시
  6. 포스팅 본문을 표시한 후, 부가 정보인 태그정보와 글이 발행된 카테고리 정보를 가져온다.
  7. 포스팅 아래쪽에는 코멘트 정보를 표시
  8. 다음글/이전글에 대한 링크를 표시하고
  9. 포스팅이 없는 경우에 대체 문구를 표시

그런데 이 루프는 그저 루프일 뿐인데 어떤 포스팅을 DB로부터 가져와야 하는지 어떻게 알까? 이미 워드프레스 루프는 쿼리스트링에 대해 알고 있다. 이 쿼리스트링을 실제로 확인하고 싶다면 $query_string 변수를 전역으로 변경하여 찍어볼 수 있다.

<?php global $query_string; echo $query_string; ?>

루프에서 일반적으로 사용하는 함수들은 다음과 같은 것들이 있다.

  • the_title() : 포스트의 제목을 출력
  • the_ID() : 포스트의 아이디를 출력
  • the_author() : 포스트의 작성자를 출력
  • the_category() : 포스트가 속한 카테고리를 출력

또한 루프 내부에서는 the_post() 함수가 반환하는 변수인 $post를 사용할 수 있다. 이 객체는 여러 포스트의 ‘raw’한 데이터들을 가지고 있다. 이 때 -> 연산자는 C의 구조체 멤버 접근 연산자와 비슷하게 생겼는데, 아마 객체의 멤버에 접근할 때 사용하는 것으로 보인다. (나는 PHP는 잘 모른다…)

  • $post->ID : 포스트의 ID
  • $post->post_content : 실제 컨텐츠
  • $post->post_modified : 포스트가 최종 수정된 시각의 타임 스탬프
  • $post->post_name : 포스트의 슬러그 정보

또한 루프외부에서도 몇 몇 함수를 사용하여 정보를 가져올 수 있다. 이 함수들은 현재 표시하는 포스트와는 별개의 정보를 다룬다. 그외 여러 함수들에 대해서는 (이런 함수들을 템플릿 태그라고 한다.) 맨 아래 링크를 참고한다.

  • wp_list_pages() : 정적 페이지로의 링크들을 리스팅한다.
  • next_posts_link() : 다음 페이지로의 링크
  • wp_tag_cloud() : 태그 클라우드는 간단히 함수로 만들 수 있다.
  • wp_permalink() : 포스트들의 영구주소를 구한다.

http://codex.wordpress.org/Template_Tags

또한 그외 함수들에 대해서는 이 곳(워드프레스 함수 레퍼런스)을 참고한다.