WordPress起動時に読み込まれるPHPファイルの順番2016/01/052020/01/02WEBサイト作成Tweetdefine()関数とconst()関数による定数定義方法の違いPHPの定数定義は、クラス外からグローバル関数として使用するdefine()関数が使われてきましたが、PHP5.3からはクラス内で使用するconst()が使えるようになっています。Person('yama');$hito->konnichiwa();読み込まれるPHPファイルの順番WordPressは、6つのファイルとwp関数が、順番に呼び出されて起動します。);1行目:定数WP_USE_THEMESにtureをセットし、この定数はあとで読み込むteplate-loader.phpの中で、テーマテンプレートを有効にするための条件となります。カレントディレクトリにあるwp-blog-header.phpをrequireでインクルードします。仮にWordPressを別ディレクトリにインストール(WordPressのアドレスが違う場合)する際でも、index.phpはWordPressのエントリーポイントなので、必ずドメインルートに置く必要があり、2行目で/blog/wp-blog-header.phpみたいに、インストールディレクトリにあるファイルをインクルードするように修正します。これはエントリーポイントをドメインルートに置くだけで、インストールディレクトリは自由に選択できるという柔軟性を実現しています。dirname関数はファイルである自分が入っているディレクトリ、つまり親ディレクトリを示すのでカレントディレクトリになりますが、カレントディレクトリをさらにdirname関数の引数にすると、カレントディレクトリが入っているディレクトリ、すなわち1個親のディレクトリを指します。__FILE__はPHP定義済み定数で自分自身のファイルまでのパス、dirname(__FILE__)自分自身がいるディレクトリ、つまり親ディレクトリまでのパスとなり、dirname(dirname(__FILE__))になると祖父ディレクトリまでのパスとなります。);}2行目:以降は変数$wp_did_headerが空の場合の処理であり、まずtureをセットする。この$wp_did_headerが何なのかイマイチはっきりしませんが、php.iniのregister_globalディレクティブがONだと、仮にURLのクエリストリングで「index.php?wp_did_header=dummy」とかやられたら、コード上で$wp_did_header変数にdummyという値が格納されてしまうのでマズイらしい。よって$wp_did_headerが空であることを前提として処理を継続させます。3行目:wp-load.phpを1回だけインクルード4行目:wp関数が実行される。エラーの種類を設定する。4行目:WordPressルートにwp-config.phpがある場合。wp-config.phpはWordPressのインストール時にDB名、ユーザー名、パスワードなどパラメータを設定することで自動生成されます。wp-config.phpがあるということはWordPressのインストールが完了しているということです。5行目:WordPressルートのwp-config.phpを1回だけインクルード6行目:WordPressルートの1個上の親ディレクトリ、通常はドキュメントルートにwp-config.phpがありwp-setting.phpがない場合(関数の前に@があるのでエラーログを出力しない)7行目:ドキュメントルートのwp-config.phpを1回だけインクルード以下はwp-config.phpがない場合、つまりwp-load.phpは存在するがwp-config.phpがないということは、インストールはしたもののパラメータが未設定で自動生成されていない状態で、この場合以下が1回だけ実行されます。);}そもそもwp-config.phpはダウンロード時のWordPressのコアファイルの中には存在せず、インストール時に自動生成されますが、設定が終わっていないと以下のエラーを出力します。ファイルが見つかりません。編集」を参照してください。wp-config.phpファイルを作成することもできますが、すべてのサーバーにおいて正常に動作するわけではありません。安全な方法は手動でファイルを作成することです。wp-config.phpインストール時に接続情報やユーザー情報を入れることで自動生成された環境設定ファイルをWordPressの起動時に読み込む。wp-settings.phpWordPress全体で使うオブジェクトを生成し、スーパーグローバル変数に格納し、処理やクラス的なライブラリをインクルードする重要なファイルです。18行目:wp_initial_constants関数で、phpの実行メモリ上限をマルチサイトで64MB、シングルサイトで40MBに指定、ブログIDのデフォルトを1に指定、などなど。21行目:wp_check_php_mysql_versions関数で、PHPとMySQLがWordPressに対してバージョン不足の際にエラーを表示させる。24行目:php.iniのディレクティブであるマジッククォートはSQLインジェクション(SQL攻撃)防止のため、シングルクオート、ダブルクオート、バックスラッシュ、NULL文字を自動的にバックスラッシュでエスケープする機能ですが、副作用が多いためPHP5.4でデフォルトOFFされていますが、WordPress内でも無効化しています。31行目:php.iniのディレクティブであるregister_global=Onだと、GETかPOSTのクエリストリングで送信した値が、$_GET[‘変数’]や$_POST[‘変数’]で取得できるのはいいとしても、$変数自体にも値がセットされてしまっているため、もしプログラムで$変数の初期化を忘れてしまった場合に、URLの改ざんにより問題が起こる可能性があるため、Offと同じ状態にしましょうという関数がload.php内のwp_unregister_globals関数です。);}}PHP5.4からregister_globalディレクティブはデフォルトでOFFですが、WordPress内でもOffにします。スーパーグローバル変数$GLOBALSは連想配列です。);//load.php内の関数でregister_globalsディレクティブの設定をOFFにする。unset($file);}//wp_loadedフックを点火しコアモジュール、プラグイン、テーマを起動する。$wpという重要なインスタンスを生成し、スーパーグローバル変数$GROBALSに格納しているところです。272行目:WP_QUeryクラスから$wp_the_queryオブジェクトを生成し$GROBALSに格納280行目:WP_QUeryクラスから$wp_queryオブジェクトを生成し$GROBALSに格納294行目:WPクラスから$wpオブジェクトを生成し$GROBALSに格納wp-settings.phpには、プラグイン開発で必要になるフックが以下の順に埋め込んであります。);//wp_loadedフックを点火しコアモジュール、プラグイン、テーマを起動する。条件分岐タグで使用されるすべてのis_変数を設定クエリに基づき$wp_query->get_posts()関数で投稿データを$posts配列に格納WPクラスからWP_Queryクラスに関数が以下のように呼ばれて繋がっていきます。$wp_the_queryを関数内で使用するためにグローバル宣言しています。wp-includes/functions.phpの中にwp関数が定義されており、ここでWPクラスのmainメソッドに引数$query_varsを渡して実行します。$wp_query;}WPクラス自体はwp-includes/class-wp.phpに定義されており、ここにmainメソッドがあります。}}URLをパース(文法に従って分析)しクエリを特定wp-includes/class-wp.phpのWPクラス内のparse_requestメソッドでパース処理を行ない、URLにマッチしたクエリを特定します。}}条件分岐タグで使用されるすべてのis_変数を設定query.phpのWP_Queryクラスにparse_queryメソッドがありますが、名前にparseがついているにもかかわらず、パース処理はすでにparse_requestメソッドで完了しており、ここではパース処理は行なわれず、条件分岐タグで使用するis_変数への値をセットします。}}クエリに基づき$wp_query->get_posts関数で投稿データを$posts配列に格納$wp->mainメソッドの中で6個のWPクラス自身のメソッドを実行していますが、実際にクエリのタイプを確定し投稿を取得し、$wp_query->postsに格納しているのは$wp->query_postsメソッドです。}}wp-settings.phpでWP_Queryクラスから生成したグローバル変数$wp_the_queryを、関数内で使用するためにグローバル宣言し$wp_the_query->queryメソッドを実行します。ここがWPクラスとWP_Queryクラスが連結するところで、WPクラスの$wpオブジェクトからWP_Queryクラスのメソッドを$wp_queryオブジェクトを通して実行しています。}}wp-includes/query.phpにあるWP_Queryクラスのget_postsメソッドで、要求された投稿をデータベースから取得し、グローバル変数$postsに格納しています。template_loader.phpWordPressのテンプレート階層とは、テンプレートファイルを表示するルールであり、それを実現するのがtemplate_loader.phpです。ページの更新日付などの情報だけを取得したときのメソッドになります。)がよく分かっていないのですが、exit_on_http_headはHEADメソッドに対してコンテンツを生成を認めるかどうかというフックのようです。要はHEADメソッドならExit終了ということ。)/*WP_USE_THEMESはテーマが使われているか否かを判定。テンプレートファイルWordPressループの中のthe_postsテンプレートタグにより、$wp_query->postsから現在の投稿を順次に読み込んでいきます。endwhile;endif;?>このhave_posts()関数やthe_post()関数を実行する$wp_queryオブジェクトは、wp-includes/query.phpの中に定義されているWP_Queryクラスから生成されており、このメソッドを実行しています。$wp_query->is_home();}WP_Queryクラスの中にhave_post()やthe_post()やis_home()などのメソッドが定義されています。}}つまりWordPressループはWP_Queryクラスからオブジェクトを生成することにより、いくつものバリエーションのループを生成することができます。endwhile;endif;?>これでメインクエリのhave_posts関数でデータの有無を判断し、the_post関数でグローバル変数$postに格納された投稿を取得することがわかりました。