워드프레스 페이지 분석

들어가며

이 글은 PHP에 대해 전혀 지식이 없는 사용자들이 워드프레스에 대해 이해할 수 있도록 워드프레스 페이지가 어떻게 구성되어 있는가에 초점을 둘 예정입니다.

PHP에 대해 잘 알고 계시고 워드프레스에 익숙한 분들은 이 글을 읽을 필요가 없습니다. 그리고 아래 내용은 이해만 하고 넘어 가면 됩니다. 굳이 자세히 알 필요는 없고, 이해가 되지 않는 부분이 있더라도 넘어 갔다가 시간이 조금 지난 후에 다시 보시면 이해가 되실 것입니다.

워드프레스의 블로그 페이지 요청 구조

이전 몇 개의 글을 통해 워드프레스가 PHP 기반이라는 점을 통해 워드프레스가 어떻게 작동하는지를 설명하려고 했지만 단순히 설명만으로는 이해하기가 쉽지 않은 부분이 있는 것 같습니다. 우선 이 블로그의 이전 글에서 설명했던 부분을 잠시 언급한 후에 구체적인 워드프레스 페이지의 예를 들어 보겠습니다.

워드프레스는 PHP 기반으로 되어 있습니다. 브라우저에 표시되는 HTML은 PHP를 서버에서 해석하여 브라우저에 표시한 것입니다. PHP 언어를 잘 모르는 경우 이런 부분을 선뜻 이해하기가 어려운 부분이 있는 것 같습니다. 다음 동영상을 통해 PHP란 무엇이고 서버와 클라이언트 관계를 이해하시면 도움이 됩니다.

방문자가 워드프레스 사이트를 방문하여 컨텐츠를 요청하는 과정을 간략히 정리해보면 다음과 같습니다.

  1. 방문자의 브라우저(예: Internet Explorer, 구글 크롬, 오페라, Firefox  등)가 웹 페이지를 요청합니다.
  2. WordPress 코어에서 필요한 PHP 스크립트를 호출합니다.
  3. WordPress 코어는 DB(데이터베이스)와 통신하여 데이터(글/페이지 등)를 가져옵니다.
  4. 그런 다음 현재 활성화된 플러그인과 테마로부터 데이터를 가져와서 결합하여 동적으로 HTML 코드를 생성합니다.
  5. 동적으로 생성된 HTML 코드를 브라우저(클라이언트)로 보냅니다.

이 과정을 그림으로 나타내보면:

What will happen when someone views your WordPress posts

워드프레스 페이지 분석

이제 워드프레스 페이지가 구체적으로 어떻게 이루어져 있는지 워드프레스 기본 테마인 Twenty Sixteen의 page.php 파일을 살펴보도록 하겠습니다. 다음은 Twenty Sixteen의 샘플 페이지가 브라우저에 나타나는 것을 캡처한 것입니다.

Twenty Sixteen Theme in WordPress - 워드프레스 페이지 구조

위의 그림을 보면 페이지가 다음과 같이 네 부분으로 구성되어 있습니다.

  1. 헤더
  2. 컨텐츠 부분
  3. 사이드바
  4. 푸터

별도로 설명을 드리지 않아도 대충 이해하실 것이라 생각됩니다. 위에 표시되는 그림은 "샘플 페이지"라는 "페이지" 유형의 컨텐츠를 표시한 것입니다. (페이지와 글의 차이점은 이 글 맨 아래를 참고하시기 바랍니다.)

위 그림에 나온 '샘플 페이지'는 '페이지' 유형으로써, 레이아웃은 page.php 파일에 지정되어 있습니다. 이 파일의 소스를 살펴보면 다음과 같습니다(앞부분 주석 제거됨):

<?php get_header(); ?>

<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<?php
// Start the loop.
while ( have_posts() ) : the_post();

// Include the page content template.
get_template_part( 'template-parts/content', 'page' );

// If comments are open or we have at least one comment, load up the comment template.
if ( comments_open() || get_comments_number() ) {
comments_template();
}

// End of the loop.
endwhile;
?>

</main><!-- .site-main -->

<?php get_sidebar( 'content-bottom' ); ?>

</div><!-- .content-area -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

아마 위의 소스를 보고 멀미가 나는 분들도 계실지 모르겠습니다. 위의 코드는 이해할 필요가 현재로서는 없습니다. 위의 단순한 코드가 어떻게 위의 샘플 페이지와 같은 레이아웃을 표시할까요?

위의 그림에서 네 부분으로 나누었는데요, 워드프레스에서는 각 부분을 함수로 처리하여 호출합니다. 즉,

  1. <?php get_header(); ?>는 헤더 부분을 호출합니다.
  2. <?php get_template_part( 'template-parts/content', 'page' ); ?> 부분은 컨텐츠 부분을 불러옵니다.
  3. <?php get_sidebar(); ?>는 사이드바를 호출합니다.
  4. <?php get_footer(); ?>는 푸터 부분을 호출합니다.

