WordPressのページが表示されるまでの流れと仕組み

WordPressの内部処理は意外と単純です。本記事ではWordPress製のサイトやブログにサクセスした際に、どのような流れでページが表示されるのかについて説明していきます。またWordPressの表示に関わる仕組みや、テーマ・テンプレート周りの表示の仕組みについても簡単に解説します。

まず、WordPressのサイト表示には、主に以下の3つの主要なファイルが用いられています。より細かな動作については次項で順を追って説明していきます。

/htdocs/index.php           // 一番最初に読み込まれる
/htdocs/wp-blog-header.php  // 設定の読み込みが行われる
/htdocs/wp-includes/template-loader.php // ここでページが表示される
/htdocsの部分は環境によって/var/www/htmlであったり、C:\xampp\htdocsであったりしますが、本記事では簡略化のために/htdocsに統一して解説します。
本記事ではWordPressがドキュメントルート直下に設置されているものとして解説していきます。
パーマリンク設定は/?p=投稿ID形式ではなく、より実用的な/ユーザ指定/の形式として設定されたものとして解説します。/?p=投稿ID形式を指定している場合は第1項〜第2項を読み飛ばしても構いません。
本記事に記載されているソースコードは完全な転載ではなく重要な部分のみを抜粋しています。

目次

  1. ページアクセス時
  2. .htaccess(パスのリダイレクトを行う)
  3. index.php(最初に読み込まれる)
  4. wp-blog-header.php(設定の読み込み、URLの解析)
  5. template-loader.php(テンプレートの読み込み)
  6. single.php(投稿ページ用のテーマ・テンプレート)

ページアクセス時

まずWordPressのページにアクセスした際には、ページの種類に関わらず一貫してドキュメントルート(通常はhtdocsディレクトリ)直下のindex.phpファイルが呼び出されます。固定ページであろうとカテゴリーページであろうと、内部転送により常にindex.phpへと暗黙的にリダイレクトされます。

// Linux 環境の場合
/var/www/html/index.php
/usr/local/apache2/htdocs/index.php
// Windows XAMPP 環境の場合
C:\xampp\htdocs\index.php
// Mac MANP 環境の場合
/Applications/MAMP/htdocs/index.php
WordPressをサブディレクトリに設置している場合は/htdocs/{サブディレクトリ名}/index.phpが実行される。

この転送はWebサーバのRewrite機能によるものであり、その設定は同ディレクトリに自動生成された.htaccessファイル内に記述されています。

.htaccess

/* /htdocs/.htaccess */
RewriteEngine On               // 転送を有効化
RewriteBase /                  // ドキュメントルート以降のアクセスを転送対象とする
RewriteRule ^index\.php$ - [L] // 無限転送防止。index.php以外のアクセスのみリダイレクト
RewriteCond %{REQUEST_FILENAME} !-f // 実ファイルが存在する場合は転送しない 
RewriteCond %{REQUEST_FILENAME} !-d // 実ディレクトリが存在する場合は転送しない
RewriteRule . /index.php [L]        // 上記以外のリクエストを全てindex.phpへ転送する

