ワードプレス起動からテンプレートファイル実行までの処理の流れ

animal_chara_radio_penguin ※Web開発
ワードプレス起動からテンプレートファイル実行までの処理の流れ
下記ページでワードプレスの仕組みについて解説しました。主にワードプレスのファイルの構成や PHP の動き、データベースとの関連について解説しています。 今回は主に PHP の動 ...

下記ページでワードプレスの仕組みについて解説しました。主にワードプレスのファイルの構成や PHP の動き、データベースとの関連について解説しています。ワードプレスの仕組みを「構成」と「PHPの動き」から解説

今回は主に PHP の動きに焦点を当て、特にワードプレスが起動してからテンプレートファイル(single.php や page.php など)が実行されるまでの処理の流れについて解説したいと思います。

このページで解説する部分

ワードプレス関連の開発(特にテーマの開発・カスタマイズ)をしている方には役に立つ知識になると思います。

Contents [hide]

ワードプレス起動からの処理の概要

まずはワードプレス起動からテンプレートファイルが実行されるまでの処理の流れの概要をざっくりと解説したいと思います。

行われるのはテンプレートファイルを実行するための準備

ワードプレス起動からテンプレートファイルが実行されるまでに行われている処理は「テンプレートファイルを実行するための準備」です。

ワードプレスが準備する様子

おそらくどんなテーマでも、single.php や page.php などのテンプレートファイルは、そのファイル単体では実行できない PHP ファイルになっていると思います。

例えば有効化しているテーマのフォルダの下の single.php を下記のように変更してみます。

 single.php

<?php
the_post();
the_content();
?>

single.php は投稿記事のページを表示するためのテンプレートファイルになります。投稿記事のページが表示される際にはこのファイルが実行されます。

the_post はワードプレスに用意された関数(以降ではワードプレス関数と呼びます)で、実行する事で投稿記事のデータ(タイトルや記事本文など)を取得する事ができます。

the_content もワードプレス関数であり、実行する事で the_post 関数で取得された投稿記事のデータの記事本文を表示する事ができます。

実際にウェブブラウザで投稿記事のページを表示してみると single.php が実行され下記のようにページが表示されます。

single.phpでページが表示されている様子

一方、この single.php を PHP コマンドで単体で実行してみると、php single.php

下記のようなエラーが出てしまいます。Fatal error: Uncaught Error: Call to undefined function the_post() in /Applications/MAMP/htdocs/wp-content/themes/TestTheme/single.php:2 Stack trace: #0 {main} thrown in /Applications/MAMP/htdocs/wp-content/themes/TestTheme/single.php on line 2

つまり、ウェブブラウザから表示した場合はうまく表示でき、単体で実行した場合はエラーになります。この2つの違いはなんでしょう?

この2つの違いは「テンプレートファイルを実行するための準備」が行われた後に single.php が実行されたかどうかです。

ウェブブラウザから表示した場合は、ワードプレスインストールフォルダ直下の index.php が実行され、続いてテンプレートファイルを実行するための準備が行われます。

そしてその後に single.php が実行されるので、テンプレートファイルを実行するための準備が行われた状態で single.php が実行されることになり、うまく動作(ページを表示)してくれることになります。

ただし、単体で single.php を実行してしまうと、テンプレートファイルを実行するための準備が行われていない状態で single.php が実行されることになるため、エラーになってしまったというわけです。

こんな感じで起動時にテンプレートファイルを実行するための準備を行ってくれるので、テーマ開発者は特に準備することなくテンプレートファイルを作成することができます。

実行される準備の例

ではどのような準備が行われるのでしょうか?ここについてもう少し深掘りしたいと思います。

関数定義ファイルの読み込み

先ほどのエラーを再度見てみましょう。Fatal error: Uncaught Error: Call to undefined function the_post() in /Applications/MAMP/htdocs/wp-content/themes/TestTheme/single.php:2 Stack trace: #0 {main} thrown in /Applications/MAMP/htdocs/wp-content/themes/TestTheme/single.php on line 2

これは PHP が「the_post 関数なんて知らねーよ!」と言っているエラーになります。

