プラグインがスクリプトを使用している場合(有名な例:jQuery UI Datepicker)、スクリプトがどのように出力をレンダリングするのかに満足できない場合は、2つの可能性があります。
そのため、まずハンドルを確認し、次に優先順位とフック(wp_enqueue_scripts
、login_enqueue_scripts
など)を見つける必要があります。あなたはドリルを知っています。
通常 - プラグインががらくたではない場合 - それはを使用してJSにPHPからパラメータをプッシュスルーします
wp_localize_script( $handle, $object_name, array(
// data
) );
これがデータをJSスクリプトに追加する賢い方法です。 しかし ...デフォルトではフィルタ処理できません。 WP_Scripts
もWP_Dependencies
も any のいずれのフィルタユーザーも後で利用することはできません
質問:
wp_localize_script
を使用してPHPからJavascriptに移動された引数/パラメータをフィルタ処理するにはどうすればよいですか。
wp_localize_script()
は、グローバル変数$wp_scripts
上でメソッドlocalize()
を呼び出します。この変数を child クラスのWP_Scripts
のインスタンスに設定できます。
class Filterable_Scripts extends WP_Scripts
{
function localize( $handle, $object_name, $l10n )
{
$l10n = apply_filters( 'script_l10n', $l10n, $handle, $object_name );
return parent::localize($handle, $object_name, $l10n);
}
}
add_action( 'wp_loaded', function() {
$GLOBALS['wp_scripts'] = new Filterable_Scripts;
});
テーマカスタマイザはそれを使用しません、それはWP_Scripts
の別のインスタンスを作成します(wp-admin/customize.php
を見てください)。それを置き換えることも可能かもしれません:
add_action( 'customize_controls_init', function() {
$GLOBALS['wp_scripts'] = new Filterable_Scripts;
$GLOBALS['wp_scripts']->registered = $GLOBALS['registered'];
});
これのどれもテストされていません、単なるアイデアです。
@toscho素晴らしい実装。テスト済みで本当です。これは やや 変更されたバージョンです。これは$ handleと$ object_nameも渡すので、必要なときにのみフィルタ処理できます。
class Filterable_Scripts extends WP_Scripts
{
function localize( $handle, $object_name, $l10n )
{
$l10n = apply_filters( 'script_l10n', $l10n, $handle, $object_name );
return parent::localize($handle, $object_name, $l10n);
}
}
add_action( 'init', function() {
$GLOBALS['wp_scripts'] = new Filterable_Scripts;
});
add_filter('script_l10n', 'se108362_example_filter', 10 , 3);
// Example
function se108362_example_filter($l10n, $handle, $object_name ) {
if('js-handle' == $handle && 'jsVariable' == $object_name) {
return 'Something Else';
}
return $l10n;
}
受け入れられた答え は素晴らしいです!しかし、JavaScriptエラーのためにAdvanced Custom Fieldsがバックエンドで機能しなくなるという問題に遭遇しました。数時間掘り下げた後、私はFilterable_ScriptsオブジェクトにACFプラグインによって登録されたjavascriptファイルが欠けているという結論に達しました。それがなぜこれをしたのか正確にはわかりませんが、同じ問題に遭遇した場合、これに対する適切な解決策を見つけました。
$GLOBALS['wp_scripts']
は幸いなことにまだ適切なスクリプトを含んでいました。だから私はadd_action
で以下をしました:
add_action( 'wp_loaded', function() {
$fscripts = new Filterable_Scripts();
$missing_scripts = array_diff_key( $GLOBALS['wp_scripts']->registered, $fscripts->registered);
foreach($missing_scripts as $mscript){
$fscripts->registered[$mscript->handle] = $mscript;
}
$GLOBALS['wp_scripts'] = $fscripts;
});
オブジェクトにはすべての登録済みスクリプトの配列が含まれ、ハンドルも配列キーなので、array_diff_keyを使用して、どのスクリプトが拡張オブジェクトから欠落しているのかを判別して、それらを再度追加することができます。私はこれをしただけでなく
$fscripts->registered = $GLOBALS['wp_scripts']->registered;
拡張オブジェクトによる変更を上書きしたくないためです。