WordPressのコアファイルを読みながら、PHPを学習してみることにしました(wp-settings.php編)

photo credit: Cupcake Sisters (Senel) via photopin cc
Update Web制作メモ >

前回に続きwp-settings.phpを解読していこうと思ったのですが、ますます難しくなり、わからないところが増えてきました…。ひとまず現段階で理解できたことと調べたことと、わからないところを全部、メモに残していきます。

wp-settings.php(1) – 関数、クラス、コアのコンテンツがある場所を記憶/いろいろ初期化

とっても長いので、少しずつ読み進めていきます。

<?php
/**
 * Used to set up and fix common variables and include
 * the WordPress procedural and class library.
 *(以下省略)
 */

/**
 * Stores the location of the WordPress directory of functions, classes, and core content.
 */
define( 'WPINC', 'wp-includes' );

// Include files required for initialization.
require( ABSPATH . WPINC . '/load.php' );
require( ABSPATH . WPINC . '/default-constants.php' );
require( ABSPATH . WPINC . '/version.php' );

// Set initial default constants including WP_MEMORY_LIMIT, WP_MAX_MEMORY_LIMIT, WP_DEBUG, WP_CONTENT_DIR and WP_CACHE.
wp_initial_constants( );

// Check for the required PHP version and for the MySQL extension or a database drop-in.
wp_check_php_mysql_versions();

冒頭のコメントによるとこのファイルは「共通の変数を定義したり、WordPressの手続き(流れ?)やクラスライブラリーを読み込むために使われる」ようです。

ここまでのまとめ

  • 関数、クラス、コアのコンテンツがある場所を記憶する(コメント参照)。前のファイルでも登場した定数WPINCを定義
  • 「初期化に必要なファイル」として、load.phpdefault-constants.phpversion.phpを読み込む
  • 関数wp_initial_constants()を実行。(コメントに書いてあるいくつかの)定数の初期値をセットする関数のようです(Codex日本語版には載っていない関数でしたので、英語版を参照)。
  • 関数wp_check_php_mysql_versions()を実行

このファイル、いろんなものを初期化するためのものといった感じなのでしょうか。

wp-settings.php(2) - マジッククオートをオフにする

// Disable magic quotes at runtime. Magic quotes are added using wpdb later in wp-settings.php.
@ini_set( 'magic_quotes_runtime', 0 );
@ini_set( 'magic_quotes_sybase',  0 );

マジッククオートというものをオフにするみたいです。わからない記述が出てきましたので、PHP公式リファレンスで調べます。

  • @ - PHP の式の前に付けた場合、 その式により生成されたエラーメッセージは無視されます
  • ini_set - 設定オプションの値を設定する
  • magic_quotes_runtime/magic_quotes_sybase - magic_quotes_runtime が有効の場合、 データベースおよびテクストファイルを含む外部ソースから データを返す全ての関数のクオートは、バックスラッシュで エスケープされます。magic_quotes_sybase も on の場合、シングルクオートは、バックスラッシュの代わりに シングルクオートでエスケープされます

マジッククオートについては以下のような警告文と、なぜマジッククオートを使用していたのかという補足のページがありました。

この機能は PHP 5.3.0 で 非推奨となり、 PHP 5.4.0 で削除されました。

ここまでのまとめ?

  • マジッククオートが何なのかはよくわからなかったのですが…そのマジッククオートをオフ(0なので)に設定(ini_set)し、エラーが出ても無視する(@)ということ?

wp-settings.php(3) - たくさんの関数を実行

// WordPress calculates offsets from UTC.
date_default_timezone_set( 'UTC' );

// Turn register_globals off.
wp_unregister_GLOBALS();

// Standardize $_SERVER variables across setups.
wp_fix_server_vars();

// Check if we have received a request due to missing favicon.ico
wp_favicon_request();

// Check if we're in maintenance mode.
wp_maintenance();

// Start loading timer.
timer_start();