PHP では、PHP の内部関数(PHP にもともと用意されていた関数、例えば printf や strlen など)以外の関数は、実行する前にその関数の内容(関数の定義)を読み込んでおく必要があります。

関数定義ファイルを読み込む様子

the_post を含むワードプレス関数も PHP の内部関数ではないので、実行する前にその関数の定義を読み込んでおく必要があります。で、これを行わずに the_post 関数を実行しているので上記のようなエラーが発生しているのです。

こういったエラーが発生しないように、ワードプレスでは起動からテンプレートファイル実行までの間に、ワードプレス関数が定義された関数定義ファイルの読み込みを行います。

メインクエリの発行

次は the_post 関数が行う処理に注目してみましょう。

the_post 関数は前述の通り、表示しようとしている投稿記事のデータ(記事のタイトルや記事本文など)を取得する関数です。

では、このデータは元々どこに保存されているでしょうか?こういった投稿記事等のデータはデータベース(MySQL)に保存されています。

そして、データベースに保存されているデータを取得するためには、データベースに対してクエリを発行する必要があります。

ワードプレスでは起動からテンプレートファイル実行までの間に、クエリを発行してページを表示するためのデータの取得を行います。

データベースからデータを取得する様子

起動時にデータが取得されるので、テンプレートファイルでデータベースからデータを取得しなくても the_post 関数などを実行するだけで投稿記事のデータを取得する事が可能になっています。

こういったテンプレートファイルが実行されるまでに発行されるクエリをメインクエリと呼びます。クエリについては下記のページで解説していますので、こちらも読んでみていただければ幸いです。クエリー解説ページのアイキャッチワードプレスのクエリとは?メインクエリとサブクエリの違いは?

クエリについてまだ理解されていない方は、ひとまずここでは、ワードプレス起動からテンプレートファイルの実行までの間にデータベースからデータを取得しているということだけ覚えておけば良いと思います。

データベースへの接続

データベースからデータを取得するためには、そのデータベースに接続しておく必要があります(データベースのセットアップみたいなもの)。

したがって、ワードプレスでは起動からテンプレートファイル実行までの間に、データベースへの接続を行います(メインクエリ発行までに行われます)。

テンプレートファイルが実行されるまでにデータベースに接続が完了されているため、テンプレートファイル内ではメインクエリ以外のクエリ(サブクエリ )を発行してデータベースからデータを取得したり、メタデータなどのデータをデータベースに保存することもできます。

ワードプレスの設定読み込み

ただしウェブサーバー内には複数のデータベースが存在する可能性があります。

ですので、データベースに接続を行う前に、ワードプレスにどのデータベースに接続するかを教えてやる必要があります。

こういったワードプレスにどのような処理を行わせるかは設定ファイルを読み込ませることにより指定する事ができます。

データベース接続先であれば、おそらく皆さんがワードプレスインストール時に設定を行なった wp-config.php に記述されていますので、ワードプレスはこの設定ファイルを読み込み、この設定に従ってデータベースの接続を行います。

データベースへの接続

データベースへの接続だけでなく、ワードプレスでは起動直後に様々な設定を読み込み、以降行う処理はその設定に従って処理を行います。

サイトの設定読み込み

またワードプレス自体の設定だけでなく、サイトの設定の読み込みも行われます。

例えばサイトのタイトル・サブタイトル・管理者のメールアドレス・1ページに表示する記事数(カテゴリページなどに表示する記事数)、有効化されているテーマ、などなどが読み込まれます。

ページには投稿記事のタイトルだけでなく、サイトのタイトルも表示されますよね?

サイトの情報を表示する様子

こういったサイトの情報もテンプレートファイルから取得し、表示できるように、事前にワードプレスが準備してくれています。

テーマのセットアップ

さらにサイトの設定読み込みで読み込んだ「有効化されているテーマ」の情報に基づいて、テーマのセットアップを行います。

ここではテーマフォルダ以下の functions.php の読み込みが行われるので、テンプレートファイル内では functions.php で定義された関数を自由に実行する事が可能になります。

アクションフックの実行

またワードプレス起動からテンプレートファイル実行までには様々なアクションフックの実行が行われます。

例えば init アクションフックにフックされた関数の実行もテンプレートファイル実行前に実行されます。

