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 には、たくさんのファイルが入っています。 ここではテーマ内ではなく、トップ

記事を読む

リビジョンを削除し、テーブルを最適化してDBの容量を削減

WordPress リビジョンを削除し、テーブルを最適化してDBの容量を削減

WordPress リビジョン機能 リビジョンは過去の記事を保存してくれる WordPress の

記事を読む

Wordpress 自作フォーム (チェックボックスなど)

WordPress 自作フォーム その3(チェックボックスなど)

以前、WordPress 自作フォーム その1の記事で Wordpress で自作フォームを作ってみ

記事を読む

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

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

記事を読む

WordPress Warning エラー

WordPress フォルダー・ファイル系の関数 is_dir や opendir や exif_imagetype で Warning エラー

Wordpress の管理画面でフォルダーの中身を読み込む関数 opendir でエラー Word

記事を読む

wordpress カスタム投稿で 2ページ目以降が404

wordpress カスタム投稿で 2ページ目以降が404になってしまう

wordpress のカスタム投稿で、ニュースのページを作っていました。 ニュース一覧で、ペー

記事を読む

WordPress プラグイン「 Search Everything 」

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

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

記事を読む

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

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

記事を読む

WordPress Twenty Seventeen function.php

WordPress twentyseventeen の function.php を見る – その1

WordPress の最低限の機能だけのシンプルなテンプレートが欲しかったので、作っておくことにしま

記事を読む

All-in-One WP Migration で サーバ移動

「All-in-One WP Migration」プラグインで 簡単に WordPress のサーバー移行する手順メモ

1.移行元サイトでのデータエクスポート 「All-in-One WP Migration(公式リン

記事を読む

PHP WordPress

Message

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

WordPress エラー:Failed to load plugin: table from url https://cdn.tinymce.com/4/plugins/table/plugin.min.js
WordPress エラー:Failed to load plugin: table from url https://cdn.tinymce.com/4/plugins/table/plugin.min.js

WordPress エラーの状態 WordPress 管理画面のテキ

wordpress タイトルの変更
WordPress タイトルの変更

テンプレートタグ the_title(); get_the_title

All-in-One WP Migration で サーバ移動
「All-in-One WP Migration」プラグインで 簡単に WordPress のサーバー移行する手順メモ

1.移行元サイトでのデータエクスポート 「All-in-One WP

DNSサーバーとは
ドメインとは?DNSサーバーとは?

ドメインとは? ドメインとは? ドメインとは、インターネット上のネ

javascriptで複数同じ名前のformの値を取得する
javascriptで複数同じ名前のformの値を取得するとエラー Cannot read property ‘value’ of undefined

Javascript で value の値を取得する このようなHT

→もっと見る

    • 202404
      Mon Tue Wed Thu Fri Sat Sun
      1234567
      891011121314
      15161718192021
      22232425262728
      2930
    にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ PHPへ にほんブログ村 IT技術ブログ WordPressへ
    にほんブログ村 FC2 Blog Ranking
    PAGE TOP ↑