// Check if we're in WP_DEBUG mode.
wp_debug_mode();

いくつもの関数が実行されています。それぞれの関数はまた別のファイルで定義されているはずですので、細かく見るのは後日にしようかと思います…。ただ、タイムゾーンを設定するとか、(サーバーのセットアップ状況によって異なる?)変数を標準化するなどのコメントがありますので、やっぱり初期設定というか環境を整えるようなことをしているのかなあ。

ここまでのまとめ

  • date_default_timezone_set( 'UTC' )など、7つの関数を実行する

wp-settings.php(4) - キャッシュに関する記述

// For an advanced caching plugin to use. Uses a static drop-in because you would only want one.
if ( WP_CACHE )
	WP_DEBUG ? include( WP_CONTENT_DIR . '/advanced-cache.php' ) : @include( WP_CONTENT_DIR . '/advanced-cache.php' );

知らない用語をPHP公式リファレンスで調べます。

  • ? - (expr1) ? (expr2) : (expr3) という式は、式1 が TRUE の場合に 式2 を、 式1 が FALSE の場合に 式3 を値とします。PHP 5.3 以降では、三項演算子のまんなかの部分をなくすこともできるようになりました。 式 expr1 ?: expr3 の結果は、expr1 が TRUE と同等の場合は expr1、 それ以外の場合は expr3 となります

コメントによると、以前の記事で話題にしたキャッシュ系プラグインを使う際に必要な何かみたいです。定数WP_CACHEがtrueのときにadvanced-cache.phpというファイルを読み込むということかな?

定数WP_CACHEに関して、さっき、

// Set initial default constants including WP_MEMORY_LIMIT, WP_MAX_MEMORY_LIMIT, WP_DEBUG, WP_CONTENT_DIR and WP_CACHE.
wp_initial_constants( );

という記述がありましたので、ちょっとこの関数が書かれているdefault-constants.phpCodexの該当ページ参照)というファイルを見てみました。

default-constants.php

if ( !defined('WP_CACHE') )
    define('WP_CACHE', false);

定義はまた別のファイルでされているかと思いますが、とりあえず、定数WP_CACHEのデフォルト値はfalseということでしょうか。

また、advanced-cache.phpというファイルについて検索してみたところ、キャッシュ系プラグインを手動でインストールする手順について書かれた記事をみつけました。

どうやらキャッシュ系プラグインをインストールすると定数WP_CACHEがtrueになって、advanced-cache.phpというファイルというファイルが作られるようです。

ここまでのまとめ

  • 定数WP_CACHEがtrueならadvanced-cache.phpを読み込む

そろそろ難しすぎてわからなくなってきました…。

wp-settings.php(5) - WordPressを日本語化するためのファイルを格納するディレクトリを設定

// Define WP_LANG_DIR if not set.
wp_set_lang_dir();

コメントを見てもどんな関数なのかわかりません…。wpseekというページで、この関数が定義されている場所がわかりましたので、load.phpをのぞきます。

load.php

function wp_set_lang_dir() {
	if ( !defined( 'WP_LANG_DIR' ) ) {
		if ( file_exists( WP_CONTENT_DIR . '/languages' ) && @is_dir( WP_CONTENT_DIR . '/languages' ) || !@is_dir(ABSPATH . WPINC . '/languages') ) {
			define( 'WP_LANG_DIR', WP_CONTENT_DIR . '/languages' ); // no leading slash, no trailing slash, full path, not relative to ABSPATH
			if ( !defined( 'LANGDIR' ) ) {
				// Old static relative path maintained for limited backwards compatibility - won't work in some cases
				define( 'LANGDIR', 'wp-content/languages' );
			}
		} else {
			define( 'WP_LANG_DIR', ABSPATH . WPINC . '/languages' ); // no leading slash, no trailing slash, full path, not relative to ABSPATH
			if ( !defined( 'LANGDIR' ) ) {
				// Old relative path maintained for backwards compatibility
				define( 'LANGDIR', WPINC . '/languages' );
			}
		}
	}
}

