WordPressの仕組みを理解するために中身をちょこっと覗いてみた

ここではWordPressの中身を覗くで、WordPressで作られたサイトがブラウザで表示されるまでどのようなファイルが読み込まれて何が起こっているのかを調べてみようと思います。記事を読みながらファイルを確認したい方はWordPressの公式サイトからWordPressをダウンロードしてください。ダウンロードしたzipファイルを解凍するとwordpressという名前のフォルダが出来ると思います。この中のファイルを見ていきます。

なおこの記事ではWordPress 4.0の中を覗きます。

以下ではコードの中に日本語で注釈を加えることで説明していくことにします。

はじめに:WordPressの構成要素

WordPressは大きく分けて4つの構成要素から成っています。

  • コアシステム

    すべての基礎です。これがWordPressの本体であって、ここなくしてWordPressは機能しません。例えばget_header関数とかもこのコアシステムに定義されています。

  • データベース

    記事の内容やらユーザー情報やらなんやらかんやらのデータを管理してます。WordPressではMySQLという管理システムを使用しています。

  • テンプレート

    これを元に各ページが動的に生成されます。テーマの作成というのはこのテンプレートを独自に作成することと同じです。

  • プラグイン

    WordPressの機能を拡張してくれるものです。例えばSEO対策を施しやすくしてくれるものや、ウェブページの読み込みを速くしてくれるもの、画像を圧縮してくれるものなどなど様々なプラグインが開発されています。

WordPressとApache・PHP・MySQLの関係

コアシステムのコードを見ていく前に、WordPressとApache・PHP・MySQLの関係についてちょっと書いておきます。

ブラウザ上でウェブサイトをみるとき、ブラウザとサーバとの間でなんやかんやのやりとりがあります。でもってこのサーバというのは中できっちり役割分担ができています。WordPressのようなウェブアプリケーションの場合は、Webサーバアプリケーションサーバデータベースサーバというのが関与しています。でもってWebサーバソフトウェアであるApache、アプリケーションサーバでプログラム実行をするPHP、データベースサーバでデータを管理するソフトウェアであるMySQLの3つがWordPressの動作に必須となっています。こいつらが連動することでWordPressが機能するわけです。

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

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

これがほんの数秒もない間に実行されてブラウザ上にウェブサイトが表示されているわけです。

これを頭に入れた上でWordPressがどんなふうに実行されているのかを見ていきましょう。

wordpress/index.php

まず最初に読み込まれて実行されるのはindex.phpです。ブログのトップページであろうと個別の記事ページであろうとはたまたECサイトのフロントページであろうと、まず読み込まれるエントリーポイントはindex.phpです。index.phpではwp-blog-header.phpが実行されるだけです。各テーマディレクトリに入っているindex.phpとは別物です。これはWordPressのルートディレクトリに入っているindex.phpなので注意してください。

/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */
 
/**
  -----------------------------------------------------------------------------
   WP_USE_THEMESという定数を定義して"true"を代入しています。
  -----------------------------------------------------------------------------
*/
 
/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define('WP_USE_THEMES', true);
 
/**
  -----------------------------------------------------------------------------
   wp-blog-header.phpを読み込んでindex.phpの役目は終了です。
  -----------------------------------------------------------------------------
*/
 
/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );

wordpress/wp-blog-header.php

index.phpの最後で実行されるwp-blog-header.phpを見ていきます。こいつの役割はwp-load.phpとwp-includes/template-loader.phpの読み込みです。

/**
 * Loads the WordPress environment and template.
 *
 * @package WordPress
 */
 
/**
  -----------------------------------------------------------------------------
   wp-load.phpとtemplate-loader.phpを読み込んでwp()を実行した後、
   wp-blog-header.phpの役目は終了です。
  -----------------------------------------------------------------------------
*/
 
if ( !isset($wp_did_header) ) {
 
    $wp_did_header = true;
 
/**
  -----------------------------------------------------------------------------
   require_onceでは一度だけファイルを読み込むことができます。
   いいかえると一度読み込んだファイルはもう読み込めません。
  -----------------------------------------------------------------------------
*/
    require_once( dirname(__FILE__) . '/wp-load.php' );
 
    wp();
 
/**
  -----------------------------------------------------------------------------
   後で分かりますが、template-loader.phpでは表示させるページの種類(トップページか、
   記事のページか、固定ページか、などなど)に応じてテーマディレクトリからテンプレートファイルを
   読み込みます。
   ということは「どのようなページを表示させるのか」というのはこれ以前にすでに解析済みです。
  -----------------------------------------------------------------------------
*/
    require_once( ABSPATH . WPINC . '/template-loader.php' );
 
}

