WordPress の PHP をちょっと見てみよう Ⅱ
前記事の続きで、wp-settings.php の68行目あたりから見ていきます。
<今回のピックアップ項目>
- 英語版WordPressをインストールした後に日本語にしたい場合
- GetText とは?
- WordPress 海外のテンプレートを日本語にしたい場合
- WordPress 最初にアクセスしてるファイルの順番 その2
- wpdb クラス
- WordPress をアップグレードする時に注意すること
- %d とか %s とか sprintf()とか vsprintf() とか
- WordPress が重い人におすすめ Tribe Object Cache プラグイン
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 海外のテンプレートを日本語にしたい場合
海外のテンプレートをダウンロードすると、細かいところが英語のままだったりします。
例えば、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/の中にアップすれば出来ました。
Poedit を使って、日本語にする方法
ここでは、テンプレートやプラグイン開発を多言語対応にするときに必要になりそうな、.po .mo ファイルの作成出来る Poedit というソフトを使った方法もやっておこうと思います。
Poeditというソフトをダウンロードし、インストールします。
「開くボタン」で /sparkling/languages/sparkling.pot が既に入っているので選択して開きます。
翻訳したい文字を検索して選択、下部「翻訳:」のところに翻訳を入力し、「保存」ボタンを押します。
ja_JP.mo と ja_JP.po ファイルが出来ているので、ファイル名を
ja_JP.mo → テンプレート名-ja.mo
ja_JP.po → テンプレート名-ja.po
に変更して、wp-content/languages/themes/の中へアップロードします。
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 に戻ります。
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とファイルを全部バックアップを取る
- プラグインをすべて一回停止する
wp-config.php の中にあるテーブルの接頭辞です。
$table_prefix = 'wp_';
$GLOBALS に入れています。
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-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 レスポンシブ テンプレート の メニューやブログの設置
前回の 「WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダ
-
WordPress カレンダー カスタマイズ
WordPressでカレンダーの表示部分をいじってみようかと思います。 どうやら、カレンダー関
-
wordpress カスタム投稿で 2ページ目以降が404になってしまう
wordpress のカスタム投稿で、ニュースのページを作っていました。 ニュース一覧で、ペー
-
WordPress twentyseventeen の function.php を見る – その1
WordPress の最低限の機能だけのシンプルなテンプレートが欲しかったので、作っておくことにしま
-
WordPress の PHP をちょっと見てみよう Ⅰ
WordPress には、たくさんのファイルが入っています。 ここではテーマ内ではなく、トップ
-
WordPress 自作フォーム その1(サンプルと設置)
Wordpress でプラグインを使わずにフォームをやってみます。 簡単に名前、メールアドレス、メ
-
WordPress フォルダー・ファイル系の関数 is_dir や opendir や exif_imagetype で Warning エラー
Wordpress の管理画面でフォルダーの中身を読み込む関数 opendir でエラー Word
-
「All-in-One WP Migration」プラグインで 簡単に WordPress のサーバー移行する手順メモ
1.移行元サイトでのデータエクスポート 「All-in-One WP Migration(公式リン
-
WordPressでカテゴリー名も検索にひっかけるプラグイン「Search Everything」
WordPressでカテゴリーも検索にひっかけるプラグイン「Search Everything 8.
-
WordPress 自作フォーム その3(チェックボックスなど)
以前、WordPress 自作フォーム その1の記事で Wordpress で自作フォームを作ってみ