長いですし、知らない用語もたくさんです。PHP公式リファレンスで調べます。

  • file_exists - ファイルまたはディレクトリが存在するかどうか調べる
  • $a && $b - 論理積。$a および $b が共に TRUE の場合に TRUE
  • is_dir - ファイルがディレクトリかどうかを調べる
  • $a || $b - 論理和。$a または $b のどちらかが TRUE の場合に TRUE

つまり、wp-content内、あるいはwp-include内にlanguagesフォルダがあれば、定数WP_LANG_DIRwp-content / languagesと定義する。無ければwp-include / languagesを定数WP_LANG_DIRと定義する。ということであっているでしょうか?

wp-content / languagesをのぞいてみたら、拡張子が.moとか.poといったファイルがいくつか入っていました。これはWordPressを日本語化するためのファイルらしいです。

ここまでのまとめ

  • 定数WP_LANG_DIRが定義されていなければ、関数wp_set_lang_dir();を実行し、日本語化に必要なファイルを格納するディレクトリを設定する

wp-settings.php(6) - ファイルの初期読み込み、あれこれ設定

// Load early WordPress files.
require( ABSPATH . WPINC . '/compat.php' );
require( ABSPATH . WPINC . '/functions.php' );
require( ABSPATH . WPINC . '/class-wp.php' );
require( ABSPATH . WPINC . '/class-wp-error.php' );
require( ABSPATH . WPINC . '/plugin.php' );
require( ABSPATH . WPINC . '/pomo/mo.php' );

// Include the wpdb class and, if present, a db.php database drop-in.
require_wp_db();

// Set the database table prefix and the format specifiers for database table columns.
$GLOBALS['table_prefix'] = $table_prefix;
wp_set_wpdb_vars();

// Start the WordPress object cache, or an external object cache if the drop-in is present.
wp_start_object_cache();

// Attach the default filters.
require( ABSPATH . WPINC . '/default-filters.php' );

// Initialize multisite if enabled.
if ( is_multisite() ) {
	require( ABSPATH . WPINC . '/ms-blogs.php' );
	require( ABSPATH . WPINC . '/ms-settings.php' );
} elseif ( ! defined( 'MULTISITE' ) ) {
	define( 'MULTISITE', false );
}

register_shutdown_function( 'shutdown_action_hook' );

// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
	return false;

// Load the L10n library.
require_once( ABSPATH . WPINC . '/l10n.php' );

// Run the installer if WordPress is not installed.
wp_not_installed();

ファイルを読み込んだり、関数を実行したりしています。はじめに読み込む6つのファイルを少しのぞいてみました。

compat.phpの冒頭コメント

/**
 * WordPress implementation for PHP functions either missing from older PHP versions or not included by default.
 */

古いバージョンのPHPについて調整か何かをするファイルかな?

functions.phpの冒頭コメント

/**
 * Main WordPress API
 */

とっても長いファイルでした。たくさんの関数が定義されているみたいです。

class-wp.phpの冒頭コメント

/**
 * WordPress environment setup class.
 */

class-wp-error.phpの冒頭コメント

/**
 * WordPress Error API.
 * Contains the WP_Error class and the is_wp_error() function.
 */

plugin.phpの冒頭コメント

/**
 * The plugin API is located in this file, which allows for creating actions
 * and filters and hooking functions, and methods. The functions or methods will
 * then be run when the action or filter is called.
 * (以下省略)
 */

mo.phpの冒頭コメント

/**
 * Class for working with MO files
 */

WordPressのファイル、このような感じで冒頭にファイルの概要を書いてくれているので、なーんとなく何をするためのファイルかな?ということがイメージできます。しんせつ。

