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

公開日: : PHP, WordPress

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

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

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

wp_set_lang_dir();

wp-includes/load.php の中で定義されています。

言語に関する wp-content/languages フォルダーの場所の定数 WP_LANG_DIR、LANGDIR を設定しています。

通常はWordPressは日本語版を使っていると思いますが、WordPreesのオリジナルは英語版です。

英語版WordPressをインストールした後に日本語にしたい場合

手順1 wp-config.php の中を以下に変更(日本語版の場合は既になっているところです。)

define ('WPLANG', 'ja');

手順2 日本語版のWordPressをダウンロードして、/wp-content/languages/フォルダーを取り出して、日本語にしたい/wp-content/フォルダー内に入れる。

手順3 WP Multibyte Patch プラグインをインストール

この手順でもわかるように、/wp-content/languages/フォルダーには、翻訳に関するファイルが入っています。

次の wp-includes/compat.php ファイルに行きます。

if ( !function_exists('_') ) {....

もし、_() という関数がなかったら、になっています。

これは、PHP拡張にある翻訳機能のGetText が無効になっている場合です。
無効でもエラーにならないで、文字列をそのまま返すって感じです。(多分)

GetText とは?

GetText を出力する時に、PHP の方に翻訳したいものを _(‘翻訳した文字’) のように書きます。詳しくはWordPressの日本語版公式サイトにもあります。

WordPressではGetTextを使っていて、先ほど出てきた languagesフォルダーやテーマのlanguagesフォルダーの中で.moや.po の拡張子ファイルを見かけたことがあるかと思います。

GetText 機能を使って出力した、翻訳済みテンプレートみたいなものです。

標準でGetTextは、php.iniでを見るとenabledとなっていて、使用可能になっていると思います。

.mo .po が出てきたので、以下をやっておきたいと思います。

WordPress 海外のテンプレートを日本語にしたい場合

海外のテンプレートをダウンロードすると、細かいところが英語のままだったりします。

Poedit0

例えば、Sparklingをダウンロードしてくると、画像のように、検索結果を表示した時の「Search Results for:」が英語のままです。

手っ取りばやく日本語にする方法

この部分に関して、一番手っ取り早く日本語にするには、日本語版のWordPressで既存で入っているテーマ twentytwelve などはもう既に細かいところまで出来ているので、ファイルをコピーして、ファイル名を以下のように変更します。
wp-content/languages/twentytwelve-ja.mo → テンプレート名-ja.mo
wp-content/languages/twentytwelve-ja.po → テンプレート名-ja.po

sparkling の場合は、
sparkling-ja.mo
sparkling-ja.po
にして、wp-content/languages/の中にアップすれば出来ました。

Poedit5

Poedit を使って、日本語にする方法

ここでは、テンプレートやプラグイン開発を多言語対応にするときに必要になりそうな、.po .mo ファイルの作成出来る Poedit というソフトを使った方法もやっておこうと思います。

Poeditというソフトをダウンロードし、インストールします。

Poeditの使い方
「翻訳プロジェクトを新規作成するを選択」を押します。

Poeditの使い方
「開くボタン」で /sparkling/languages/sparkling.pot が既に入っているので選択して開きます。

翻訳したい文字を検索して選択、下部「翻訳:」のところに翻訳を入力し、「保存」ボタンを押します。

Poeditの使い方

ja_JP.mo と ja_JP.po ファイルが出来ているので、ファイル名を
ja_JP.mo → テンプレート名-ja.mo
ja_JP.po → テンプレート名-ja.po
に変更して、wp-content/languages/themes/の中へアップロードします。

Poedit5
翻訳したところが反映されていました。

wp-includes/compat.php のソースに戻ります、次は、これです。

if ( !function_exists('mb_substr') ): ....(省略)....

if ( !function_exists('hash_hmac') ): ....(省略)....

if ( !function_exists('json_encode') ): ....(省略)....

mb_substr(‘文字列’,’開始位置’,’取り出すバイト数’,’エンコーディング’)

文字数を指定して文字列を取り出すPHP関数。

php.ini の設定などで mb_substr が使えない場合があるらしいです。

その場合に(だけかは分かりませんが)、その次で_mb_substr(‘文字列’,’開始位置’,’取り出すバイト数’,’エンコーディング’) を定義してsubstr()を使って一生懸命返そうとしてます。

使える場合は、_mb_substr の定義はスルーなので、次に行きます。

hash_hmac()

HMAC 方式(メッセージ認証符号)を使用してハッシュ値を生成するPHP関数。

hash_hmac() 関数は PHP 5.1.2 以上の関数なので、ここでもその場合に(だけかは分かりませんが)、その次で _hash_hmac()を定義しています。

json_encode()

値をJSON(JavaScript Object Notation)形式にして返す。

json_encode() PHP 5.2 以上の関数なので、ここでもその場合に(だけかは分かりませんが)、その次で _json_encode()を定義して、wp-includes/class-json.php を読み込んで一生懸命返そうとしてます。

WordPress 最初にアクセスしてるファイルの順番 その2

そんな感じで、通常のブログの表示がされている状態の実行順番でPHPをたどってきました。

今は、wp-includes/compat.php の途中ですが、wp-includes/functions.php は、ほぼ関数定義なので、飛ばします。以下読み込んでいる5ファイルも関数・クラス定義なので、飛ばそうと思います。
—————————————————————————-
index.php → 1番目に読み込まれているファイル
wp-blog-header.php →2番目
wp-load.php →3番目
wp-config.php →4番目
wp-settings.php →5番目(ここからたくさんファイルが読み込まれている)

—–(wp-settings.php の中から読み込んでいるファイル)———————
wp-includes/load.php (関数設定)
wp-includes/default-constants.php(関数設定)
wp-includes/version.php (変数設定)
wp-includes/compat.php →今見た(PHPバージョンなどの違いでPHP関数がなかった時の為の自作関数で補っている感じのファイルだった)
wp-includes/functions.php → 今ここです!(ほぼ関数定義 wp-includes/option.phpを読み込んでいる)
wp-includes/option.php(関数定義)→ スルー
wp-includes/class-wp.php(クラス定義)→ スルー
wp-includes/class-wp-error.php(クラス定義)→ スルー
wp-includes/plugin.php(ほぼ関数定義)→ スルー
wp-includes/pomo/mo.php(MOクラス定義)→ スルー
・・・・
—————————————————————————-
wp-includes/pomo/mo.php ですが、pomo フォルダー内のファイルを読み込んでます。pomo フォルダー内は先ほど出てきた.mo .po ファイルを読み込むためのクラスを作っている感じだと思うので、ここも飛ばします。

wp-settings.php に戻ります。

require_wp_db();

wp-includes/load.php の中で定義されています。

function require_wp_db() {
	global $wpdb;

	require_once( ABSPATH . WPINC . '/wp-db.php' );
	if ( file_exists( WP_CONTENT_DIR . '/db.php' ) )
		require_once( WP_CONTENT_DIR . '/db.php' );

	if ( isset( $wpdb ) )
		return;

	$wpdb = new wpdb( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST );
}

wp-includes/wp-db.php を読み込んでいます。
名前の通り、wpdbクラスを定義しているファイルです。

wpdb クラス

wpdb クラスは WordPress のDBオブジェクトを保持しているグローバル変数です。
詳しくは、WordPress Codex のリファレンスにあります。

<参考>
関数リファレンス/wpdb Class

コードの次に、wp-content/db.php があったらそれも読み込む、みたいになっています。

wp-content/db.php は既存にはないファイルです。

プラグインやカスタマイズのためにこうなっている(ファイルがあったら読み込んじゃう)ようで、調べてみると、このことが WordPress アップグレード時などに、エラーの原因にもなり得るようです。

WordPress をアップグレードする時に注意すること

WordPressのアップデートでは、プラグイン系のエラーが出ることがあります。
アップデートの前は、この2点はやっておいた方がいいと思います。

  • DBとファイルを全部バックアップを取る
  • プラグインをすべて一回停止する
$GLOBALS[‘table_prefix’] = $table_prefix;

wp-config.php の中にあるテーブルの接頭辞です。

$table_prefix  = 'wp_';

$GLOBALS に入れています。

wp_set_wpdb_vars();

wp-includes/load.php の中で定義されています。

function wp_set_wpdb_vars() {
	global $wpdb, $table_prefix;
	if ( !empty( $wpdb->error ) )
		dead_db();

	$wpdb->field_types = array( 'post_author' => '%d', 'post_parent' => '%d', 'menu_order' => '%d', 'term_id' => '%d', 
・・・・(省略)・・・・・
	$prefix = $wpdb->set_prefix( $table_prefix );

	if ( is_wp_error( $prefix ) ) {
		wp_load_translations_early();
		wp_die( __( '<strong>ERROR</strong>: <code>$table_prefix</code> in <code>wp-config.php</code> can only contain numbers, letters, and underscores.' ) );
	}
}

長くなってきたので、このあたりはコードをざっくり読んでみます。

$wpdb クラスでDB接続された時に $wpdb でエラーが空じゃなかったら、dead_db();で、エラーを出して、終了。

エラーがなければ、$wpdb->field_types に vsprintf() で渡せるように配列を%dで紐づけてるって感じです。

それを、wpdbクラスのset_prefix()関数でセット、のち、wpdbクラスのprepare()関数でMySQL文をvsprintf()で渡す時に使っているっぽいです。

そして、prepare()から返ってきた値がWP_Errorオブジェクトのエラーだったら、(wp_load_translations_early()で翻訳に関するファイルの読み込んどいて、)エラーを表示して、終了。

%d とか %s とか sprintf()とか vsprintf() とか

%d が出てきました。テーマ内でもよく出てくると思いますので、息抜きに以下をやっておこうと思います。

sprintf( フォーマット文字 [, 引数1] [, 引数2]・・・)

指定したフォーマットにしたがって文字列を返すPHP関数。

<使用例>

<?php
$myname = '山田'; $catname = 'たま';
sprintf( '私の名前は%sです。猫の名前は%sです。',$myname,$catname );
printf('私の名前は%sです。猫の名前は%sです。',$myname,$catname );
?>

表示結果:私の名前は山田です。猫の名前はたまです。(sprintf printf は同じ結果。)

<?php
printf("%d年%d月%d日", 2014, 8, 4);
printf("%04d年%02d月%02d日", 2014, 8, 4);
?>

表示結果:2014年8月4日 2014年08月04日

vsprintf( フォーマット文字 , 配列)

指定したフォーマットにしたがって配列を文字列で返すPHP関数。

<使用例>

<?php
$array = array('リンゴ','バナナ','ミカン');
echo vsprintf('冷蔵庫には、%s と %s と %s があります。',$array);
?>

表示結果:冷蔵庫には、リンゴ と バナナ と ミカン があります。

wp_start_object_cache();

wp-includes/load.php の中で定義されています。

function wp_start_object_cache() {
	global $blog_id;

	$first_init = false;
 	if ( ! function_exists( 'wp_cache_init' ) ) { 
		if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {
			require_once ( WP_CONTENT_DIR . '/object-cache.php' );
・・・・

wp-content/object-cache.php も元はないファイルです。
オブジェクトキャッシュ系のプラグインなどを使う時に入れるファイルです。

WordPress が重い人におすすめ Tribe Object Cache プラグイン

手順は以下です。

手順1 APC Object Cache Backend から object-cache.php をダウンロードする。

手順2 Tribe Object Cache プラグインを入れる。

<参考サイト>
最速のWordPressを手に入れるには、オブジェクトキャッシュが超オススメだ!

最後に

また後半へ行くにつれて、ざっくりしてきました。
長くなってきたのでこのへんで、次回にまわそうと思います。

関連記事

WordPress PHP

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

WordPress には、たくさんのファイルが入っています。 ここではテーマ内ではなく、トップ

記事を読む

MVCの典型的な相関図

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

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

記事を読む

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

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

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

記事を読む

Wordpress VR Test

WordPress で VR させて、360°のパノラマ画像を表示する

WordPress.com内ショートコードで VR させる WordPress.com内で、VR(

記事を読む

Wordpress 独自テーブル 商品名と料金

WordPress 独自テーブル

Wordpress で独自テーブルを作ってみようと思います。 独自テーブルのデータ 今回のデ

記事を読む

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

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

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

記事を読む

Wordpress 自作フォーム

WordPress 自作フォーム その1(サンプルと設置)

Wordpress でプラグインを使わずにフォームをやってみます。 簡単に名前、メールアドレス、メ

記事を読む

Wordpress 自作フォーム 2(注意点とエラー:This is somewhat embarrassing, isn’t it? など)

WordPress 自作フォーム その2(注意点とエラー:This is somewhat embarrassing, isn’t it? など)

前回(WordPress 自作フォーム 1)のつづきです。 今回は細かいところや注意点とエラーなど

記事を読む

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

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

記事を読む

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

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

記事を読む

PHP WordPress

Message

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

Wordpress 独自テーブル 商品名と料金
WordPress 独自テーブル

Wordpress で独自テーブルを作ってみようと思います。 独

Wordpress 自作フォーム 2(注意点とエラー:This is somewhat embarrassing, isn’t it? など)
WordPress 自作フォーム その2(注意点とエラー:This is somewhat embarrassing, isn’t it? など)

前回(WordPress 自作フォーム 1)のつづきです。 今回は細

Wordpress 自作フォーム
WordPress 自作フォーム その1(サンプルと設置)

Wordpress でプラグインを使わずにフォームをやってみます。

Javascript 写真ギャラリー サムネイルスライド横 レスポンシブ対応
Javascript 写真ギャラリー サムネイルスライド横 レスポンシブ対応

Javascript でマウスドラッグのテストをしていきます。 分か

Three.jsで360°パノラマ画像を VR させる
Three.jsで360°パノラマ画像を VR させる

Three.jsで360°パノラマ画像を VR させる VRを作るの

→もっと見る

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