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項を読み飛ばしても構いません。
本記事に記載されているソースコードは完全な転載ではなく重要な部分のみを抜粋しています。
目次
- ページアクセス時
- .htaccess(パスのリダイレクトを行う)
- index.php(最初に読み込まれる)
- wp-blog-header.php(設定の読み込み、URLの解析)
- template-loader.php(テンプレートの読み込み)
- 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.php
とwp-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>';