ようへいの日々精進XP

よかろうもん

WordPress 完全に理解した (1) 〜 定数 WP_HOME と WP_SITEURL について 〜

tl;dr

WordPress を運用していて, 個人的な調べによると, 最もやらかすのは WordPress アドレスとサイトアドレスの設定をミスってしまい, せっかく頑張って構築した WordPress サイトにアクセス出来なることではないでしょうか. 多分にもれず, 私も何度となくやらかしました.

やらかすたんびにググっていたので, 実際のその解決方法をメモっておきます.

解決方法

解決方法は複数あるようですが, 一番, お手軽な解決方法は, wp-config.php をイジって定数 WP_HOMEWP_SITEURL を定義することだと思います.

define('WP_HOME','https://oreno-wordpress.com');
define('WP_SITEURL','https://oreno-wordpress.com');

/* That's all, stop editing! Happy blogging. */

wp-config.php の 90 行目くらいに書いておくと良さそうです.

サーバーにログインして, vim が入っていなければインストール, vim で wp-config.php を修正しましょう.

せっかくなので WordPressソースコードを読んでみる

そもそも WP_HOME とか WP_SITEURL について

wpdocs.osdn.jp

上記のドキュメントを参考にさせて頂きました.

定数 詳細
WP_HOME サイトアドレスを定義する. wp_options テーブル の home の値よりも優先される. WordPress をインストールした URL
WP_SITEURL WordPress アドレスを定義する. wp_options テーブルの siteurl の値よりも優先される. WordPress にクライアントユーザーがアクセスする URL

定数の名前と定義の意味が逆のような気がして紛らわしいです...

ちなみに, wp_options テーブルのテーブル定義は以下の通りとなっていて, WordPress の稼働に必要なデータが格納されています.

mysql> DESC wp_options;
+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| option_id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| option_name  | varchar(191)        | NO   | UNI |         |                |
| option_value | longtext            | NO   |     | NULL    |                |
| autoload     | varchar(20)         | NO   |     | yes     |                |
+--------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

さらに, 以下は手元の環境にて Docker で起動した WordPress の wp_options テーブルの中身の一部抜粋です.

mysql> SELECT option_name,option_value FROM wp_options WHERE option_name = 'home';
+-------------+-----------------------+
| option_name | option_value          |
+-------------+-----------------------+
| home        | http://localhost:8080 |
+-------------+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT option_name,option_value FROM wp_options WHERE option_name = 'siteurl';
+-------------+-----------------------+
| option_name | option_value          |
+-------------+-----------------------+
| siteurl     | http://localhost:8080 |
+-------------+-----------------------+
1 row in set (0.00 sec)

これらの値を定数 WP_HOME とか WP_SITEURL は上書きする挙動になっているということですな.

ソースコード

話題となっている WP_HOMEWP_SITEURL を呼んでいる関数はいくつかありますが, 以下のコードを読んでみたいと思います.

github.com

WP_HOMEWP_SITEURL は以下のように呼ばれています.

/**
 * Retrieve the WordPress home page URL.
 *
 * If the constant named 'WP_HOME' exists, then it will be used and returned
 * by the function. This can be used to counter the redirection on your local
 * development environment.
 *
 * @since 2.2.0
 * @access private
 *
 * @see WP_HOME
 *
 * @param string $url URL for the home location.
 * @return string Homepage location.
 */
function _config_wp_home( $url = '' ) {
    if ( defined( 'WP_HOME' ) ) {
        return untrailingslashit( WP_HOME );
    }
    return $url;
}

/**
 * Retrieve the WordPress site URL.
 *
 * If the constant named 'WP_SITEURL' is defined, then the value in that
 * constant will always be returned. This can be used for debugging a site
 * on your localhost while not having to change the database to your URL.
 *
 * @since 2.2.0
 * @access private
 *
 * @see WP_SITEURL
 *
 * @param string $url URL to set the WordPress site location.
 * @return string The WordPress Site URL.
 */
function _config_wp_siteurl( $url = '' ) {
    if ( defined( 'WP_SITEURL' ) ) {
        return untrailingslashit( WP_SITEURL );
    }
    return $url;
}

それぞれ, _config_wp_home_config_wp_siteurl という関数内で WP_HOMEWP_SITEURL が定義されているかどうかをチェックしていることがわかります. もし定義されている場合には, 定数の値を読み取って, ご丁寧に文字列の最後の / を取り除いて値を返すように実装されていました.

以上

WordPress アドレスサイトアドレス, WP_HOME, WP_SITEURL がうまく整理出来ていませんが, メモとさせて頂きます.