wordpress/wp-load.php

続いてwp-load.phpです。基本的な役割はwp-config.phpを読み込む、もしくはwp-config.phpが存在しない場合(WordPressをインストールした直後)にwp-config.phpを作成すること、そしてwp-includes/version.phpを実行することです。

/**
 * Bootstrap file for setting the ABSPATH constant
 * and loading the wp-config.php file. The wp-config.php
 * file will then load the wp-settings.php file, which
 * will then set up the WordPress environment.
 *
 * If the wp-config.php file is not found then an error
 * will be displayed asking the visitor to set up the
 * wp-config.php file.
 *
 * Will also search for wp-config.php in WordPress' parent
 * directory to allow the WordPress directory to remain
 * untouched.
 *
 * @internal This file must be parsable by PHP4.
 *
 * @package WordPress
 */
 
/**
  -----------------------------------------------------------------------------
   このファイル(wp-load.php)があるディレクトリを絶対パスとして定義しています。
  -----------------------------------------------------------------------------
*/
 
/** Define ABSPATH as this file's directory */
define( 'ABSPATH', dirname(__FILE__) . '/' );
 
error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
 
/**
  -----------------------------------------------------------------------------
   このファイルと同じ階層にwp-config.phpがあればそれを読み込んでいます。
   wp-config.phpの中ではMySQLデータベースや認証キーの設定などをした後、
   wp-settings.phpを読み込んでいます。
  -----------------------------------------------------------------------------
*/
 
