WordPressのリクエスト処理

Wordpress

WordPressのおおまかな処理

WordPressの処理は、リクエストパラメータで処理が決まります。
今回、WordPressの処理について、まとめてみました。ム、ムズカシクナンカナイ・・・ ( -ω-; )
まず、インストールディレクトリ直下のindex.phpが「/wp-blog-header.php」を読み込み、環境のロード・実行がはじまります。

エントリポイント*index.php

インストールディレクトリ直下のindex.phpは、以下のようなコードが記載されています。

//index.php
define('WP_USE_THEMES', true);
require( dirname( __FILE__ ) . '/wp-blog-header.php' );

ここでは、テーマテンプレートを有効にし、カレントディレクトリのwp-blog-header.phpを読み込むといった初期条件がセットされます。
dirname( __FILE__ )は wp-config.php が存在しているディレクトリまでのフルパスになります。

wp-blog-header.php

wp-blog-header.php の処理コードは非常に単純ですが、こちらで大まかな処理がわかります。

//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-blog-header.phpの処理の流れはコード通り・以下の処理になります。

① WordPressのライブラリを読み込み、環境構築
② wp関数の実行→WordPressのクエリを実行
③ テーマのテンプレートを読み込み、表示

そこから、少しだけ詳しく追加すると、こんな感じ。(・・;)
① WordPressのライブラリを読み込み、環境構築
※wp-load.php(環境のロード) ・・・require_once 一回だけ読み込む
 →wp-config.php(設定ファルの読み込み)
  →wp-setting.php(プラグイン・テーマfunctions.php読み込み)
② wp関数の実行→WordPressのクエリを実行(メイン処理)
 →$wp->parse_request()を使ってURLをパースし、クエリを特定
  →$wp_query->parse_query()でis_変数の設定
③ テーマのテンプレートを読み込み、表示
※template-loader.php (テンプレート選択)・・・require_once 一回だけ読み込む

ここの②のメイン処理は、wpオブジェクト群になります。

wp()関数を実行

前述②のwp()関数の実行を少し見ていきます。
下のコードにあるように、main()が実行され、リクエストの解析、httpヘッダーの送信、データの検索などが行われます。

//wp-includes/functions.php 
function wp( $query_vars = '' ) {
    global $wp, $wp_query, $wp_the_query;

    $wp->main( $query_vars );

    if ( ! isset( $wp_the_query ) ) {
        $wp_the_query = $wp_query;
    }
}

↑$wp->main( $query_vars ); で、mainメソッドを呼び出しています。
main()は、wp-includes/class-wp.phpで組まれています。

//wp-includes/class-wp.php
	public function main( $query_args = '' ) {
		$this->init();
                $parsed = $this->parse_request( $query_args );
		if ( $parsed ) {
			$this->query_posts();
			$this->handle_404();
			$this->register_globals();
		}
		$this->send_headers();
		do_action_ref_array( 'wp', array( &$this ) );
	}

$wp->parse_request()

この、$wp->parse_request()(※wpクラスのmain関数のparse_request関数)は、リクエストを解析して、リクエストパラメーターを抽出し、$wp->query_varsに保存するまでの役割を果たしています。
流れとしては、大まかにこのような処理になります。
1) $wp->parse_request()を使ってURLをパースし、クエリを特定
2) $wp_query->parse_query()でis_変数を設定(is_page, is_category, is_single等)
3) $wp->query_posts()で$wpdbを通して投稿情報が配列として格納

$wp->parse_requestのリクエスト解析

$wp->parse_request()メソッドでは、
1)リライトルールが設定されていた場合、リクエストパスから$wp->perma_query_varを取得
 ※例えば管理画面等から[設定]>[パーマリンク設定]でリライトルールされたURLの取得
2) $_SERVER[‘REQUEST_URI’] や HTTP GET 変数 $_GET、HTTP POST 変数 $_POST などのURLからリクエストパスを抽出します。
3) $wp_rewrite->rules によるURLとの照合・フィルタリングが行われ、parse_str 関数によって配列 $wp->query_vars へと変換されます。
例えば、「https://sample.co.jp/2023/02/10/sample」というURLが渡されると、$this->requestは「2023/02/10/sample」になり、配列として以下のように$wp->query_varsへ変換されます。

$wp->query_vars = [
  'page' => '0',
  'year' => '2023',
  'monthnum' => '01',
  'day' => '10',
  'name' => 'sample',
];
  • post_typeに基づくquery_varsがある場合、post_type、nameを追加
  • taxonomyに由来するquery_varsの値の整理
  • post_typeに由来するquery_varsをpublic_queryableに基づいてフィルター

このように取得した値は、$wp->query_varsに保存されます。

取得された値は配列になって$wp_query->postsとして、表示すべき投稿があるかどうかを判定したり、テーマのテンプレートで利用できるようになります。

最後まで読んでいただいた人は、ありがとうございました。
今回はここまでにします。m(_ _)m