WordPressの仕組みを理解するために中身をちょこっと覗いてみた
ここでは WordPress の中身を覗くで、WordPress で作られたサイトがブラウザで表示されるまでどのようなファイルが読み込まれて何が起こっているのかを調べてみようと思います。記事を読みながらファイルを確認したい方はWordPressの公式サイトから WordPress をダウンロードしてください。ダウンロードしたzipファイルを解凍すると wordpress
という名前のフォルダが出来ると思います。この中のファイルを見ていきます。
なおこの記事では WordPress 5.7 の中を覗きます。
目次
はじめに: WordPress の構成要素
WordPress は大きく分けて4つの構成要素から成っています。
- コアシステム
すべての基礎です。これが WordPress の本体であって、ここなくして WordPress は機能しません。例えばテーマ開発でよく見るget_header
関数などもこのコアシステムに定義されています。 - データベース
記事の内容やらユーザー情報やらなんやらかんやらのデータを管理してます。WordPress では MySQL を使用しています。 - テンプレート
これを元に各ページが動的に生成されます。テーマの作成というのはこのテンプレートを独自に作成することを意味します。 - プラグイン
WordPress の機能を拡張してくれるものです。例えば SEO 対策を施しやすくしてくれるものや、ウェブページの読み込みを速くしてくれるもの、画像を圧縮してくれるものなどなど様々なプラグインが開発されています。
WordPress と Apache・PHP・MySQL の関係
コアシステムのコードを見ていく前に、WordPress と Apache・PHP・MySQL の関係についてちょっと書いておきます。
ブラウザ上でウェブサイトをみるとき、ブラウザとサーバとの間でなんやかんやのやりとりがあります。このサーバというのは中できっちり役割分担ができています。WordPress のようなウェブアプリケーションの場合は、ウェブサーバ、アプリケーションサーバ、データベースサーバというのが関与しています。そしてウェブサーバソフトウェアである Apache、アプリケーションサーバでプログラム実行をする PHP、データベースサーバでデータを管理するソフトウェアである MySQL の3つが WordPress の動作に必須となっています。これらが連動することでWordPress が機能するようになっています。
WordPress でつくったウェブサイトにアクセスすると、おおまかには次のようなことが行われています。
- ブラウザに URL をうちこむと、サーバにリクエストが送られる。
- ウェブサーバ上の Apache がリクエストされたファイルを探す。
- php ファイルが指定された場合はアプリケーションサーバで PHP が動いてプログラムが実行される。
- そのプログラムがデータベースへアクセスを要求すると、データベースサーバ上の MySQL に渡ってデータの読み込みや保存が行われる。
- アプリケーションサーバでの処理が終了すると、HTML ファイルなどが作成されてウェブサーバに返される。
- ウェブサーバからブラウザへリクエストの結果が返ってきて、ブラウザが HTML、CSS、JS ファイルなどを読み込んでウェブサイトが表示される。
これがほんの数秒もない間に実行されてブラウザ上にウェブサイトが表示されているわけです。これらを頭に入れた上で WordPress がどのように実行されているのかを見ていきましょう。
index.php
まず最初に読み込まれて実行されるのは index.php
です。ブログのトップページであろうと個別の記事ページであろうとはたまたコーポレートサイトのフロントページであろうと、まず読み込まれるエントリーポイントは index.php
です。これはなぜかというと、WordPress のインストール時に次のような .htaccess
ファイルが生成されるからです。
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>
# END WordPress
この .htaccess
は、リクエストされたURLに対応するファイルやディレクトリがなければトップディレクトリの index.php
を読み込みなさい、ということを命令しています。
index.php
ではwp-blog-header.php
が読み込まれるだけです。
// index.php
// ...(省略)
/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp-blog-header.php';
wp-blog-header.php
WordPress の処理内容を俯瞰するのに最も大切なのが wp-blog-header.php
です。このファイルの役割は
wp-load.php
ファイルを読み込んで WordPress のコアを読み込む(初期化フェーズ)wp
関数を実行してクエリの生成とデータベースへの問い合わせを行い、表示させる HTML ページに必要なデータをすべて揃える(リクエスト解析・処理フェーズ)- 表示させるページのテンプレートを読み込む
wp-includes/template-loader.php
ファイルを読み込む(表示フェーズ)
という3つになります。
wp-load.php
の読み込みが終わると init
アクションと wp_loaded
アクションが発火します。つまりこの段階で WordPress のコア機能の読み込み、有効化しているプラグインの読み込み、テーマの functions.php
の読み込みがすべて完了します。
続く wp
関数の実行によってリクエストしている URL の解析が行われ、データベースに対してどのようなクエリを発行するべきなのかが決定されます。そしてクエリがデータベースに投げられ、クエリ結果がデータベースから渡されます。この段階でウェブページを表示するのに最低限必要な情報が揃います。
最後の wp-includes/template-loader.php
の読み込みによって、有効化しているテーマで用意されているテンプレートが読み込まれます。WordPress テーマの開発をしている人は、ここで読み込まれるファイル (page.php や archive.php など) を自作している、ということになります。
WordPress をより理解するためには、この【初期化フェーズ】→【リクエスト解析・クエリフェーズ】→【テンプレート表示フェーズ】という3つのフェーズによる大きな流れを捉えることがとても大切です。
// wp-blog-header.php
// ...(省略)
if ( ! isset( $wp_did_header ) ) {
$wp_did_header = true;
// Load the WordPress library.
require_once __DIR__ . '/wp-load.php';
// Set up the WordPress query.
wp();
// Load the theme template.
require_once ABSPATH . WPINC . '/template-loader.php';
}
wp-load.php
続いて wp-load.php
です。基本的な役割は
wp-config.php
を読み込むwp-config.php
が存在しない場合 (WordPressをインストールした直後) はwp-admin/setup-config.php
にリダイレクトしてwp-config.php
を作成する
ことです。
// wp-load.php
// ...(省略)
if ( file_exists( ABSPATH . 'wp-config.php' ) ) {
require_once ABSPATH . 'wp-config.php';
// ...(省略)
} else {
// ...(省略)
if ( false === strpos( $_SERVER['REQUEST_URI'], 'setup-config' ) ) {
header( 'Location: ' . $path );
exit;
}
// ...(省略)
}
wp-config.php
wp-config.php
では接続するデータベース、データベースに接続できるユーザーとパスワード、データベースのホスト名などを定義します。そして最後に wp-settings.php
を読み込みます。
// wp-config.php
// ...(省略)
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );
/** MySQL database username */
define( 'DB_USER', 'username_here' );
/** MySQL database password */
define( 'DB_PASSWORD', 'password_here' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
// ...(省略)
require_once ABSPATH . 'wp-settings.php';
wp-settings.php
wp-settings.php
では wp-includes
内の様々なファイルを読み込み、コアシステムで使用する定数やグローバル変数、関数、クラスを設定します。またプラグインの読み込みやテーマの初期化、さらにはWordPressの初期化も行います。
// wp-settings.php
// ...(省略)
require ABSPATH . WPINC . '/version.php';
require ABSPATH . WPINC . '/load.php';
// ...(省略)
// 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';
// ...(省略)
// Load early WordPress files.
require ABSPATH . WPINC . '/compat.php';
require ABSPATH . WPINC . '/class-wp-list-util.php';
require ABSPATH . WPINC . '/formatting.php';
require ABSPATH . WPINC . '/meta.php';
require ABSPATH . WPINC . '/functions.php';
require ABSPATH . WPINC . '/class-wp-meta-query.php';
require ABSPATH . WPINC . '/class-wp-matchesmapregex.php';
require ABSPATH . WPINC . '/class-wp.php';
require ABSPATH . WPINC . '/class-wp-error.php';
require ABSPATH . WPINC . '/pomo/mo.php';
/**
* @global wpdb $wpdb WordPress database abstraction object.
* @since 0.71
*/
global $wpdb;
// Include the wpdb class and, if present, a db.php database drop-in.
require_wp_db();
// ...(省略)
// Attach the default filters.
require ABSPATH . WPINC . '/default-filters.php';
// ...(省略)
// Load most of WordPress.
require ABSPATH . WPINC . '/class-wp-walker.php';
require ABSPATH . WPINC . '/class-wp-ajax-response.php';
require ABSPATH . WPINC . '/capabilities.php';
require ABSPATH . WPINC . '/class-wp-roles.php';
require ABSPATH . WPINC . '/class-wp-role.php';
require ABSPATH . WPINC . '/class-wp-user.php';
require ABSPATH . WPINC . '/class-wp-query.php';
require ABSPATH . WPINC . '/query.php';
require ABSPATH . WPINC . '/class-wp-date-query.php';
require ABSPATH . WPINC . '/theme.php';
require ABSPATH . WPINC . '/class-wp-theme.php';
require ABSPATH . WPINC . '/class-wp-theme-json.php';
require ABSPATH . WPINC . '/class-wp-theme-json-resolver.php';
require ABSPATH . WPINC . '/class-wp-block-template.php';
require ABSPATH . WPINC . '/block-template-utils.php';
require ABSPATH . WPINC . '/block-template.php';
require ABSPATH . WPINC . '/theme-templates.php';
require ABSPATH . WPINC . '/template.php';
require ABSPATH . WPINC . '/https-detection.php';
require ABSPATH . WPINC . '/https-migration.php';
require ABSPATH . WPINC . '/class-wp-user-request.php';
require ABSPATH . WPINC . '/user.php';
require ABSPATH . WPINC . '/class-wp-user-query.php';
require ABSPATH . WPINC . '/class-wp-session-tokens.php';
require ABSPATH . WPINC . '/class-wp-user-meta-session-tokens.php';
require ABSPATH . WPINC . '/class-wp-metadata-lazyloader.php';
require ABSPATH . WPINC . '/general-template.php';
require ABSPATH . WPINC . '/link-template.php';
require ABSPATH . WPINC . '/author-template.php';
require ABSPATH . WPINC . '/robots-template.php';
require ABSPATH . WPINC . '/post.php';
require ABSPATH . WPINC . '/class-walker-page.php';
require ABSPATH . WPINC . '/class-walker-page-dropdown.php';
require ABSPATH . WPINC . '/class-wp-post-type.php';
require ABSPATH . WPINC . '/class-wp-post.php';
require ABSPATH . WPINC . '/post-template.php';
require ABSPATH . WPINC . '/revision.php';
require ABSPATH . WPINC . '/post-formats.php';
require ABSPATH . WPINC . '/post-thumbnail-template.php';
require ABSPATH . WPINC . '/category.php';
require ABSPATH . WPINC . '/class-walker-category.php';
require ABSPATH . WPINC . '/class-walker-category-dropdown.php';
require ABSPATH . WPINC . '/category-template.php';
require ABSPATH . WPINC . '/comment.php';
require ABSPATH . WPINC . '/class-wp-comment.php';
require ABSPATH . WPINC . '/class-wp-comment-query.php';
require ABSPATH . WPINC . '/class-walker-comment.php';
require ABSPATH . WPINC . '/comment-template.php';
require ABSPATH . WPINC . '/rewrite.php';
require ABSPATH . WPINC . '/class-wp-rewrite.php';
require ABSPATH . WPINC . '/feed.php';
require ABSPATH . WPINC . '/bookmark.php';
require ABSPATH . WPINC . '/bookmark-template.php';
require ABSPATH . WPINC . '/kses.php';
require ABSPATH . WPINC . '/cron.php';
require ABSPATH . WPINC . '/deprecated.php';
require ABSPATH . WPINC . '/script-loader.php';
require ABSPATH . WPINC . '/taxonomy.php';
require ABSPATH . WPINC . '/class-wp-taxonomy.php';
require ABSPATH . WPINC . '/class-wp-term.php';
require ABSPATH . WPINC . '/class-wp-term-query.php';
require ABSPATH . WPINC . '/class-wp-tax-query.php';
require ABSPATH . WPINC . '/update.php';
require ABSPATH . WPINC . '/canonical.php';
require ABSPATH . WPINC . '/shortcodes.php';
require ABSPATH . WPINC . '/embed.php';
require ABSPATH . WPINC . '/class-wp-embed.php';
require ABSPATH . WPINC . '/class-wp-oembed.php';
require ABSPATH . WPINC . '/class-wp-oembed-controller.php';
require ABSPATH . WPINC . '/media.php';
require ABSPATH . WPINC . '/http.php';
require ABSPATH . WPINC . '/class-http.php';
require ABSPATH . WPINC . '/class-wp-http-streams.php';
require ABSPATH . WPINC . '/class-wp-http-curl.php';
require ABSPATH . WPINC . '/class-wp-http-proxy.php';
require ABSPATH . WPINC . '/class-wp-http-cookie.php';
require ABSPATH . WPINC . '/class-wp-http-encoding.php';
require ABSPATH . WPINC . '/class-wp-http-response.php';
require ABSPATH . WPINC . '/class-wp-http-requests-response.php';
require ABSPATH . WPINC . '/class-wp-http-requests-hooks.php';
require ABSPATH . WPINC . '/widgets.php';
require ABSPATH . WPINC . '/class-wp-widget.php';
require ABSPATH . WPINC . '/class-wp-widget-factory.php';
require ABSPATH . WPINC . '/nav-menu.php';
require ABSPATH . WPINC . '/nav-menu-template.php';
require ABSPATH . WPINC . '/admin-bar.php';
require ABSPATH . WPINC . '/class-wp-application-passwords.php';
require ABSPATH . WPINC . '/rest-api.php';
require ABSPATH . WPINC . '/rest-api/class-wp-rest-server.php';
require ABSPATH . WPINC . '/rest-api/class-wp-rest-response.php';
require ABSPATH . WPINC . '/rest-api/class-wp-rest-request.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-posts-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-attachments-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-post-types-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-post-statuses-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-revisions-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-autosaves-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-taxonomies-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-terms-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-users-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-comments-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-search-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-blocks-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-block-types-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-block-renderer-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-settings-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-themes-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-plugins-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-block-directory-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-application-passwords-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-site-health-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-sidebars-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-widget-types-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-widgets-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-templates-controller.php';
require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-meta-fields.php';
require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-comment-meta-fields.php';
require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-post-meta-fields.php';
require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-term-meta-fields.php';
require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-user-meta-fields.php';
require ABSPATH . WPINC . '/rest-api/search/class-wp-rest-search-handler.php';
require ABSPATH . WPINC . '/rest-api/search/class-wp-rest-post-search-handler.php';
require ABSPATH . WPINC . '/rest-api/search/class-wp-rest-term-search-handler.php';
require ABSPATH . WPINC . '/rest-api/search/class-wp-rest-post-format-search-handler.php';
require ABSPATH . WPINC . '/sitemaps.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps-index.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps-provider.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps-registry.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps-renderer.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps-stylesheet.php';
require ABSPATH . WPINC . '/sitemaps/providers/class-wp-sitemaps-posts.php';
require ABSPATH . WPINC . '/sitemaps/providers/class-wp-sitemaps-taxonomies.php';
require ABSPATH . WPINC . '/sitemaps/providers/class-wp-sitemaps-users.php';
require ABSPATH . WPINC . '/class-wp-block-editor-context.php';
require ABSPATH . WPINC . '/class-wp-block-type.php';
require ABSPATH . WPINC . '/class-wp-block-pattern-categories-registry.php';
require ABSPATH . WPINC . '/class-wp-block-patterns-registry.php';
require ABSPATH . WPINC . '/class-wp-block-styles-registry.php';
require ABSPATH . WPINC . '/class-wp-block-type-registry.php';
require ABSPATH . WPINC . '/class-wp-block.php';
require ABSPATH . WPINC . '/class-wp-block-list.php';
require ABSPATH . WPINC . '/class-wp-block-parser.php';
require ABSPATH . WPINC . '/blocks.php';
require ABSPATH . WPINC . '/blocks/index.php';
require ABSPATH . WPINC . '/block-editor.php';
require ABSPATH . WPINC . '/block-patterns.php';
require ABSPATH . WPINC . '/class-wp-block-supports.php';
require ABSPATH . WPINC . '/block-supports/align.php';
require ABSPATH . WPINC . '/block-supports/border.php';
require ABSPATH . WPINC . '/block-supports/colors.php';
require ABSPATH . WPINC . '/block-supports/custom-classname.php';
require ABSPATH . WPINC . '/block-supports/duotone.php';
require ABSPATH . WPINC . '/block-supports/elements.php';
require ABSPATH . WPINC . '/block-supports/generated-classname.php';
require ABSPATH . WPINC . '/block-supports/layout.php';
require ABSPATH . WPINC . '/block-supports/spacing.php';
require ABSPATH . WPINC . '/block-supports/typography.php';
// ...(省略)
// Make taxonomies and posts available to plugins and themes.
create_initial_taxonomies();
create_initial_post_types();
// Register the default theme directory root.
register_theme_directory( get_theme_root() );
// ...(省略)
// Load active plugins.
foreach ( wp_get_active_and_valid_plugins() as $plugin ) {
wp_register_plugin_realpath( $plugin );
include_once $plugin;
/**
* Fires once a single activated plugin has loaded.
*
* @since 5.1.0
*
* @param string $plugin Full path to the plugin's main file.
*/
do_action( 'plugin_loaded', $plugin );
}
unset( $plugin );
// Load pluggable functions.
require ABSPATH . WPINC . '/pluggable.php';
require ABSPATH . WPINC . '/pluggable-deprecated.php';
// ...(省略)
do_action( 'plugins_loaded' );
// ...(省略)
/**
* WordPress Query object
*
* @global WP_Query $wp_the_query WordPress Query object.
* @since 2.0.0
*/
$GLOBALS['wp_the_query'] = new WP_Query();
/**
* Holds the reference to @see $wp_the_query
* Use this global for WordPress queries
*
* @global WP_Query $wp_query WordPress Query object.
* @since 1.5.0
*/
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
/**
* Holds the WordPress Rewrite object for creating pretty URLs
*
* @global WP_Rewrite $wp_rewrite WordPress rewrite component.
* @since 1.5.0
*/
$GLOBALS['wp_rewrite'] = new WP_Rewrite();
/**
* WordPress Object
*
* @global WP $wp Current WordPress environment instance.
* @since 2.0.0
*/
$GLOBALS['wp'] = new WP();
/**
* WordPress Widget Factory Object
*
* @global WP_Widget_Factory $wp_widget_factory
* @since 2.8.0
*/
$GLOBALS['wp_widget_factory'] = new WP_Widget_Factory();
/**
* WordPress User Roles
*
* @global WP_Roles $wp_roles WordPress role management object.
* @since 2.0.0
*/
$GLOBALS['wp_roles'] = new WP_Roles();
/**
* Fires before the theme is loaded.
*
* @since 2.6.0
*/
do_action( 'setup_theme' );
// ...(省略)
// 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';
}
}
unset( $theme );
/**
* Fires after the theme is loaded.
*
* @since 3.0.0
*/
do_action( 'after_setup_theme' );
// ...(省略)
// Set up current user.
$GLOBALS['wp']->init();
// ...(省略)
do_action( 'init' );
// ...(省略)
do_action( 'wp_loaded' );
wp-includes/template-loader.php
wp-blog-header.php
の最後で読み込まれるのが wp-includes/template-loader.php
です。ここでは表示させるページの種類に応じて、テーマフォルダからテンプレートファイルを読み込みます。
// wp-includes/template-loader.php
// ...(省略)
if ( wp_using_themes() ) {
$tag_templates = array(
'is_embed' => 'get_embed_template',
'is_404' => 'get_404_template',
'is_search' => 'get_search_template',
'is_front_page' => 'get_front_page_template',
'is_home' => 'get_home_template',
'is_privacy_policy' => 'get_privacy_policy_template',
'is_post_type_archive' => 'get_post_type_archive_template',
'is_tax' => 'get_taxonomy_template',
'is_attachment' => 'get_attachment_template',
'is_single' => 'get_single_template',
'is_page' => 'get_page_template',
'is_singular' => 'get_singular_template',
'is_category' => 'get_category_template',
'is_tag' => 'get_tag_template',
'is_author' => 'get_author_template',
'is_date' => 'get_date_template',
'is_archive' => 'get_archive_template',
);
$template = false;
// Loop through each of the template conditionals, and find the appropriate template file.
foreach ( $tag_templates as $tag => $template_getter ) {
if ( call_user_func( $tag ) ) {
$template = call_user_func( $template_getter );
}
// ...(省略)
}
// ...(省略)
if ( $template ) {
include $template;
// ...(省略)
}
return;
}
まとめ
ここまでをまとめるとだいたいこんな感じです。主要なファイルだけを抜き出して、読み込まれる順に書いてあります。
ファイル名 | ファイルの役割 |
---|---|
index.php |
最初に読み込まれ、wp-blog-header.php を読み込む。 |
wp-blog-header.php |
wp-load.php と wp-includes/template-loader.php を読み込む。 |
wp-load.php |
wp-config.php を読み込み(wp-config.php が存在しない場合は wp-config.php を作成する)、wp-includes/version.php を読み込む。 |
wp-config.php |
MySQL データベースや認証キーの設定などをした後、wp-settings.php を読み込む。 |
wp-settings.php |
wp-includes 内の様々なファイルを読み込み、コアシステムで使用する定数や変数、関数、クラスを設定します。またプラグインの読み込みやテーマの初期化、さらには WordPress の初期化も行います。 |
wp-includes/query.php |
表示させるべきデータを取得するためにデータベースへアクセスします。WP_Query クラスや is_home などの条件分岐タグも定義しています。 |
wp-includes/rewrite.php |
WP_Rewrite クラスを定義しています。 |
wp-includes/template-loader.php |
表示させるページの種類に応じて、テーマフォルダからテンプレートファイルを読み込む。 |
最後に
PHP がまったくわからなくても、コアファイルを読むとなんとなく PHP に慣れてきて分かるようになってくるものです。テーマフォルダ内の header.php
や page.php
だけじゃなくて、時間があればコアファイルも見てみると WordPress がどんな仕組みで動作しているのかに触れることができて面白いと思います。