问题描述

我们可以以某种方式使用 wp_localize_script() 创建全局 js 变量,而不需要特定的脚本句柄即可从所有 js 文件访问,即使 js 脚本没有正确使用 wp_enqueue_script 入队?

这是我正在使用的代码,它为’ajaxscript’ 句柄创建 varibale,所以我无法访问由<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' )
    )
);

最佳解决方案

在这种情况下,不用使用 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
}

次佳解决方案

您可以在 wp_head 钩子中导出所需的任何数据,如上面的答案所示。但是,您应该使用 json_encode 来准备用于导出到 JS 的 PHP 数据,而不是尝试将原始值嵌入到 JS 文字中:

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 攻击。

第三种解决方案

我最终这样做它现在工作了!谢谢 @ 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' );

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。