WordPress には、must use plugins という通常のプラグインより先に実行したい処理を必須プラグインとして実行する仕組みがあります
今回、翻訳ファイルの読み込みを制御するプログラムを作成してみたので、使い方を紹介します
WordPress 初期化時の処理
そもそもの疑問
- テーマの function.php っていつ実行されるの?
- プラグインのロードっていつ実行されているの?
- プラグインの実行順(優先度)って設定できるの?
初期化時のアクションフックっていろいろあるけれどプラグインやテーマがロードされる前に実行したい時は当然プラグインやテーマからそのアクションフックは使えないよね。
どーするの ???
ということでいろいろ調べると必須プラグインを作れば良いことが分かりました (^^)
必須プラグイン(must use plugins)とは
必須プラグインとは、WPMU_PLUGIN_DIR で定義されているディレクトリ(デフォルト wp-content/mu-plugins)に、WordPress で実行できるPHPプログラムファイルを設置すれば良いだけです
これだけで、自動的に include_once を用いてPHPファイルを読み込んでくれるので、通常のプラグインやテーマファイルより先にプログラムを実行させることが出来ます
なんだか、通常のプラグインを作成するよりお手軽ですね (^^)
但し、必須プラグインは、通常のプラグインの管理機能の恩恵は受けられませんので、どうやって設置、削除するかを考慮する必要があります (^^)
FTPを使って手作業で行っても良いですし、設定画面等からPHPプログラムファイルをコピーしたり、削除したりする機能を設けてもOKです
参照:Must Use Plugins « WordPress Codex
翻訳ファイルの読み込みを制御してみる
翻訳ファイルは、WordPress日本語版や各種プラグインにMOファイルとして付随しています
従って、翻訳ファイルの読み込みを止めるプログラムは、他のプラグインより先に実行する必要があります。
既存のMOキャッシュプラグインを調べて、その簡易版を作ってみようと思ったのですが、試してみたところ、キャッシュ効果は少しだけで期待したほど速くありませんでした
原因は、WordPress 日本語版の翻訳ファイル(MOファイル)が大きすぎるのでキャッシュ化してもある程度は時間がかかっているのではないかと思われます。
そこで、今回はシンプルにキャッシュ化などという小難しいことは考えずに、MOファイルの読み込みそのものを止めてしまうだけのプログラムとしました
但し、管理画面ではやはり日本語化されていないと英語が苦手な私としてはちょっとつらいです (^_^;)
そこで、検証に使用した celtispack プラグインの設定オプションに通常のサイト閲覧時と管理ページの表示で読み込むかどうかの設定を設けてみました
サンプルコード
翻訳を制御するためのコードは、これだけです
<?php /** * 翻訳(MO)ファイルの読み込みを無効化して高速化を試みる * ※このファイルを wp-content/mu-plugins フォルダに設置すれば有効となる * * Author: enomoto@celtislab * Author URI: https://celtislab.net/ */ $celtisone_mo_stoptranslate = new MO_stoptranslate(); class MO_stoptranslate { public $opt; public function __construct() { $this->opt = get_option('mo_stoptranslate'); add_action( 'switch_theme', array($this, 'unlink_mo_stoptranslate') ); add_filter( 'override_load_textdomain', array(&$this, 'load_textdomain'), 10, 3); } // テキストドメインに MOファイルをロードして翻訳をマージ // マージした MOオブジェクトは $l10n[$domain] にセーブ // $domain プラグインやテーマ名等 // $mofile 翻訳ファイルのパス public function load_textdomain( $dum, $domain, $mofile) { global $l10n; if ( is_admin() ){ if( !empty($this->opt['mo-admin'])) return true; } else { if( !empty($this->opt['mo-website'])) return true; } do_action( 'load_textdomain', $domain, $mofile ); $mofile = apply_filters( 'load_textdomain_mofile', $mofile, $domain ); if ( ! is_readable( $mofile ) ) return false; $mo = new MO(); if ( !$mo->import_from_file( $mofile ) ) { return false; } $mo->_gettext_select_plural_form = null; if ( isset( $l10n[$domain] ) ) $mo->merge_with( $l10n[$domain] ); $l10n[$domain] = &$mo; return true; } //テーマ切替時の後始末 public function unlink_mo_stoptranslate() { if ( file_exists( WPMU_PLUGIN_DIR . '/mo_stoptranslate.php' )) { @unlink( WPMU_PLUGIN_DIR . '/mo_stoptranslate.php' ); } } }
override_load_textdomain にフィルターフックして、管理モードかどうか判定し、翻訳ファイルを読み込まない設定ならば読み込み処理を止めているだけです
また、テーマが切り替えられた場合は、自動的にこのプログラムファイルを削除するようにアクションフックをセットしています
プラグインの設置
このプログラムを必須プラグインとして配置している処理はテーマの function.php に以下のように記述しています
テーマ設定で翻訳ファイルを読み込まないようなっていると自動的に WPMU_PLUGIN_DIR へ必要なファイルを配置します
/** * 翻訳(MO)ファイルの読み込みを無効化指定時に必須プラグインフォルダにクラスファイルをコピー * 必須プラグインファイルに配置されたPHP実行ファイルは自動的に呼び出される *------------------------------------------------------------------------------*/ if ( defined('WPMU_PLUGIN_DIR') ){ if (!function_exists('celtisone_mustuse')) { function celtisone_mustuse() { $opt = get_option('mo_stoptranslate'); if ( !empty($opt['mo-admin']) || !empty($opt['mo-website']) ){ if(wp_mkdir_p( WPMU_PLUGIN_DIR )){ if ( ! file_exists( WPMU_PLUGIN_DIR . '/mo_stoptranslate.php' )) { @copy(WP_CONTENT_DIR . '/themes/celtisone/includes/mo_stoptranslate.php', WPMU_PLUGIN_DIR . '/mo_stoptranslate.php'); } } } } } celtisone_mustuse(); }
翻訳ファイルを読み込まないとどの程度高速化されるか
プロファイルデータでMOファイルの読み込み処理を比べてみました
MOファイル読み込む場合
MOファイル読み込まない場合
MOファイルの読み込み処理にかなり時間がかかっていることが分かります
プロファイラーを動作させながらだと 700ms もの違いがありますが、通常の動作で比較すると 100-200ms 程度の差となっています
たかが 100-200ms 。されど 100-200ms の高速化です (^^)
※翻訳ファイルを読み込まないと、ウィジェット等で一部英語表示となるものもありますので、使用する時には、どのように表示されるかよく確認することをお勧めします
以上、
必須プラグイン(must use plugins)と翻訳ファイルの読み込み処理について紹介しました