Linux(Ubuntu)サーバとダーツを愛する中年サラリーマンの日記。

Linuxサーバより愛を込めて。

Wordpress

WordPressとwp-load.php

wp-blog-header.phpから最初に呼び出されるPHPファイルであるwp-load.php。

 

次に読み込まれるwp-template-loader.phpの前に各種定数に値をセットしたり設定ファイルを読み込んだりとWordpress起動初期の重要な役割を果たすファイルとなっています。

 

それではいつものように中身を読み進めていきたいと思います。

 

wp-load.phpの中身

今までに見てきたソースより随分長いように感じますが、めげずに見ていきましょう。いつもと同じくコメントを排除したものを見ると

 

<?php

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 );

if ( file_exists( ABSPATH . 'wp-config.php') ) {

        require_once( ABSPATH . 'wp-config.php' );

} elseif ( file_exists( dirname(ABSPATH) . '/wp-config.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) {

        require_once( dirname(ABSPATH) . '/wp-config.php' );

} else {

        define( 'WPINC', 'wp-includes' );

        require_once( ABSPATH . WPINC . '/load.php' );

        wp_fix_server_vars();

        require_once( ABSPATH . WPINC . '/functions.php' );

        $path = wp_guess_url() . '/wp-admin/setup-config.php';

        if ( false === strpos( $_SERVER['REQUEST_URI'], 'setup-config' ) ) {
                header( 'Location: ' . $path );
                exit;
        }

        define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
        require_once( ABSPATH . WPINC . '/version.php' );

        wp_check_php_mysql_versions();
        wp_load_translations_early();

        $die  = __( "There doesn't seem to be a <code>wp-config.php</code> file. I need this before we can get started." ) . '</p>';
        $die .= '<p>' . __( "Need more help? <a href='https://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 &rsaquo; Error' ) );
}

 

やっぱり長いですね。。。

 

諦めずに順番に見ていくことにします。

 

define( 'ABSPATH', dirname(__FILE__) . '/' );

 

前回出てきた「ABSPATH」が早速出てきました。

 

wp-load.phpが格納されている場所、すなわちWordpressのインストールディレクトリを意味していることがはっきりと確認できました。

 

最後に付いている'/'はdirname(__FILE__)で帰ってくる値が最後の/を含まないため、ABSPATHに続けてディレクトリやファイルを指定する際に使いやすいようにということでしょう。

 

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 );

 

使用されているのはerror_reporting()関数で、問題が発生した際に出力するエラーの種類を設定するものです。引数に使用されるパラメータはあらかじめ定義されていて、PHPの公式ページに詳細が掲載されています。

 

これ以降に各種PHPファイルを読み込んでいく中で発生しうるエラーの処理をこの段階で定義しているということですね。

 

if ( file_exists( ABSPATH . 'wp-config.php') ) {

        require_once( ABSPATH . 'wp-config.php' );

 

if文で分岐して処理を分けていることがわかります。file_exists()関数は引数に指定されるファイルが存在していればtrueを、なければfalseを返す関数なので、ルートディレクトリにwp-config.phpが存在するかどうかをチェックしているわけですね。

 

※余談ですが、以前AccessのVBAを使用していた時にファイルの所在を調べるときはDir()関数を使ったなぁ…なんて思い出しました。

 

ここは先程の条件分岐でtrueが返されたときに実行される行になります。wp-config.phpをこの段階で読み込んでいることがわかります。

 

} elseif ( file_exists( dirname(ABSPATH) . '/wp-config.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) {

        require_once( dirname(ABSPATH) . '/wp-config.php' );

 

elseif文なので、最初の条件分岐でfalseが戻ってきたときに再度条件によって処理を分岐させています。

 

file_exists( dirname(ABSPATH) . 'wp-config.php' )は、wp-cinfig.phpを通常の場所(Wordpressのインストールディレクトリ)よりひとつ上の階層におくことも可能という仕様に対応するものということ。

 

&&は論理演算子の一つ(論理積)で、&&の前後それぞれがtrueだった時のみtrue、一方または双方がfalseならfalseとなります。ちなみにandで繋いでもおなじ意味になるかと。

 

なお、後半は!が付いているのでルートディレクトリにwp-settings.phpがなければtureとなりますね。

 

つまりここではwp-config.phpとwp-settings.phpそれぞれの所在を確認し、「wp-config.phpが存在する」かつ「wp-settings.phpが存在しない」時に条件がtrueと判断されてwp-config.phpを読み込みにいきます。

 

} else {

        define( 'WPINC', 'wp-includes' );

        require_once( ABSPATH . WPINC . '/load.php' );

        wp_fix_server_vars();

        require_once( ABSPATH . WPINC . '/functions.php' );

        $path = wp_guess_url() . '/wp-admin/setup-config.php';

        if ( false === strpos( $_SERVER['REQUEST_URI'], 'setup-config' ) ) {
                header( 'Location: ' . $path );
                exit;
        }

        define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
        require_once( ABSPATH . WPINC . '/version.php' );

        wp_check_php_mysql_versions();
        wp_load_translations_early();

        $die  = __( "There doesn't seem to be a <code>wp-config.php</code> file. I need this before we can get started." ) . '</p>';
        $die .= '<p>' . __( "Need more help? <a href='https://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 &rsaquo; Error' ) );

 

最後の部分はwp-config.phpが所定の位置に存在しないときに実行される処理=Wordpressがインストールさていない時の処理ということになります。

 

長いのでかなり省略する形になりますが、必要な定数に値をセットしてWordpressのインストールを実行するという流れになっています。たとえばwp-config.phpを作成したりデータベースのチェックをしたり…という処理を行うようです。

 

まとめ

細かいことは抜きにして、Wordpressの処理の概要が少しずつ見えてきたように思います。

 

wp-load.phpの処理内容をまとめておくと

  • wp-config.phpの所在をチェックして読み込む
  • インストールされていなければデータベースをチェックしてインストールを実施

ということになりましょうか。

 

ちなみにwp-config.phpを通常のインストールディレクトリの一つ上の階層へおくことができるというのは今まで知りませんでした。

 

セキュリティを考えるとこの方がいいのかも知れないですね。まだまだ知らないことがたくさんあって日々勉強になることばかりです。

 

オススメの記事

-Wordpress
-, ,

Copyright© Linuxサーバより愛を込めて。 , 2021 All Rights Reserved.