ここまでのまとめ

  • 6つのファイルを読み込む
  • wpdbクラスというものを読み込むための関数を実行
  • データベーステーブルの接頭語となる変数$table_prefixをセット
  • データベーステーブルカラムのフォーマットをセットするための関数を実行
  • オブジェクトキャッシュというものを開始するための関数を実行
  • default-filters.phpを読み込む
  • マルチサイトを初期化
  • WordPressの基本部分だけが必要な場合にはほとんどの部分の読み込みをとめる(動作を軽くするため?)
  • l10n.phpを読み込む
  • WordPressがインストールされていなければインストーラーを起動させる、という関数を実行

コメントを参照して書き出しましたが、何をしているのかわからないところが多くなってきました。

wp-settings.php(7) - たくさんのファイルを読み込む!

// Load most of WordPress.
require( ABSPATH . WPINC . '/class-wp-walker.php' );
require( ABSPATH . WPINC . '/class-wp-ajax-response.php' );
require( ABSPATH . WPINC . '/formatting.php' );
require( ABSPATH . WPINC . '/capabilities.php' );
require( ABSPATH . WPINC . '/query.php' );
require( ABSPATH . WPINC . '/theme.php' );
require( ABSPATH . WPINC . '/class-wp-theme.php' );
require( ABSPATH . WPINC . '/template.php' );
require( ABSPATH . WPINC . '/user.php' );
require( ABSPATH . WPINC . '/meta.php' );
require( ABSPATH . WPINC . '/general-template.php' );

// 以下省略

ようやくここで、この作業の目的であるテンプレートタグで使われるWordPress関数が定義されているquery.phpとかgeneral-template.phpが読み込まれるようです。

ここまでのまとめ

  • query.phpgeneral-template.phpなど、43個のファイルを読み込む

wp-settings.php(8) - フックを実行する

読み進めているwp-settings.phpはまだまだ続きがあり、この後もファイルを読み込んだり、変数を定義したり、いろんな関数を実行したりしていますが…とっても長いですし内容をちゃんと把握するのが現段階では難しいため、この後のコードは省略します。

知らない用語はこれまでと同じく、PHP公式リファレンスで調べておきます。

  • foreach - 配列を反復処理するための便利な方法です。 foreach が使えるのは配列とオブジェクトだけであり、 別のデータ型や初期化前の変数に対して使うとエラーになります。foreach (array_expression as $value) / foreach (array_expression as $key => $value)
  • unset - 指定した変数の割当を解除する

このforeachという記述がこの後たくさん登場していました。たとえばこのようなものです。

// Load must-use plugins.
foreach ( wp_get_mu_plugins() as $mu_plugin ) {
	include_once( $mu_plugin );
}
unset( $mu_plugin );

wp_get_mu_plugins()という関数をwpseekで調べてみました。リファレンスの説明のとおり、ここには配列がはいるんですね。

Returns array of must-use plugin files to be included in global scope.

それから、do_actionという関数がたくさん登場していましたので、Codexで調べました。

フックを作成します。 add_action でアクションが付加可能になります。

do_action( 'after_setup_theme' )について書かれていたところ

if ( ! defined( 'WP_INSTALLING' ) || 'wp-activate.php' === $pagenow ) {
if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
include( STYLESHEETPATH . '/functions.php' );
if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
include( TEMPLATEPATH . '/functions.php' );

do_action( 'after_setup_theme' );

お話がそれますが…WordPressで子テーマをつくってカスタマイズするとき、親テーマのfunctions.phpより子テーマのfunctions.phpを後に読み込んでほしい場合、フックするアクションをafter_setup_themeにして…みたいな解説を読んだ記憶があります。このあたりでわけがわからなくなってしまったので、既存のテーマのカスタマイズを諦めて自作してしまったんです。

とにかくそのへんに関連しそうなところでした。

次回はquery.phpなどを読んでみます

前回よりも難しく、わからないところが多くなりました。もう少ししっかり理解できるようにがんばります…。

次回は、このwp-settings.phpで読み込まれるquery.phpgeneral-template.phpをのぞいて、いよいよテンプレートタグで使用されるWordPress関数がどのように定義されているか、学習してみようと思います。