WordPress の PHP をちょっと見てみよう Ⅰ
WordPress には、たくさんのファイルが入っています。
ここではテーマ内ではなく、トップの index.php から、関数や抑えておきたいポイント、気になるところなどをピックアップしたりして、ちょっとだけ見て行こうと思います。
<今回のピックアップ項目>
- WordPress PHP を見ていく
- WordPress PHP の開発・デバッグ
- 自分のデザインでWordPressを使いたい場合
- WordPress 最初にアクセスしてるファイルの順番
- WordPress のマルチサイト機能
- WordPress でメモリーエラーが出る場合
- PHPのCGI版とモジュール版
- ブログの表示速度をあげるプラグイン「WP Super Cache」
(テーマのカスタマイズのことが知りたい場合は、とても分かりやすい、良いサイトが結構ありますので、検索してそちらへ。)
ここでは、テーマのことはまあまあ分かった上、なお、他の PHP が見てみたい人向けな感じになります。
WordPress PHP を見ていく
まずは、index.php を開いてみると、以下の2行が書いてあります。
define('WP_USE_THEMES', true); require( dirname( __FILE__ ) . '/wp-blog-header.php' );
define()は定数設定で、以降PHP内で、WP_USE_THEMES っていう文字が出てきたら、値はtrueだよ、という意味。2行目はカレントディレクトリー内 wp-blog-header.php を読み込むです。
define(‘定数名’,値)
定数を定義するためのPHP関数。
require(‘ファイル名’)
ファイルを読み込むPHP関数。
dirname(‘ファイル名’)
パス中のディレクトリを取得するPHP関数。
__FILE__
現在参照中のファイルのフルパスとファイル名を表すPHPの定数。
WordPress PHP の開発・デバッグ
ちょっとここで、index.php に以下を書いて、dirname( __FILE__ ) の中身を見てみようと思います。
echo dirname( __FILE__ );exit;
結果はワードプレスをインストールしたカレントディレクトリーになっていると思います。
PHP の開発・デバッグするときには、echo print print_r などで内容を表示して、(次にexit;で終了したりして)みることをします。
WordPress メンテナンス中の例
余談ですが、ブログを急停止やメンテナンスしたいは、index.php のはじめに以下のコードを書きます。
<?php header("Content-type: text/html; charset=utf-8"); if( $_SERVER['REMOTE_ADDR'] != '自分のIPアドレス' ){ echo 'ただいまメンテナンス中です。';exit; } ?>
自分以外はメッセージを表示して終了します。
WordPress デバッグモード
また、WordPress にはデバッグモードがあります。
wp-config.php の84行目あたり
define('WP_DEBUG', false);
ここをtrueにすると、エラーの場合に真っ白じゃなく、エラー内容を表示してくれますので、開発中やデバッグ中にはここを有効にするといいと思います。
自分のデザインでWordPressを使いたい場合
index.php の1行目の定数 WP_USE_THEMES では、テーマを使うかという設定が出来るようになっています。
define(‘WP_USE_THEMES’, true);
自分のデザインでWordPressを使いたい場合や、他のCMSにWordPressデータを引っ張りたい場合などはここをfalse にします。
自分のデザインのPHPファイルに WordPress の index.php にある2行を入れておけば、WordPressが使えます。
WordPressテーマを使わないで自分のデザインに入れる場合の例
例えば、自分のデザイン index.php の階層以下にWordPressを入れてたとして、
index.php を以下のようにすれば、query_posts などをループ処理を表示出来ます。
<?php //index.php の2行をコピペ define('WP_USE_THEMES', false); require( dirname( __FILE__ ) . '/wordpress/wp-blog-header.php' );//パスを変更 query_posts( $args );//投稿を呼び出す ?> <html> <title>WordPressをテーマを使わないで自分のデザインに入れる場合の例</title> <body> <h1>自分のデザイン</h1> <?php //ループ処理 if (have_posts()){?> <ul> <?php while (have_posts()) : the_post(); ?> <li><time datetime="<?php the_time("Y-m-j") ?>"><?php the_time("Y/m/j") ?></time> <a href="<?php the_permalink();?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul> <?php } else{ ?><ul><li>表示する記事はありませんでした。</li></ul> <?php } ?> </body> <html>
WordPress 最初にアクセスしてるファイルの順番
そんな感じでPHPをたどっていくと、このようになっています。
—————————————————————————-
index.php → 1番目に読み込まれているファイル
wp-blog-header.php →2番目
wp-load.php →3番目
wp-config.php →4番目
wp-settings.php →5番目(ここからたくさんファイルが読み込まれている)
—————————————————————————-
順番に、2番目のファイル wp-blog-header.phpを開いてみます。
if ( !isset($wp_did_header) ) { $wp_did_header = true; require_once( dirname(__FILE__) . '/wp-load.php' ); wp(); require_once( ABSPATH . WPINC . '/template-loader.php' ); }
isset($変数名)
変数が存在するかどうか。
require_once(‘ファイル名’)
ファイルを一回だけ読み込む。
次の3番目のファイル wp-load.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' ); ・・・・
エラー出力の設定をして、wp-config.php ファイルを読み込んでいます。
file_exists(‘ファイル名’)
ファイルがあるかどうか。
wp-config.php ファイルは一番大事なものなので、あるないで分岐して、なかったら、wp-config.php を作るかどうかのメッセージを出しているみたいです。通常はあるはずので、ifの最初を通って次に行きます。
4番目 wp-config.php は基本的な設定ファイルで、ほぼ定数を設定して、最後で wp-settings.php を呼び出してます。
5番目 wp-settings.php を開きます。
最初に読み込んでいる
wp-includes/load.php (関数設定)
wp-includes/default-constants.php(関数設定)
wp-includes/version.php (変数設定)
は、関数・変数の定義で実行順番としては後なので飛ばして、 wp-settings.php で最初に実行してる関数に行きます。
wp-includes/default-constants.php の中で定義されています。
function wp_initial_constants() { global $blog_id; if ( !defined('WP_MEMORY_LIMIT') ) { if( is_multisite() ) { define('WP_MEMORY_LIMIT', '64M'); } else { define('WP_MEMORY_LIMIT', '40M'); } } if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) { define( 'WP_MAX_MEMORY_LIMIT', '256M' ); } ・・・・
マルチサイトかどうかで、php.ini(PHPの設置ファイル)の値をセットしなおしています。
is_multisite()
マルチサイトか?というWP関数です。wp-includes/load.php で定義されています。
ini_get()
php.ini の値をゲットする。
ini_set()
php.ini の値をセットする。
WordPress のマルチサイト機能
WordPress3.0 から、複数のブログを設置したい時や、サブドメインと併用で使ったりすることが出来ます。
有効にするには、wp-config.php に以下を加えたり、.htaccess を変更したりと少し大変そうです。
define( 'WP_ALLOW_MULTISITE', true );
設置したい場合はこちらの記事が分かりやすいと思いました。
<参考サイト>
WordPress マルチサイト機能を使ったんで、手順・やったことをまとめて綴ります
WordPress でメモリーエラーが出る場合
WordPress マルチサイトを設置をしてない時に、”Allowed memory size of ・・・” などのメモリ系のエラーが出たり、表示が遅すぎてエラーになったりした時にはここの数字を上げた方がいいと思います。
この関数が読み込まれる前、すなわち、wp-config.php の require_once(ABSPATH . ‘wp-settings.php’); の前に加える。
define('WP_MEMORY_LIMIT', '96M');
ついでに以下も加えておくと、管理画面での WP_MEMORY_LIMIT の値を増減させることが出来る。
define('WP_MAX_MEMORY_LIMIT', '256M');
phpinfo.php を作っておこう
PHPを開発・デバッグするときには、PHP の設定ファイル php.ini がどうなっているかを確認することをよくします。
phpinfo.php というファイルに1行を書くだけで、アクセスすると、PHPの設定がどうなっているか見れます。
<?php phpinfo();?>
見た後は、サーバからは削除して、ローカルに持っておくと便利です。
wp-settings.php に戻ります、次は、
wp-includes/load.php の中で定義されています。名前の通りPHPとMySQL のバージョンをチェックしています。
バージョンはさっき抜かした wp-includes/version.php に変数で設定してあり、もし違ったら、dieメッセージを出して終了になります。
@ini_set( ‘magic_quotes_sybase’, 0 );
magic_quotes
php.ini の設定です。(いろんな思い出がよみがえる響きです・・)
(’) (”) (\)( )とかの文字がDBに保存される時に、バックスラッシュで自動的にエスケープされるMySQLの(有難迷惑)機能です。
PHP5.3~非推奨になっていますので、ここでも無効に設置しています。
WordPressでは、日付/時刻関数で使用されるタイムゾーンがUTC(世界時間)になっています。
date()関数を使うと、日本では9時間前になります。
その代わりに、WordPessには、ローカル時間を扱うdate_i18n()やcurrent_time()関数を用意しています。
ローカル時間を表示する場合 例
echo date_i18n("Y-m-d H:i:s");
ローカル時間のタイムスタンプを取得する場合 例
ecurrent_time("timestamp");
date_i18n("U");
wp-includes/load.php の中で定義されています。
php.iniのregister_globals の設定が有効になっていた時のための関数です。
register_globals
PHP 5.3~非推奨となり、 PHP 5.4~で削除されているので、無効になっていることが多いと思うので、returnします。
ざっくり言うと、もし有効になっていたら、POSTやGETで送られてきた$GLOBALS 変数の値を勝手に変数化してしまうのがちょっと危険なので、unset()関数を使ってクリアにしている感じです。
$_SERVER(サーバに関する環境変数が入っているPHPグローバル変数)の値を見て、WindowsサーバのIISや、PHPがCGI版を使っている時の $_SERVER の値誤差をいろいろ調整しています。
php_sapi_name()
PHP が使用しているインターフェイスの型を返すPHP関数。
PHPのCGI版とモジュール版
レンタルサーバのプランなどで、CGI版とモジュール版という2種類を見かけると思います。これは、PHPのインターフェイス(動く仕組み)の違いです。
モジュール版のが速いのですが、レンタルサーバーの多くはCGI版を使っています。
CGI版でも速く動くようにFastCGIというものもあります。
- さくらサーバは、最上位のビジネスプロプランに限り、モジュール版への切り替えが可能になっています。
- エックスサーバーや、このサイトで使っているロリポップでは、CGI版の(FastCGI)というものを使っています。
ソースに戻ります。
if ( empty( $_SERVER['REQUEST_URI'] ) || ( php_sapi_name() != 'cgi-fcgi' && preg_match( '/^Microsoft-IIS\//', $_SERVER['SERVER_SOFTWARE'] ) ) ) { ・・・・
レンタルサーバの場合はIISサーバはほとんどなく、Apache が多いので、$_SERVER[‘SERVER_SOFTWARE’]はApacheとなります。
php_sapi_name()は、CGI版の場合は cgi ですが、FastCGI を使っている場合は、cgi-fcgi となります。
なので、この1つ目のif文はIISサーバで、かつFastCGIを使ってない場合ってことになり、その場合に、$_SERVER[‘REQUEST_URI’]、$_SERVER[‘PATH_INFO’]を変更しています。
以降のif文では、CGI版でPHPが動作している場合、さらに海外サーバのDreamhost での場合などに、$_SERVER[‘SCRIPT_FILENAME’]、$_SERVER[‘PATH_INFO’] 、$_SERVER[‘PHP_SELF’]を調整しています。
$_SERVER[‘REQUEST_URI’]
ページにアクセスするために指定されたURI。
$_SERVER[‘PATH_INFO’]
実際のスクリプトファイル名とクエリ文字列の間にある、クライアントが提供するパス名情報。
$_SERVER[‘SCRIPT_FILENAME’]
現在実行されているスクリプトの絶対パス。
$_SERVER[‘PHP_SELF’]
現在実行しているスクリプトのファイル名。
wp-includes/load.php の中で定義されています。
ファビコンへのアクセスがあったら、ファビコンのヘッダーを出力して、これ以降のPHPへの処理は終了させています。(ちょっと何故かは分かりません。)
wp-includes/load.php の中で定義されています。
管理パネルからアップグレードやプラグインの修正を行っているときにメンテナンスモードに切り替わります。
その間は自動で .maintenance が作られ、ファイルがあったらメンテナンス中のメッセージを出しています。
is_rtl()
wp-includes/locale.php で定義されています。
現在のロケールが右書きか調べる関数。
ということですが、ここまでにwp-includes/locale.php はまだ読み込まれてないような気がするので、メンテナンス時に別のルートから実行されるのでしょうか。(ちょっと分からないので保留します。)
wp-includes/load.php の中で定義されています。
ページリクエスト時からの経過時間を取得しています。
timer_stop()関数もあり、timer_start()からの経過時間を取得出来る。
wp-includes/load.php の中で定義されています。
デバッグモードが有効の場合、php.ini のdisplay_errors、log_errorsを有効にして、エラーを表示するように設定しています。
次は、
if ( WP_CACHE ) WP_DEBUG ? include( WP_CONTENT_DIR . '/advanced-cache.php' ) : @include( WP_CONTENT_DIR . '/advanced-cache.php' );
WordPressのプラグイン「WP Super Cache」を使っている時のファイル読み込みです。
「WP Super Cache」をインストールすると、advanced-cache.phpとadvanced-cache.php というファイルが作られます。
ブログの表示速度をあげるプラグイン「WP Super Cache」
「WP Super Cache」とは、WordPressのデータベースを静的なページにしてブログの表示速度をあげるプラグインです。
(個人的には、次記事の「WordPress が重い人におすすめ Tribe Object Cache プラグインを入れる」のがおすすめ。)
私は入れたことがないので、インストールは以下のサイトなどを参考にしてみてください。
<参考サイト>
WP Super Cacheを使用してみる
最後に
と言うわけで、index.php から順に読んできましたが、(だんだん駆け足になりました)まだ5ファイル目( wp-settings.php )の途中ですが、長くなってきたのでこのへんで次回にまわそうと思います。
ここの説明には、独自の解釈なども入っているので、間違えなどあるかもしれません。
変なところなど何かありましたら、ご指摘いただけると嬉しいです。
関連記事
-
WordPress タイトルの変更
テンプレートタグ the_title(); get_the_title(); WordPress
-
WordPress レスポンシブ テンプレート の メニューやブログの設置
前回の 「WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダ
-
wordpress カスタム投稿を一覧(ループ)で表示する
カスタム投稿を一覧で表示する方法がいろいろあります。 query_posts 関数が非推奨になって
-
WordPress カレンダー カスタマイズ(add_filter版)
前回、「WordPress の PHP をちょっと見てみよう Ⅲ」でフックをやったので、カレンダーで
-
「All-in-One WP Migration」プラグインで 簡単に WordPress のサーバー移行する手順メモ
1.移行元サイトでのデータエクスポート 「All-in-One WP Migration(公式リン
-
WordPress twentyseventeen の function.php を見る – その1
WordPress の最低限の機能だけのシンプルなテンプレートが欲しかったので、作っておくことにしま
-
WordPressでカテゴリー名も検索にひっかけるプラグイン「Search Everything」
WordPressでカテゴリーも検索にひっかけるプラグイン「Search Everything 8.
-
WordPress フォルダー・ファイル系の関数 is_dir や opendir や exif_imagetype で Warning エラー
Wordpress の管理画面でフォルダーの中身を読み込む関数 opendir でエラー Word
-
WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダウンロード
WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダウンロード
-
ロリポップでWordPressのPHPバージョン7.1に変更後「サイトに技術的な問題が発生しています。」
WordPress.org の推奨環境 PHP7以上 MySQL5.6以上またはMaria