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