web-dev-qa-db-ja.com

ローカライズ済みのスクリプトを傍受する方法

プラグインがスクリプトを使用している場合(有名な例:jQuery UI Datepicker)、スクリプトがどのように出力をレンダリングするのかに満足できない場合は、2つの可能性があります。

1.スクリプトの登録を解除します>自分のバージョンを追加します

そのため、まずハンドルを確認し、次に優先順位とフック(wp_enqueue_scriptslogin_enqueue_scriptsなど)を見つける必要があります。あなたはドリルを知っています。

2. jQueryプラグインのパラメータを変更します

通常 - プラグインががらくたではない場合 - それはを使用してJSにPHPからパラメータをプッシュスルーします

wp_localize_script( $handle, $object_name, array( 
    // data
) );

これがデータをJSスクリプトに追加する賢い方法です。 しかし ...デフォルトではフィルタ処理できません。 WP_ScriptsWP_Dependencies any のいずれのフィルタユーザーも後で利用することはできません

質問: wp_localize_scriptを使用してPHPからJavascriptに移動された引数/パラメータをフィルタ処理するにはどうすればよいですか。

8
kaiser

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'];
});

これのどれもテストされていません、単なるアイデアです。

8
fuxia

@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;
}
2
Eric Holmes

受け入れられた答え は素晴らしいです!しかし、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;

拡張オブジェクトによる変更を上書きしたくないためです。

1
Ogier Schelvis