パーマリンク設定を標準の/?p=投稿ID形式に指定している場合は、リダイレクトの必要はないため.htaccessは生成されません。ページへのアクセス(http://marycore.jp/?p=9)は暗黙的にhttp://marycore.jp/index.php?p=9と解釈されるためです。

index.php

ここでは単に同一ディレクトリ内のwp-blog-header.phpファイルを読み込むだけの処理が働きます。

<?php /* /htdocs/index.php */

require( dirname( __FILE__ ) . '/wp-blog-header.php' );
//                __FILE__  == "/htdocs/index.php"
//        dirname(__FILE__) == "/htdocs"

wp-blog-header.php

wp-blog-header.phpでは設定の読み込みとURL解析/クエリ変換、テンプレートの読み込みが行われます。

<?php /* /htdocs/wp-blog-header.php */

// 設定の読み込み(データベース情報、WordPress関数・クラスの定義)
require_once( dirname( __FILE__ ) . '/wp-load.php' );

wp(); // WordPressのセットアップ(URL解析、クエリ変換)

// テンプレートの読み込み
require_once( ABSPATH . WPINC . '/template-loader.php' );
// ABSPATH == "/htdocs/"
//   WPINC == "wp-includes"

wp-load.phpでは設定の読み込みが行われており、内部では主にwp-config.phpwp-settings.phpが読み込まれています。wp-config.phpではデータベースのホスト名やユーザ名、パスワードなどが設定されています。wp-settings.phpではWordPress関連の関数やクラスの読み込みが行われます。

wp()関数ではリクエストされたURLへの解析が行われます。例えばカテゴリーページへのリクエストURL(/category/wordpress/)をより厳格なクエリ(/index.php?category_name=wordpress)に変換するといった作業が行われます。またクエリの結果を元に、投稿ページやカテゴリーページの判定が行われます。それによってis_single()is_category()などといったページ判定関数の利用が可能となります。投稿内容の取得やループもこのタイミングで行えるようになります。

後はテンプレートを読み込んでページを表示するだけです。表示はtemplate-loader.phpで行われます。

template-loader.php

template-loader.phpではテンプレートの表示が行われます。ここでやっとHTMLページの完全な表示が行われることになります。

以下のコードの通り、アクセス時のURLに応じてそれぞれ異なるテンプレートが読み込まれます。例えばカテゴリーページ(http://marycore.jp/category/wordpress/, http://marycore.jp/?cat=9)へのアクセスが行われた場合にはis_category()関数が有効となるため、get_category_template()によるテンプレートファイルの取得が行われることになります。

最後に、取得されたテンプレートファイルのパスをinclude文で読み込むことでテンプレートの評価が行われ、HTMLが出力・表示されることになります。

<?php /* /htdocs/wp-includes/template-loader.php */

if (     is_home()     && $template = get_home_template()     ):
  // ホームページへのアクセスが行われた場合
  // $template == "/htdocs/wp-content/themes/marycore/index.php"
elseif ( is_single()   && $template = get_single_template()   ):
  // 投稿ページへのアクセスが行われた場合
  // $template == "/htdocs/wp-content/themes/marycore/single.php"
elseif ( is_page()     && $template = get_page_template()     ):
  // 固定ページへのアクセスが行われた場合
  // $template == "/htdocs/wp-content/themes/marycore/page.php"
elseif ( is_category() && $template = get_category_template() ):
  // カテゴリーページへのアクセスが行われた場合
  // $template == "/htdocs/wp-content/themes/marycore/category.php"
endif;

include( $template ); // テンプレートファイルを読み込み・表示する

single.php

テンプレートの内容はテーマによって異なります。参考までにmarycoreという架空のテーマの投稿ページ用のテンプレート(single.php)の実装例を示します。固定ページ用のpage.phpもカテゴリーページ用のcategory.phpもほとんど似たようなことをしています。

<?php /* /htdocs/wp-content/themes/marycore/single.php */
get_header(); // ヘッダーの表示(`<html><head></head><body>`など)
echo '<div id="primary" class="site-content"><div id="content" role="main">';
while (have_posts()) { the_post();
  get_template_part('content'); // 本文の表示(`<article>Hello</article>`など)
  comments_template('', true);  // コメントの表示
}
echo '</div></div>'; // <!-- #content --><!-- #primary -->
get_sidebar(); // サイドバーの表示(ウィジェットなどが表示される)
get_footer();  // フッターの表示(`<footer></footer></body></html>`など)

get_header()はWordPressの標準関数であり、関数の実行によってテーマディレクトリ内のheader.phpが自動的に読み込まれます。header.phpではhtml開始タグやheadタグの表示が行われることが一般的です。get_sidebar()get_footer()もだいたい同じようなことをしています。

get_template_part('content')も同様に、テーマディレクトリ内のcontent.phpを読み込みます。

<?php /* /htdocs/wp-content/themes/marycore/header.php */
echo '<html><head>';
echo '<title>' . wp_title('|', false, 'right') . '</title>';
wp_head(); // CSSやJavaScript用のタグが表示される
echo '</head><body>';
<?php /* /htdocs/wp-content/themes/marycore/content.php */
echo '<article>';
echo '<header class="entry-header">';
echo '<h1 class="entry-title">', get_the_title(), '</h1>'; // タイトルの表示
echo '</header>'; // <!-- .entry-header -->
echo '<div class="entry-content">';
the_content(); // 投稿の表示
echo '</div>'; // <!-- .entry-content -->
echo '</article>';
<?php /* /htdocs/wp-content/themes/marycore/sidebar.php */
echo '<div id="secondary" class="widget-area" role="complementary">';
dynamic_sidebar('sidebar-1'); // ウィジェットを表示する
echo '</div>'; // <!-- #secondary -->
<?php /* /htdocs/wp-content/themes/marycore/footer.php */
echo '<footer id="colophon" role="contentinfo">Copyright (C) marycore.jp</footer>';
wp_footer();
echo '</body></html>';
広告