우선 <?php get_header(); ?> 부분에 대해 잠시 설명하면, 이 PHP 코드는 get_header() 함수를 호출하는데, get_header() 함수에 대한 정보는 워드프레스 설명서에서 확인할 수 있습니다. 쉽게 설명하자면 get_header()는 header.php를 불러옵니다(PHP에서는 include라는 용어를 사용합니다).

조금 복잡한 것 같은데요, <?php get_header(); ?> 부분은 header.php 파일의 내용으로 대체된다고 생각하면 됩니다. 그러므로 헤더 부분을 수정하려면  header.php 파일을 수정하면 됩니다.

두 번째 부분인 <?php get_template_part( 'template-parts/content', 'page' ); ?> 부분은 조금 복잡하게 보이는데요, template-parts/content-page.php 파일을 불러오는 것으로 이해하면 되겠습니다. (자세한 내용은 굳이 이해할 필요가 없지만 원하는 경우 이 글을 참고해보세요.) content-page.php 파일의 내용을 보면 다음과 같습니다.

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
</header><!-- .entry-header -->

<?php twentysixteen_post_thumbnail(); ?>

<div class="entry-content">
<?php
the_content();

wp_link_pages( array(
'before'      => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', 'twentysixteen' ) . '</span>',
'after'       => '</div>',
'link_before' => '<span>',
'link_after'  => '</span>',
'pagelink'    => '<span class="screen-reader-text">' . __( 'Page', 'twentysixteen' ) . ' </span>%',
'separator'   => '<span class="screen-reader-text">, </span>',
) );
?>
</div><!-- .entry-content -->

<?php
edit_post_link(
sprintf(
/* translators: %s: Name of current post */
__( 'Edit<span class="screen-reader-text"> "%s"</span>', 'twentysixteen' ),
get_the_title()
),
'<footer class="entry-footer"><span class="edit-link">',
'</span></footer><!-- .entry-footer -->'
);
?>

</article>

위와 같이 조금 복잡하지만 이 정도면 비교적 단순한 코드로 되어 있습니다. 이 부분은 페이지 본문의 레이아웃을 표시하는 것으로 이해하면 되겠습니다. 소스에서 the_title( '<h1 class="entry-title">', '</h1>' ) 함수 부분은 페이지 타이틀을, the_content() 함수 부분이 본문의 내용을 표시합니다(참고). 이외에 wp_link_pages() 함수와 edit_post_link() 함수가 포함되어 있습니다.

나머지 <?php get_sidebar(); ?>와 <?php get_footer(); ?>도 <?php get_header(); ?>와 비슷하게 이해하시면 되겠습니다. get_sidebar()는 말 그대로 사이드바 템플릿(sidebar.php)을 호출하고, get_footer()는 푸터 템플릿(footer.php)을 호출합니다.

그림과 매칭시켜 보면 다음과 같이 이해할 수 있습니다.

Twenty Sixteen Theme in WordPress with php 2

참고로 <?php get_template_part( 'template-parts/content', 'page' ); ?> 부분은 조금 복잡하게 되어 있는데, 테마에 따라 조금씩 다릅니다. 예를 들어, 워드프레스 테마 중에서 가장 인기를 끄는 AVADA 테마의 100% Width 템플릿에서는 <?php the_content(); ?>로 되어 있습니다(실제로는 조금 더 복잡하지만 이해를 돕기 위해 단순화한 것입니다).

page.php 파일에서 어떻게 각 구성 요소를 include시켜서 페이지 템플릿을 구성하는지 대략적으로 살펴보았습니다. 위에서 언급했듯이 헤더 부분을 수정하려면 page.php에서 불러오는 헤더 파일을 수정하면 됩니다.

※ 워드프레스 테마 파일을 직접 수정해야 하는 경우 반드시 차일드 테마를 만들어서 작업하세요. 유료 테마에서는 차일드 테마 설치 파일이 제공되는 경우가 많습니다. 그렇지 않은 경우 "Child Theme Configurator 플러그인을 사용하여 간편하게 워드프레스 차일드 테마 만들기" 글을 참고하여 차일드 테마를 만들 수 있습니다. 차일드 테마를 만들지 않고 작업하면 추후 테마 업데이트 시에 수정 사항이 사라지게 됩니다.

