有没有办法知道wp_LOCALIZE_SCRIPT传递的所有变量的名称?

时间:2015-06-25 作者:gdaniel

我正在使用wp\\u localize\\u脚本将值传递给jquery脚本。有时,这可能会在同一页面上发生多次,这意味着我需要为每个wp\\U localize\\u脚本设置不同的变量名。这也意味着我的jquery脚本不知道wp\\u localize\\u脚本传递的变量名是什么,因为变量名是动态创建的(递增的)。

因此,现在我的解决方案是将相同的变量名(由wp\\u localize\\u脚本传递)添加到html标记中的数据属性,然后使用公共类选择所有这些属性。

示例:

在我的页面中,我有一个变量名,它将被传递给动态生成(递增)的脚本,这样我就可以多次调用wp\\u localize\\u script,而无需重写这些值。

//PHP
$my_var = array(\'test_var\'=>"yes");
wp_localize_script(\'my_script_handle\',\'my_var_1\',$my_var);

//Later down the page...
$my_var = array(\'test_var\'=>"no");
wp_localize_script(\'my_script_handle\',\'my_var_2\',$my_var);
我还向html数据属性添加了相同的变量名

<div class="get_this" data-var="my_var_1">Some content</div>
<div class="get_this" data-var="my_var_2">Some more content</div>
然后在JS中,我使用这个选择器:

var my_vars = $(".get_this").data("var");

my_vars.each(function()){
    alert(my_vars.test_var);
}
Is there a better approach to this?这是可行的,但使用wp\\u localize\\u脚本将一些变量发送到js脚本,然后必须依赖类或数据元素来获取所有实例,这似乎是多余的。

2 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

使用动态变量名很不方便。更好的解决方案是使用单个数组/对象,该数组/对象使用自动递增的整数引用每个“实例”。

这与您已经拥有的相差不大,但它将所有参数都保存在变量中,访问对象的特定属性比动态创建变量名感觉更好。

问题是wp_localize_script() 当对象名称相同时,删除以前的调用。因此,为了确保可以“整理”参数,可以使用静态类存储参数,并尽可能晚地将脚本排队(对于前端wp_footer 可以)。

下面是一个简单的例子:

class My_js_loader{

    private static $scripts;

    static function enqueue( $handle, $args ){
         if ( ! isset( self::$scripts[$handle] ) ) {
              self::$scripts[$handle] = array();
         }

         self::$scripts[$handle][] = $args;

         add_action( \'wp_footer\', array( __CLASS__, \'enqueue_scripts\' ) );

         return count( self::$scripts );
    }

    static function enqueue_scripts(){
         if ( self::$scripts ) {
              foreach( self::$scripts as $handle => $args ){
                   wp_enqueue_script( $handle );
                   wp_localize_script( $handle, $handle, $args );
              }
         }
    }

}
用法示例:

 $instance1_id = My_js_loader::enqueue( \'mywidget\', array( 
     \'param1\' => \'foo\',
     \'param2\' => \'bar\',
 ) );
 //$instance1_id = 1;
 //generates HTML <div class="mywidget" data-mywidget-instance="1"></div>


 $instance2_id = My_js_loader::enqueue( \'mywidget\', array( 
     \'param1\' => \'hello\',
     \'param2\' => \'world\',
 ) );
 //$instance2_id = 2;
 //generates HTML <div class="mywidget" data-mywidget-instance="2"></div>
然后在javascript文件中

 $(\'.mywidget\').each(function(){
      var inst = $(this).data(\'mywidget-instance\');
      var args = mywidget[inst];
 });
缺点我假设您的JavaScript句柄用作变量名。如果不是这样,您可以始终允许将变量名传递给My_js_loader::enqueue() 我也是dequeue 方法(以防止加载特定或所有当前实例)。然而,在大多数情况下,相应的标记已经打印到页面上,因此您可能不希望它退出队列

    优点

    • 避免了如果您的脚本已经打印到页面上,则进一步调用wp_localize_script() 被忽略
    • 所有参数都包含一个好的、已知的和固定的变量名,JavaScript文件始终加载在页脚中

SO网友:Pablo S G Pacheco

我认为使用过滤器有一种更简单的方法。E、 g级

<?php
$my_var = array(\'test_var\'=>"no");
$my_var = apply_filters(\'my_localize_filter\',$my_var,\'my_var\');
wp_localize_script(\'my_script_handle\',\'my_var\',$my_var);
?>
当您要在代码中的其他位置再次本地化时,只需执行以下操作:

<?php 
add_filter(\'my_localize_filter\',function($object, $object_name){
     if($object_name==\'my_var\'){
          $object[\'test_var\']=\'yes\';
     }
     return $object;
},10,2); 
?>
这样,您就可以覆盖或向数组中添加变量

结束

相关推荐