我们可以以某种方式使用wp_localize_script()创建没有特定脚本句柄的全局js变量,即使没有使用wp_enqueue_script正确地将js脚本排入队列,也可以从所有js文件访问该脚本变量吗?我使用的代码会为“ ajaxscript”句柄创建变量,因此我无法访问<script src="xxx" .... />直接包含在header.php中的js文件中的对象“ ajaxobject” q4312079q

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


评论

只需在主题内添加内联JS。无论如何,这正是wp_localize_script所做的。使用这两种方法,都可以从任何脚本访问变量

如果您控制着这些脚本,那么您将如何处理头部未正确排队的脚本? wp_localize_script的概念是使您可以使用自己的脚本-您正在使用wp_enqueue_script正确加载该脚本。在哪种情况下,您会故意在需要这些变量的头文件中加载脚本,而不是通过wp_enqueue_script加载脚本?

@cale_b:header.php中已经包含一个脚本,并且其中包含许多脚本,当我尝试通过wp_enqueue_script将该js文件放入队列时,这些脚本开始中断工作。我需要从该脚本文件中进行ajax调用。因此,与其破坏功能并一一修复,我需要一个快速的解决方案。甚至我不确定网站的哪一部分会因为'wp_enqueue_script'的微小更改而中断:(

很公平。提示,获取适用于Firefox的Firebug,您可以使用控制台观看/查看javascript错误。故障排除的宝贵工具。

#1 楼

您可以将js变量挂在wp_head上,而不是在那种情况下使用wp_localize_script,这样它将对所有js文件都可用。
:同样按照@Weston Ruter的建议,您应该对变量进行json编码:

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' )


评论


您应该在这里使用json_encode,例如:var ajaxurl = <?php echo json_encode(admin_url(“ admin-ajax.php”)); ?>;

– Weston Ruter
13-10-22在20:33

好吧,我现在将其添加

–库马尔
13-10-23在5:40

#2 楼

您可以在wp_head挂钩中导出所需的任何数据,如上面的答案所示。但是,您应该使用json_encode来准备要导出到JS的PHP数据,而不是尝试将原始值嵌入JS文字中: ,并且如果您的字符串包含任何引号,它可以防止意外的语法错误。更重要的是,使用json_encode可以阻止XSS攻击。

#3 楼

我最终做到了。现在可以使用了!谢谢@ 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' );


评论


您应该使用json_encode而不是手动创建JSON。

– Weston Ruter
13-10-22在20:32

我现在正在使用json_encode :)谢谢@WestonRuter!

– Subharanjan
18年4月5日在13:32

#4 楼

虽然这不是我最好的工作,但这是完成将数据放入响应中的另一种直接方法:

<?php

/**
 * Add data to global context.
 *
 * @param string $name
 * @param mixed $value
 * @return mixed|array
 */
function global_js($name = null, $value = null)
{

    static $attached = false;
    static $variables = [];

    if (! $attached) {

        $provide = function () use (&$variables) {

            if (! empty($variables)) {

                echo("<script type=\"text/javascript\">\n\n");

                foreach ($variables as $name => $value) {

                    echo("    window['$name'] = JSON.parse('".json_encode($value)."');\n");
                    unset($variables[$name]);

                }

                echo("\n</script>\n");

            }

        };

        add_action('wp_print_scripts', $provide, 0);
        add_action('wp_print_footer_scripts', $provide, 0);

        $attached = true;

    }

    if (is_null($name) && is_null($value)) {
        return $variables;
    }

    return $variables[$name] = $value;

}


向窗口上下文添加一些JS数据:

<?php

global_js('fruits', ['apple', 'peach']);

// produces: `window['fruits'] = JSON.parse('["apple", "peach"]');`


这将适用于页眉脚本或页脚脚本,并且不会重复。