참고 - 글과 페이지의 차이점

  • 글(Post)에는 날짜와 시간 스탬프가 표시되지만 페이지(Page)는 그렇지 않습니다.
  • 글은 웹사이트에 보통 새로운 글이 먼저 표시되고 뒤로 갈수록 이전 글이 표시됩니다.
  • 페이지는 블로그에 포함되지 않습니다.
  • 글은 카테고리와 태그를 사용하여 정리가 가능합니다.
  • 페이지는 계층 구조로 구성이 가능합니다.
  • 글은 RSS 피드로 등록(Syndicate)되어 새 글이 발행되면 구독자들에게 통지가 됩니다.
  • 페이지는 커스텀 템플릿을 사용할 수 있습니다.

자세한 내용은 "워드프레스 포스트(글)와 페이지의 차이점"을 참고해보시기 바랍니다.

참고:

일부 글에 제휴 링크가 포함될 수 있으며 파트너스 활동으로 일정액의 수수료를 받을 수 있습니다.

16개 댓글

  1. 포트폴리오를 위한 홈페이지를 만드는 중입니다.
    워드프레스에 대한 기본 개념 설명을 찾고 있었는데 이 블로그에 원하던 정보들이 있어 매우 기쁩니다. 설명도 영상도 너무 잘 이해가 됩니다.
    앞으로 이 사이트에 자주 방문할 예정입니다.
    감사합니다.

    1. 안녕하세요, euny님. 블로그 글들이 도움이 되셨기를 바랍니다. 궁금한 점이 있으면 해당 글이나 아무 글에 댓글을 달아주시면 아는 범위 내에서 답변해드리겠습니다.

    1. 감사합니다, 현 님.

      도움이 되셨기를 바랍니다.

      Elementor와 같은 페이지 빌더를 사용하는 경우 테마 파일을 직접 수정할 필요성이 많이 줄어들 것입니다. 그래도 기본적인 작동을 이해하면 도움이 될 것입니다.

    1. 많이 부족한 글 읽어주셔서 감사합니다.

      처음에는 이 글을 시리즈로 생각했었습니다.
      하지만 이 글을 작성해보니 시간 압박이 너무 심하네요.ㅠㅠ

  2. 와.. 여기 정말 대단한 홈페이지 같아요. 워드프레스 정보 블로그로는 최강인 듯한데요. ㅎㅎ 본문에 프로그램 소스 부분 보면, 까만 배경색에 소스 코드 표현한 것은 어떻게 한 거예요? 워드프레스 플러그인을 사용한 것인가요?

      1. 감사합니다. ^^
        저는 http://choding.com/ 워드프레스 블로그를 운영 중이에요. 방문자가 아마도 한 명도 없는 곳이지만 제 홈페이지도 알려드리는 게 예의 같아서 남깁니다.
        앞으로도 많은 도움 받고 배울게요. 고맙습니다~

      2. 더 질문 드릴 게 있는데요. 위에 알려주신 플러그인을 적용하니 잘 되는데.. ^^; 줄바꿈이 안 되고 소스 코드가 쭉 나오는 현상이 있습니다. 대략 css 파일에 wordwrap 속성? 검색해서 넣어 봤는데도 마찬가지라 도움 좀 요청 드립니다. 혹시 어디를 손 봐야 해결될까요?
        문제가 있는 글의 링크 예시 : http://choding.com/2016/02/17/005025/

      3. 네, 많이들 disqus 를 쓰시고 워드프레스 기본 댓글보다 좋아보이긴 합니다. 일단 링크 연결, 연결해서 방문 유입이 좀 더 많아질 것 같아요.
        근데 모바일(폰)으로 봤을 때 보면요.. 해당 글에 대한 disqus 댓글만 보이는 게 아니고, 그 아래에 (WordCracker 님의 블로그를 예로 들면) "wordcracker의 다른 댓글" 목록도 나오고.. 그 아래 또 "최신 댓글"이라고도 나오고 하는데..
        저는 그 부분이 저랑은 안 맞더라구요. 클릭할 수 있는 링크가 많아서 타고 타고 다닐 수 있는 가능성이 많아지긴 하지만, 그 해당 글과는 관련이 없는 부분들이 더 보여진다는 점이..

        뭐 그렇습니다. 현재까지는 그래서 기본 워드프레스 댓글을 쓰고 있어요. 또 기본 워드프레스 댓글도 이름, 이메일, 홈페이지 같은 거 안 써도 댓글 쓰기가 가능하니까요. ^^

      4. 안녕하세요?

        아래의 "~의 다른 댓글" 목록은 설정에서 제거가 가능합니다.
        Settings > General에서 Discovery 옵션의 체크를 없애주면 됩니다.ㅎㅎ

        편한 것을 사용하면 되니까요... 저도 이전에는 disqus를 설치했다가 별로 마음에 안 들어 삭제했었습니다. 다시 사용해보니 생각보다 괜찮네요.

댓글 남기기

* 이메일 정보는 공개되지 않습니다.