ですので、例えばテーマの functions.php で init アクションフックに関数をフックしておけば、このタイミングに同時に実行することが可能です。

よくやるのがウィジェットの登録ですね(init というより widgets_init アクションフックにフックしますが…。widgets_init アクションフックにフックされた関数を実行する関数は init アクションフックにフックされています)。

フックについては下記で解説していますので、こちらもよろしければ読んでみてください。ワードプレスのフック解説ページのアイキャッチワードプレスのフックとは?使い方は?初心者向けに分かりやすく解説します!

ここまで説明してきたように、ワードプレス起動からテンプレートファイル実行までには様々な処理が行われ、実行するのに準備が整った状態でテンプレートファイルが実行されることになります。

テンプレートファイル実行の準備が整った様子

ワードプレス起動からの処理の流れ

ここまではワードプレス起動からテンプレートファイルが実行されるまでに行われる準備の内容について解説してきました。

ここからは実際にどのファイルでこれらの準備が行われるのかを説明していきたいと思います。

index.php の実行

まず行われるのはワードプレスインストールフォルダ直下の index.phpの実行です。

 index.php

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define( 'WP_USE_THEMES', true );

/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );

皆さんの index.php もこんな感じだと思います。ここで require によって同フォルダの wp-blog-header.php が実行されます。

wp-blog-header.php の実行

その wp-blog-header.php は下記のようになっています。

 wp-blog-header.php <?php
/**
* Loads the WordPress environment and template.
*
* @package WordPress
*/
if ( ! isset( $wp_did_header ) ) {

$wp_did_header = true;

// Load the WordPress library.
require_once( dirname( __FILE__ ) . ‘/wp-load.php’ );

// Set up the WordPress query.
wp();

// Load the theme template.
require_once( ABSPATH . WPINC . ‘/template-loader.php’ );

}

wp-blog-header.php では大きく分けると下記の3つのことが行われています。

  • wp-load.php の実行
  • wp 関数の実行
  • template-loader.php の実行

まずは wp-load.php の実行について見ていきましょう。

wp-load.php の実行

wp-load.php では下記の部分が実行されます。

 wp-load.php

if ( file_exists( ABSPATH . 'wp-config.php' ) ) {

	/** The config file resides in ABSPATH */
	require_once( ABSPATH . 'wp-config.php' );

} 

要は wp-config.php が実行されます。

wp-config.php の実行

wp-config.php ではワードプレスの設定読み込みが行われます。

ワードプレスの設定読み込み

ここでワードプレスの設定が読み込まれ、ワードプレスはこれらの設定に基づいて処理を行います。例えば下記ではデータベースの設定が行われていますので、この設定に基づいてデータベース接続が行われます。

 wp-config.php

// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'xxxx' );

/** MySQL データベースのユーザー名 */
define( 'DB_USER', 'yyy' );

wp-config.php の最後では下記が行われ、次に wp-settings.php が実行されることになります。

 wp-config.php

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

wp-settings.php の実行

いよいよここからが本格的にワードプレスの起動が始まっていきます。

wp-settings.php のソースコードは長く、説明するのが大変なため、ポイントだけ説明していきます。

関数定義ファイルの読み込み

wp-settings.php を読んでみると分かるのですが、ほとんどの処理は require での外部の関数定義ファイルの読み込みになります。

例えば下記などは全て関数定義ファイルの読み込みになります。この読み込みにより、ワードプレス関数が実行できるようになります。

 関数定義ファイルの読み込み

// Include files required for initialization.
require( ABSPATH . WPINC . '/class-wp-paused-extensions-storage.php' );
require( ABSPATH . WPINC . '/class-wp-fatal-error-handler.php' );
require( ABSPATH . WPINC . '/class-wp-recovery-mode-cookie-service.php' );
require( ABSPATH . WPINC . '/class-wp-recovery-mode-key-service.php' );
require( ABSPATH . WPINC . '/class-wp-recovery-mode-link-service.php' );
require( ABSPATH . WPINC . '/class-wp-recovery-mode-email-service.php' );
require( ABSPATH . WPINC . '/class-wp-recovery-mode.php' );
require( ABSPATH . WPINC . '/error-protection.php' );
require( ABSPATH . WPINC . '/default-constants.php' );
require_once( ABSPATH . WPINC . '/plugin.php' );