if ( file_exists( ABSPATH . 'wp-config.php') ) {
 
    /** The config file resides in ABSPATH */
    require_once( ABSPATH . 'wp-config.php' );
 
} elseif ( file_exists( dirname(ABSPATH) . '/wp-config.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) {
 
    /** The config file resides one level above ABSPATH but is not part of another install */
    require_once( dirname(ABSPATH) . '/wp-config.php' );
 
/**
  -----------------------------------------------------------------------------
   WordPressのインストール直後にはwp-config.phpがなくてwp-config-sample.phpが
   あるだけなので、以下が実行されます。
  -----------------------------------------------------------------------------
*/
 
} else {
 
/**
  -----------------------------------------------------------------------------
   この部分はWordPressをインストールした後に一度だけ実行される、wp-config.phpの初期化用
   ウィザードになります。
   まずwp-includes/load.phpが実行され、次いでwp-includes/functions.php、そして
   wp-admin/setup.config.phpが実行されます。
   wp-config-sample.phpの中を覗くと分かりますが、wp-admin/setup.config.phpを実行する
   代わりにwp-config-sample.phpをwp-config.phpにリネームして中を編集してもOKです。
  -----------------------------------------------------------------------------
*/
    // A config file doesn't exist
 
    define( 'WPINC', 'wp-includes' );
    require_once( ABSPATH . WPINC . '/load.php' );
 
    // Standardize $_SERVER variables across setups.
    wp_fix_server_vars();
 
    require_once( ABSPATH . WPINC . '/functions.php' );
 
    $path = wp_guess_url() . '/wp-admin/setup-config.php';
 
    /*
     * We're going to redirect to setup-config.php. While this shouldn't result
     * in an infinite loop, that's a silly thing to assume, don't you think? If
     * we're traveling in circles, our last-ditch effort is "Need more help?"
     */
    if ( false === strpos( $_SERVER['REQUEST_URI'], 'setup-config' ) ) {
        header( 'Location: ' . $path );
        exit;
    }
 
/**
  -----------------------------------------------------------------------------
   wp-includes/version.phpが実行されます。
   version.phpの中では変数が定義されているだけです。
  -----------------------------------------------------------------------------
*/
 
    define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
    require_once( ABSPATH . WPINC . '/version.php' );
 
    wp_check_php_mysql_versions();
    wp_load_translations_early();
 
    // Die with an error message
    $die  = __( "There doesn't seem to be a <code>wp-config.php</code> file. I need this before we can get started." ) . '</p>';
    $die .= '' . __( "Need more help? <a href='http://codex.wordpress.org/Editing_wp-config.php'>We got it</a>." ) . '</p>';
    $die .= '<p>' . __( "You can create a <code>wp-config.php</code> file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file." ) . '</p>';
    $die .= '<p><a href="' . $path . '" class="button button-large">' . __( "Create a Configuration File" ) . '</a>';
 
    wp_die( $die, __( 'WordPress › Error' ) );
}

wordpress/wp-settings.php

wp-load.phpで読み込まれたwp-config.phpの最後に実行されるのがwp-settings.phpです。wp-includes内の様々なファイルを読み込み、コアシステムで使用する定数や変数、関数、クラスを設定します。またプラグインの読み込みやテーマの初期化、さらにはWordPressの初期化も行います。

/**
 * Used to set up and fix common variables and include
 * the WordPress procedural and class library.
 *
 * Allows for some configuration in wp-config.php (see default-constants.php)
 *
 * @internal This file must be parsable by PHP4.
 *
 * @package WordPress
 */
 
/**
 * Stores the location of the WordPress directory of functions, classes, and core content.
 *
 * @since 1.0.0
 */
define( 'WPINC', 'wp-includes' );
 
// Include files required for initialization.
require( ABSPATH . WPINC . '/load.php' );
require( ABSPATH . WPINC . '/default-constants.php' );
 
/*
 * These can't be directly globalized in version.php. When updating,
 * we're including version.php from another install and don't want
 * these values to be overridden if already set.
 */
global $wp_version, $wp_db_version, $tinymce_version, $required_php_version, $required_mysql_version;
require( ABSPATH . WPINC . '/version.php' );
 
// Set initial default constants including WP_MEMORY_LIMIT, WP_MAX_MEMORY_LIMIT, WP_DEBUG, WP_CONTENT_DIR and WP_CACHE.
wp_initial_constants();
 
// Check for the required PHP version and for the MySQL extension or a database drop-in.
wp_check_php_mysql_versions();
 
// Disable magic quotes at runtime. Magic quotes are added using wpdb later in wp-settings.php.
@ini_set( 'magic_quotes_runtime', 0 );
@ini_set( 'magic_quotes_sybase',  0 );
 
// WordPress calculates offsets from UTC.
date_default_timezone_set( 'UTC' );
 
// Turn register_globals off.
wp_unregister_GLOBALS();
 
// Standardize $_SERVER variables across setups.
wp_fix_server_vars();
 
// Check if we have received a request due to missing favicon.ico
wp_favicon_request();
 
// Check if we're in maintenance mode.
wp_maintenance();
 
// Start loading timer.
timer_start();
 
// Check if we're in WP_DEBUG mode.
wp_debug_mode();
 
// For an advanced caching plugin to use. Uses a static drop-in because you would only want one.
if ( WP_CACHE )
    WP_DEBUG ? include( WP_CONTENT_DIR . '/advanced-cache.php' ) : @include( WP_CONTENT_DIR . '/advanced-cache.php' );
 
// Define WP_LANG_DIR if not set.
wp_set_lang_dir();
 
/**
  -----------------------------------------------------------------------------
   ここでclass-wp.phpを読み込んでいます。
   class-wp.phpでは
  -----------------------------------------------------------------------------
*/
 
// Load early WordPress files.
require( ABSPATH . WPINC . '/compat.php' );
require( ABSPATH . WPINC . '/functions.php' );
require( ABSPATH . WPINC . '/class-wp.php' );
require( ABSPATH . WPINC . '/class-wp-error.php' );
require( ABSPATH . WPINC . '/plugin.php' );
require( ABSPATH . WPINC . '/pomo/mo.php' );
 
// Include the wpdb class and, if present, a db.php database drop-in.
require_wp_db();
 
// Set the database table prefix and the format specifiers for database table columns.
$GLOBALS['table_prefix'] = $table_prefix;
wp_set_wpdb_vars();
 
// Start the WordPress object cache, or an external object cache if the drop-in is present.
wp_start_object_cache();
 
// Attach the default filters.
require( ABSPATH . WPINC . '/default-filters.php' );
 
// Initialize multisite if enabled.
if ( is_multisite() ) {
    require( ABSPATH . WPINC . '/ms-blogs.php' );
    require( ABSPATH . WPINC . '/ms-settings.php' );
} elseif ( ! defined( 'MULTISITE' ) ) {
    define( 'MULTISITE', false );
}
 
register_shutdown_function( 'shutdown_action_hook' );
 
// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
    return false;
 
// Load the L10n library.
require_once( ABSPATH . WPINC . '/l10n.php' );
 
// Run the installer if WordPress is not installed.
wp_not_installed();
 
/**
  -----------------------------------------------------------------------------
   ここで大事なのはquery.php、rewrite.phpの読み込みです。
   query.phpでは表示させるべきデータを取得するためにデータベースへアクセスします。
   またWP_Queryクラスやis_home()などの条件分岐タグもquery.phpで定義されています。
   rewrite.phpではWP_Rewriteクラスを定義しています。
  -----------------------------------------------------------------------------
*/
 
// Load most of WordPress.
require( ABSPATH . WPINC . '/class-wp-walker.php' );
require( ABSPATH . WPINC . '/class-wp-ajax-response.php' );
require( ABSPATH . WPINC . '/formatting.php' );
require( ABSPATH . WPINC . '/capabilities.php' );
require( ABSPATH . WPINC . '/query.php' );
require( ABSPATH . WPINC . '/date.php' );
require( ABSPATH . WPINC . '/theme.php' );
require( ABSPATH . WPINC . '/class-wp-theme.php' );
require( ABSPATH . WPINC . '/template.php' );
require( ABSPATH . WPINC . '/user.php' );
require( ABSPATH . WPINC . '/session.php' );
require( ABSPATH . WPINC . '/meta.php' );
require( ABSPATH . WPINC . '/general-template.php' );
require( ABSPATH . WPINC . '/link-template.php' );
require( ABSPATH . WPINC . '/author-template.php' );
require( ABSPATH . WPINC . '/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 . '/category-template.php' );
require( ABSPATH . WPINC . '/comment.php' );
require( ABSPATH . WPINC . '/comment-template.php' );
require( ABSPATH . WPINC . '/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 . '/update.php' );
require( ABSPATH . WPINC . '/canonical.php' );
require( ABSPATH . WPINC . '/shortcodes.php' );
require( ABSPATH . WPINC . '/class-wp-embed.php' );
require( ABSPATH . WPINC . '/media.php' );
require( ABSPATH . WPINC . '/http.php' );
require( ABSPATH . WPINC . '/class-http.php' );
require( ABSPATH . WPINC . '/widgets.php' );
require( ABSPATH . WPINC . '/nav-menu.php' );
require( ABSPATH . WPINC . '/nav-menu-template.php' );
require( ABSPATH . WPINC . '/admin-bar.php' );
 
// Load multisite-specific files.
if ( is_multisite() ) {
    require( ABSPATH . WPINC . '/ms-functions.php' );
    require( ABSPATH . WPINC . '/ms-default-filters.php' );
    require( ABSPATH . WPINC . '/ms-deprecated.php' );
}
 
// Define constants that rely on the API to obtain the default value.
// Define must-use plugin directory constants, which may be overridden in the sunrise.php drop-in.
wp_plugin_directory_constants();
 
$GLOBALS['wp_plugin_paths'] = array();
 
// Load must-use plugins.
foreach ( wp_get_mu_plugins() as $mu_plugin ) {
    include_once( $mu_plugin );
}
unset( $mu_plugin );
 
// Load network activated plugins.
if ( is_multisite() ) {
    foreach( wp_get_active_network_plugins() as $network_plugin ) {
        wp_register_plugin_realpath( $network_plugin );
        include_once( $network_plugin );
    }
    unset( $network_plugin );
}
 
/**
 * Fires once all must-use and network-activated plugins have loaded.
 *
 * @since 2.8.0
 */
do_action( 'muplugins_loaded' );
 
if ( is_multisite() )
    ms_cookie_constants(  );
 
// Define constants after multisite is loaded. Cookie-related constants may be overridden in ms_network_cookies().
wp_cookie_constants();
 
// Define and enforce our SSL constants
wp_ssl_constants();
 
// Create common globals.
require( ABSPATH . WPINC . '/vars.php' );
 
// Make taxonomies and posts available to plugins and themes.
// @plugin authors: warning: these get registered again on the init hook.
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 );
}
unset( $plugin );
 
// Load pluggable functions.
require( ABSPATH . WPINC . '/pluggable.php' );
require( ABSPATH . WPINC . '/pluggable-deprecated.php' );
 
// Set internal encoding.
wp_set_internal_encoding();
 
// Run wp_cache_postload() if object cache is enabled and the function exists.
if ( WP_CACHE && function_exists( 'wp_cache_postload' ) )
    wp_cache_postload();
 
/**
 * Fires once activated plugins have loaded.
 *
 * Pluggable functions are also available at this point in the loading order.
 *
 * @since 1.5.0
 */
do_action( 'plugins_loaded' );
 
// Define constants which affect functionality if not already defined.
wp_functionality_constants();
 
// Add magic quotes and set up $_REQUEST ( $_GET + $_POST )
wp_magic_quotes();
 
/**
 * Fires when comment cookies are sanitized.
 *
 * @since 2.0.11
 */
do_action( 'sanitize_comment_cookies' );
 
/**
 * WordPress Query object
 * @global object $wp_the_query
 * @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 object $wp_query
 * @since 1.5.0
 */
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
 
/**
 * Holds the WordPress Rewrite object for creating pretty URLs
 * @global object $wp_rewrite
 * @since 1.5.0
 */
$GLOBALS['wp_rewrite'] = new WP_Rewrite();
 
/**
 * WordPress Object
 * @global object $wp
 * @since 2.0.0
 */
$GLOBALS['wp'] = new WP();
 
/**
 * WordPress Widget Factory Object
 * @global object $wp_widget_factory
 * @since 2.8.0
 */
$GLOBALS['wp_widget_factory'] = new WP_Widget_Factory();
 
/**
 * WordPress User Roles
 * @global object $wp_roles
 * @since 2.0.0
 */
$GLOBALS['wp_roles'] = new WP_Roles();
 
/**
 * Fires before the theme is loaded.
 *
 * @since 2.6.0
 */
do_action( 'setup_theme' );
 
// Define the template related constants.
wp_templating_constants(  );
 
// Load the default text localization domain.
load_default_textdomain();
 
$locale = get_locale();
$locale_file = WP_LANG_DIR . "/$locale.php";
if ( ( 0 === validate_file( $locale ) ) && is_readable( $locale_file ) )
    require( $locale_file );
unset( $locale_file );
 
// Pull in locale data after loading text domain.
require_once( ABSPATH . WPINC . '/locale.php' );
 
/**
 * WordPress Locale object for loading locale domain date and various strings.
 * @global object $wp_locale
 * @since 2.1.0
 */
$GLOBALS['wp_locale'] = new WP_Locale();
 
// Load the functions for the active theme, for both parent and child theme if applicable.
if ( ! defined( 'WP_INSTALLING' ) || 'wp-activate.php' === $pagenow ) {
    if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
        include( STYLESHEETPATH . '/functions.php' );
    if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
        include( TEMPLATEPATH . '/functions.php' );
}
 
/**
 * Fires after the theme is loaded.
 *
 * @since 3.0.0
 */
do_action( 'after_setup_theme' );
 
// Set up current user.
$GLOBALS['wp']->init();
 
/**
 * Fires after WordPress has finished loading but before any headers are sent.
 *
 * Most of WP is loaded at this stage, and the user is authenticated. WP continues
 * to load on the init hook that follows (e.g. widgets), and many plugins instantiate
 * themselves on it for all sorts of reasons (e.g. they need a user, a taxonomy, etc.).
 *
 * If you wish to plug an action once WP is loaded, use the wp_loaded hook below.
 *
 * @since 1.5.0
 */
do_action( 'init' );
 
// Check site status
if ( is_multisite() ) {
    if ( true !== ( $file = ms_site_check() ) ) {
        require( $file );
        die();
    }
    unset($file);
}
 
/**
 * This hook is fired once WP, all plugins, and the theme are fully loaded and instantiated.
 *
 * AJAX requests should use wp-admin/admin-ajax.php. admin-ajax.php can handle requests for
 * users not logged in.
 *
 * @link http://codex.wordpress.org/AJAX_in_Plugins
 *
 * @since 3.0.0
 */
do_action( 'wp_loaded' );

wordpress/wp-includes/template-loader.php

wordpress/wp-blog-header.phpの最後で読み込まれるwordpress/wp-includes/template-loader.phpです。ここでは表示させるページの種類に応じて、テーマフォルダからテンプレートファイルを読み込みます。

/**
 * Loads the correct template based on the visitor's url
 * @package WordPress
 */
if ( defined('WP_USE_THEMES') && WP_USE_THEMES )
    /**
     * Fires before determining which template to load.
     *
     * @since 1.5.0
     */
    do_action( 'template_redirect' );
 
/**
 * Filter whether to allow 'HEAD' requests to generate content.
 *
 * Provides a significant performance bump by exiting before the page
 * content loads for 'HEAD' requests. See #14348.
 *
 * @since 3.5.0
 *
 * @param bool $exit Whether to exit without generating any content for 'HEAD' requests. Default true.
 */
if ( 'HEAD' === $_SERVER['REQUEST_METHOD'] && apply_filters( 'exit_on_http_head', true ) )
    exit();
 
// Process feeds and trackbacks even if not using themes.
if ( is_robots() ) :
    /**
     * Fired when the template loader determines a robots.txt request.
     *
     * @since 2.1.0
     */
    do_action( 'do_robots' );
    return;
elseif ( is_feed() ) :
    do_feed();
    return;
elseif ( is_trackback() ) :
    include( ABSPATH . 'wp-trackback.php' );
    return;
endif;
 
/**
  -----------------------------------------------------------------------------
   is_home()やis_page()などの条件分岐タグに応じてテンプレートファイルの読み込みをしています。
   もしどのタグにも対応しない場合、もしくはタグに対応するテンプレートファイルが存在しない場合は
   テーマフォルダ内のindex.phpを読み込みます。
  -----------------------------------------------------------------------------
*/
 
if ( defined('WP_USE_THEMES') && WP_USE_THEMES ) :
    $template = false;
    if     ( is_404()            && $template = get_404_template()            ) :
    elseif ( is_search()         && $template = get_search_template()         ) :
    elseif ( is_front_page()     && $template = get_front_page_template()     ) :
    elseif ( is_home()           && $template = get_home_template()           ) :
    elseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) :
    elseif ( is_tax()            && $template = get_taxonomy_template()       ) :
    elseif ( is_attachment()     && $template = get_attachment_template()     ) :
        remove_filter('the_content', 'prepend_attachment');
    elseif ( is_single()         && $template = get_single_template()         ) :
    elseif ( is_page()           && $template = get_page_template()           ) :
    elseif ( is_category()       && $template = get_category_template()       ) :
    elseif ( is_tag()            && $template = get_tag_template()            ) :
    elseif ( is_author()         && $template = get_author_template()         ) :
    elseif ( is_date()           && $template = get_date_template()           ) :
    elseif ( is_archive()        && $template = get_archive_template()        ) :
    elseif ( is_comments_popup() && $template = get_comments_popup_template() ) :
    elseif ( is_paged()          && $template = get_paged_template()          ) :
    else :
        $template = get_index_template();
    endif;
    /**
     * Filter the path of the current template before including it.
     *
     * @since 3.0.0
     *
     * @param string $template The path of the template to include.
     */
    if ( $template = apply_filters( 'template_include', $template ) )
        include( $template );
    return;
endif;

まとめ

ここまでをまとめるとだいたいこんな感じです。主要なファイルだけを抜き出して、読み込まれる順に書いてあります。

/wordpressディレクトリ /wordpress/wp-includes/ディレクトリ ファイルの役割
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の初期化も行います。
query.php 表示させるべきデータを取得するためにデータベースへアクセスします。WP_Queryクラスやis_home()などの条件分岐タグも定義しています。
rewrite.php WP_Rewriteクラスを定義しています。
template-loader.php 表示させるページの種類に応じて、テーマフォルダからテンプレートファイルを読み込む。

最後に

PHPがまったくわからなくても、コアファイルを読むとなんとなくPHPに慣れてきて分かるようになってくるものです。テーマフォルダ内のheader.phpやpage.phpだけじゃなくて時間があればコアファイルも見てみるとWordPressがどんな仕組みで動作しているのかに触れることができて面白いと思います。

参考ページ