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 でつくったウェブサイトにアクセスすると、おおまかには次のようなことが行われています。

  1. ブラウザに URL をうちこむと、サーバにリクエストが送られる。
  2. ウェブサーバ上の Apache がリクエストされたファイルを探す。
  3. php ファイルが指定された場合はアプリケーションサーバで PHP が動いてプログラムが実行される。
  4. そのプログラムがデータベースへアクセスを要求すると、データベースサーバ上の MySQL に渡ってデータの読み込みや保存が行われる。
  5. アプリケーションサーバでの処理が終了すると、HTML ファイルなどが作成されてウェブサーバに返される。
  6. ウェブサーバからブラウザへリクエストの結果が返ってきて、ブラウザが 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 です。このファイルの役割は

  1. wp-load.php ファイルを読み込んで WordPress のコアを読み込む(初期化フェーズ)
  2. wp 関数を実行してクエリの生成とデータベースへの問い合わせを行い、表示させる HTML ページに必要なデータをすべて揃える(リクエスト解析・処理フェーズ)
  3. 表示させるページのテンプレートを読み込む 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.phpwp-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.phppage.php だけじゃなくて、時間があればコアファイルも見てみると WordPress がどんな仕組みで動作しているのかに触れることができて面白いと思います。

参考ページ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です