WordPress の PHP をちょっと見てみよう Ⅰ

公開日: : PHP, WordPress

WordPress PHP

WordPress には、たくさんのファイルが入っています。

ここではテーマ内ではなく、トップの index.php から、関数や抑えておきたいポイント、気になるところなどをピックアップしたりして、ちょっとだけ見て行こうと思います。

<今回のピックアップ項目>

(テーマのカスタマイズのことが知りたい場合は、とても分かりやすい、良いサイトが結構ありますので、検索してそちらへ。)

ここでは、テーマのことはまあまあ分かった上、なお、他の 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を入れてたとして、
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>

表示はこんな感じで、投稿内容を表示出来ました。
kaisou2

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

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

見た後は、サーバからは削除して、ローカルに持っておくと便利です。

phpinfo

wp-settings.php に戻ります、次は、

wp_check_php_mysql_versions();

wp-includes/load.php の中で定義されています。名前の通りPHPとMySQL のバージョンをチェックしています。
バージョンはさっき抜かした wp-includes/version.php に変数で設定してあり、もし違ったら、dieメッセージを出して終了になります。

@ini_set( ‘magic_quotes_runtime’, 0 );
@ini_set( ‘magic_quotes_sybase’, 0 );

magic_quotes

php.ini の設定です。(いろんな思い出がよみがえる響きです・・)
(’) (”) (\)( )とかの文字がDBに保存される時に、バックスラッシュで自動的にエスケープされるMySQLの(有難迷惑)機能です。
PHP5.3~非推奨になっていますので、ここでも無効に設置しています。

date_default_timezone_set( ‘UTC’ );

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

wp-includes/load.php の中で定義されています。
php.iniのregister_globals の設定が有効になっていた時のための関数です。

register_globals

PHP 5.3~非推奨となり、 PHP 5.4~で削除されているので、無効になっていることが多いと思うので、returnします。
ざっくり言うと、もし有効になっていたら、POSTやGETで送られてきた$GLOBALS 変数の値を勝手に変数化してしまうのがちょっと危険なので、unset()関数を使ってクリアにしている感じです。

wp_fix_server_vars();

$_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_favicon_request();

wp-includes/load.php の中で定義されています。
ファビコンへのアクセスがあったら、ファビコンのヘッダーを出力して、これ以降のPHPへの処理は終了させています。(ちょっと何故かは分かりません。)

wp_maintenance();

wp-includes/load.php の中で定義されています。
管理パネルからアップグレードやプラグインの修正を行っているときにメンテナンスモードに切り替わります。
その間は自動で .maintenance が作られ、ファイルがあったらメンテナンス中のメッセージを出しています。

is_rtl()

wp-includes/locale.php で定義されています。
現在のロケールが右書きか調べる関数。

ということですが、ここまでにwp-includes/locale.php はまだ読み込まれてないような気がするので、メンテナンス時に別のルートから実行されるのでしょうか。(ちょっと分からないので保留します。)

timer_start();

wp-includes/load.php の中で定義されています。
ページリクエスト時からの経過時間を取得しています。
timer_stop()関数もあり、timer_start()からの経過時間を取得出来る。

wp_debug_mode();

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 レスポンシブ テンプレート 元にサイトを作ってみる その2

DEMO を見る カスタム投稿タイプ functions.php 今回は3つのリストメニュ

記事を読む

MVCの典型的な相関図

PHPフレームワークについて

フレームワークとは? 開発する際に頻繁に必要とされる汎用的な機能をまとめて提供している、アプリケー

記事を読む

WordPress の PHP をちょっと見てみよう Ⅱ

WordPress の PHP をちょっと見てみよう Ⅱ

前記事の続きで、wp-settings.php の68行目あたりから見ていきます。 <今回のピ

記事を読む

WordPress カレンダー カスタマイズ

WordPress カレンダー カスタマイズ(add_filter版)

前回、「WordPress の PHP をちょっと見てみよう Ⅲ」でフックをやったので、カレンダーで

記事を読む

WordPress レスポンシブ テンプレート

WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダウンロード

WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダウンロード

記事を読む

WordPress レスポンシブ テンプレート

WordPress レスポンシブ テンプレート の メニューやブログの設置

前回の 「WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダ

記事を読む

WordPress の PHP をちょっと見てみよう Ⅲ

WordPress の PHP をちょっと見てみよう Ⅲ

前記事の続きで、wp-settings.php の91行目あたりから見ていきます。 次は、wp

記事を読む

WordPress レスポンシブ テンプレート 元にサイトを作ってみる その1

「レスポンシブ テンプレート の メニューやブログの設置」の記事では、メニューやブログの設置例をやっ

記事を読む

WordPress プラグイン「 Search Everything 」

WordPressでカテゴリー名も検索にひっかけるプラグイン「Search Everything」

WordPressでカテゴリーも検索にひっかけるプラグイン「Search Everything 8.

記事を読む

レンタルサーバでWordPressを設置してみよう!

WordPress.com 内に、ブラウザだけで無料でサイトを作成出来きるサービスもありますが、Wo

記事を読む

PHP WordPress

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

画像加工 cropbox.js
写真をアップロードして切り抜きが出来るcropboxにタッチイベントを付けてみる

Git Hub の cropbox 写真をアップロードしてカット出来

画像の拡大・縮小 タッチイベント
画像の拡大縮小を javascript の touch イベントでやってみる

画像の幅と高さを取得 まずは、neko.jpg という画像を用意して

CSS セレクタ
【CSS セレクタ】その2:擬似クラスセレクタやラジオボタンチェックでフォームの有効無効や枠の色変えたいとか

<今回のピックアップ項目> :link :visited :ho

CSS セレクタ
【CSS セレクタ】その1:アスタリスクや属性セレクタとか

CSS3も浸透してきて、細かい所が危うくなってきたので、セレクタを中心

three.js 環境マッピング
Blender Three.js ガラス その2(環境マップ)

前回Cyclesレンダーを試してみました。 Cyclesレンダー

→もっと見る

にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ PHPへ にほんブログ村 IT技術ブログ WordPressへ
にほんブログ村 FC2 Blog Ranking
PAGE TOP ↑