keysさん、こんにちは。
index.html → index.php という変換を、(Canonical URL 機能)と言う
って事を知っていなければ、canonical.phpまでたどりつけないですね。
まあ、細かい間違いはおいといて。。。
私自身は、それほど練熟しているわけではなく、canonical.phpも今回辿り着くまではほとんど開いたこともありません。今回の回答については、かなりベタですが、以下のような感じで見つけています。
- 実行ロジックの中で、だいたいのあたりをつけ、exit;を割り込ませて、リダイレクトが実行されるポイントを割り出す
- そのポイントで行われているソースを追う。
- 対応策を検討する。
ちなみに、WordPressの実行ロジックの大元は、index.phpの次に読み込まれるwp-blog-header.phpの
require_once( dirname(__FILE__) . '/wp-load.php' );
wp();
require_once( ABSPATH . WPINC . '/template-loader.php' );
3行で、
require_once( dirname(__FILE__) . '/wp-load.php' );
が、wp-config.php、wp-settings.phpを読み込み、初期設定や必要なファイルの読み込みを行います。
wp();
は、リクエストされたURLを元に、データベースへのクエリーを生成し、該当する投稿・ページを抽出・変数へのセットを行います。
require_once( ABSPATH . WPINC . '/template-loader.php' );
は、名前からも想像つきますが、テーマのテンプレートを読み込み、表示を司る部分です。
今回は、おそらくURLのパース時あたりで行うのではないかと考え、まずはwp();内の各所でexit;させてみるも、ハズレでここではリダイレクト前のままです。
かと言って、テンプレートが読み込まれてレンダリングが始まってしまうとheaderによるリダイレクトは出来ませんから、この間と言うことになります。
で、さらに絞り込んでいくとtemplate-loader.phpの
do_action('template_redirect');
というフックでリダイレクトが行われることが分かります。
では、デフォルトのフックが登録されるdefault-filter.phpから実行関数がたどれるかと思いきや、このファイルに記述されているwp_old_slug_redirectという関数は全く違うもの。
他にこのフックで行われているものがあるはずなので、フックを管理・記憶している$wp_filterという変数をvar_dumpで表示させてみると、もう1つredirect_canonicalという関数がフックされていることが分かります。
で、あとは、この関数の記述されている場所を探し出して、ソースを読み、対応策を導き出すだけです。
$wp_filterであったり、WordPressがどのように起動して実行されていくかなどは、プラグインを作ったりすると、ソースを読むことが必須になるため、自然と覚えていく(経験と検索(爆)で)ものと思います。