web-dev-qa-db-ja.com

特定のスクリプトハンドルなしでwp_localize_scriptを使用してグローバルJS変数を作成することは可能ですか?

Wp_enqueue_scriptを使用してjsスクリプトが正しくエンキューされていなくても、すべてのjsファイルからアクセスできる特定のスクリプトハンドルを使用せずに、wp_localize_script()を使用してグローバルjs変数を作成することはできますか。

これは私が使っているコードで、 'ajaxscript'ハンドル用の変数を作成するので、<script src="xxx" .... />によって直接header.phpに含まれているjsファイル内のオブジェクト 'ajaxobject'にアクセスできません。

wp_register_script( 'ajaxscript', get_bloginfo( 'template_url' ) . '/js/ajaxscript.js', array(), $version );
wp_enqueue_script( 'ajaxscript' );
wp_localize_script( 'ajaxscript', 'ajaxobject',
    array( 
        'ajaxurl'   => admin_url( 'admin-ajax.php' ),
        'ajaxnonce' => wp_create_nonce( 'itr_ajax_nonce' )
    )
);
27
Subharanjan

その場合、wp_localize_scriptを使用する代わりに、あなたのjs変数をwp_headにフックすることができます。そうすれば、それは全てのjsファイルに利用可能になるでしょう:

function my_js_variables(){ ?>
      <script type="text/javascript">
        var ajaxurl = '<?php echo admin_url( "admin-ajax.php" ); ?>';
        var ajaxnonce = '<?php echo wp_create_nonce( "itr_ajax_nonce" ); ?>';
      </script><?php
}
add_action ( 'wp_head', 'my_js_variables' )

@Weston Ruterが示唆しているように、変数をJSONエンコードすることもできます。

add_action ( 'wp_head', 'my_js_variables' );
function my_js_variables(){ ?>
  <script type="text/javascript">
    var ajaxurl = <?php echo json_encode( admin_url( "admin-ajax.php" ) ); ?>;      
    var ajaxnonce = <?php echo json_encode( wp_create_nonce( "itr_ajax_nonce" ) ); ?>;
    var myarray = <?php echo json_encode( array( 
         'foo' => 'bar',
         'available' => TRUE,
         'ship' => array( 1, 2, 3, ),
       ) ); ?>
  </script><?php
}
22
sven

上の答えが示すように、あなたはwp_headフックで欲しいどんなデータでもエクスポートすることができます。ただし、JSリテラルに生の値を埋め込むのではなく、PHPデータをJSにエクスポートするための準備としてjson_encodeを使用する必要があります。

function my_js_variables(){
    ?>
    <script>
    var ajaxurl = <?php echo json_encode( admin_url( "admin-ajax.php" ) ) ?>;
    var ajaxnonce = <?php echo json_encode( wp_create_nonce( "itr_ajax_nonce" ) ) ?>;
    var myarray = <?php echo json_encode( array( 
        'food' => 'bard',
        'bard' => false,
        'quux' => array( 1, 2, 3, ),
    ) ) ?>;
    </script>
    <?php
}
add_action ( 'wp_head', 'my_js_variables' )

json_encodeを使うことはあなた自身をより簡単にします、そしてそれはあなたの文字列が引用符を含むなら偶然の構文エラーを防ぎます。さらに重要なことに、json_encodeを使用するとXSS攻撃が阻止されます。

12
Weston Ruter

私は結局これをやった。今うまくいく!ありがとう@ dot1

function itr_global_js_vars() {
    $ajax_url = 'var itrajaxobject = {"itrajaxurl":"'. admin_url( 'admin-ajax.php' ) .'", "itrajaxnonce":"'. wp_create_nonce( 'itr_ajax_nonce' ) .'"};';
    echo "<script type='text/javascript'>\n";
    echo "/* <![CDATA[ */\n";
    echo $ajax_url;
    echo "\n/* ]]> */\n";
    echo "</script>\n";
}
add_action( 'wp_head', 'itr_global_js_vars' );
1
Subharanjan