テンプレートに http://mobiledetect.net/ クラスを追加します。テンプレートのあらゆる部分でこのクラスを動的に使用するための最善の方法はどれですか。
今のところ、私はちょうどこのようにfunctions.phpにクラスをロードしました
function devicecontrol() {
require_once '_/inc/md/Mobile_Detect.php';
}
add_action('wp_loaded', 'devicecontrol', '1');
しかしそれを使うためには、私は最初にすべてのpage-templateにインスタンスを作成しなければなりません
$detect = new Mobile_Detect;
グローバル変数は良い解決策ではないことを私は知っています、それではそのようなクラスを含めるための最善の方法はどれでしょうか。
グローバル変数は良い解決策ではありません
はい、私はこの文を何度も聞いたことがありますが、あなたが経験したように、いくつかの変数にはどこでもアクセスする必要があることがあります。
最近のPHPフレームワークの中には、 IOC のような高度なパターンを実装しているものもありますが、ワードプレスには欠けています。これが、WPで多くのグローバル変数が使用されている理由です。
一般的に言って、PHPでは、解決策は以下のとおりです。
global
によって、グローバル変数の臭いが少し少なくなります。あなたが思いやりのある使い方をすれば、グローバルはそんなに吸いません。例えば。関数内でそれらを使用することはそれほど悪い解決策ではありません。厳密にあなたのケースに関連して、あなたがそれらを嫌うならば、静的メソッドはグローバルの代わりとして十分でしょう。
class MyDetect {
static $detect = NULL;
static $deviceType = NULL;
static function detect() {
if ( is_null(self::$detect) ) {
require_once '_/inc/md/Mobile_Detect.php';
self::$detect = new Mobile_Detect;
self::$deviceType = ($detect->isMobile() ? ($detect->isTablet() ? 'tablet' : 'phone') : 'computer');
}
}
}
プラグインにクラスを含むファイルを要求し、
add_action('wp_loaded', array('MyDetect', 'detect') );
$detect
変数(モバイル検出インスタンス)が必要な場合はMyDetect::$detect
を使用し、$deviceType
変数が必要な場合はMyDetect::$devicType
を使用します。
function add_mobile_scripts() {
wp_enqueue_script('my_script_for_mobiles', 'the_script_url_here' );
}
function add_phone_scripts() {
wp_enqueue_script('my_script_for_phones', 'the_script_url_here' );
}
function add_tablet_scripts() {
wp_enqueue_script('my_script_for_tablets', 'the_script_url_here' );
}
function add_desktop_scripts() {
wp_enqueue_script('my_script_for_desktops', 'the_script_url_here' );
}
function addDevicesScripts() {
if ( MyDetect::$deviceType == 'phone' || MyDetect::$detect == 'tablet' ) {
add_mobile_scripts();
if ( MyDetect::$deviceType=='phone' ) {
add_phone_scripts();
} else {
add_tablet_scripts();
}
} else {
add_desktop_scripts();
}
}
add_action( 'wp_enqueue_scripts', 'addDevicesScripts' );