いくつかの部分に分かれてこの関数定義ファイルの読み込みが行われていますが、前半は主にワードプレスが起動するために必要な関数の読み込み、後半は主にテンプレートファイルを実行するために必要な関数の読み込みが行われていると考えて良いと思います。

データベースへの接続

いくつかのワードプレスセットアップ処理が行われたのち、続いてデータベース接続が行われます。この接続が行われるのは下記部分です。

 データベースへの接続

// Include the wpdb class and, if present, a db.php database drop-in.
global $wpdb;
require_wp_db();

これ以降、データベースからのデータの読み込み、データベースへのデータの書き込みが行えるようになります。

サイトの設定読み込み

データベースへの接続が完了後、いくつかの処理を経た後に下記が実行されます。

 サイトの設定読み込み

// Run the installer if WordPress is not installed.
wp_not_installed();

wp_not_installed の中でデータベースからウェブサイトの情報が読み込まれます(ここは結構自信ないです…)。

ここでサイトのタイトルや種々の設定(1ページに表示する記事数など)と共に、有効化しているテーマの名前が取得されます。

テーマのセットアップ

続いて関数定義ファイルの読み込みやプラグインのセットアップが行われたのちに下記が実行されます。

 テーマのセットアップ

// Load the functions for the active theme, for both parent and child theme if applicable.
foreach ( wp_get_active_and_valid_themes() as $theme ) {
	if ( file_exists( $theme . '/functions.php' ) ) {
		include $theme . '/functions.php';
	}
}

ここでは有効化されたテーマの functions.php が実行され、これ以降 functions.php で定義されている関数が実行可能になるため、テンプレートファイルでも実行することができるようになります。

この処理のちょっと前では言語設定なども行われています。

アクションフックの実行

テーマのセットアップが終わると、after_theme_setup アクションフック、init アクションフック、wp-loaded アクションフックにフックされた関数の実行が行われます。

 アクションフックの実行

do_action( 'after_setup_theme' );

/* 〜略〜 */
do_action( 'init' );

/* 〜略〜 */
do_action( 'wp_loaded' );

ここまでが wp_loaded.php の処理の流れになります。

wp 関数の実行

wp_loaded.php の処理が完了すると、続いて wp-blog-header.php から wp 関数が実行されます。

この wp 関数は wp-includes フォルダ直下の functions.php に定義されています。

メインクエリの発行

さらにこの wp 関数から wp-includes/class-wp.php で定義されている WP クラスの main メソッドが実行され、その中でさらに query_posts メソッドが実行されます。

 メインクエリの発行

	/**
	 * Set up the Loop based on the query variables.
	 *
	 * @since 2.0.0
	 *
	 * @global WP_Query $wp_the_query WordPress Query object.
	 */
	public function query_posts() {
		global $wp_the_query;
		$this->build_query_string();
		$wp_the_query->query( $this->query_vars );
	}

以降、どんどん関数を辿っていくと、データベースに対してメインクエリの発行が行われ、表示しようとしているページの投稿記事データが取得されます。

template-loader.php の実行

投稿記事データ取得後、wp-blog-header.php から template-lader.php が実行され、とうとうこのファイルで single.php や page.php 等のテンプレートファイルが実行されることになります。

まとめ

こんな感じでワードプレス起動後からテンプレートファイル実行までの間には、テンプレートファイルを実行するために必要な準備が行われます。

例えば、ワードプレス関数の関数定義ファイルがこの間に読み込まれているので、テンプレートファイルではワードプレス 関数を自由に実行することができます。

また、データベースの接続もこの間に行われているので、テンプレートファイルでデータベースからのデータの取得やデータベースへのデータの保存を行うことができます。

ワードプレス起動からテンプレートファイル実行までには非常に多くの処理が行われており、読み解くのが大変です。が、ここを理解しておくとテーマ開発などを行いやすくなります。

ワードプレスのことをもっと深く知るためにも、是非このページを参考にしてみてください。

タイトルとURLをコピーしました