对不存在的脚本使用wp_LOCALIZE_SCRIPT

时间:2012-08-02 作者:kaiser

任务:我要做的是通过WP Http API 从远程服务器。我得到的数据是JSON 已编码。在我的一个方法中,我将它们转换回来,然后将其推送到类变量中,以便稍后在一些脚本中使用它。

示例:我是如何做到这一点的

// Simplified... please note, that all names/vars/etc. in my class got unique names.
// ...the same goes for the script handler.
class http_api_example
{
    public $remote_data;
    public $response;

    public function __construct()
    {
        $this->request();
    }

    public function request()
    {
        $request = wp_remote_request( \'http://example.com/HereYouGetSomeJSON\' );
        $this->response = json_decode( wp_remote_retrieve_body( $request ) );
    }

    public function deliver_to_javascript()
    {
        wp_enqueue_script( \'json_handler\', null, array(), null, true );

        // ...then I\'m trying to localize it
        wp_localize_script( \'json_handler, \'json_object\', array(
             \'ajaxurl\'    => admin_url( \'admin-ajax.php\' )
            ,\'ajax_nonce\' => wp_create_nonce( \'json_handler_nonce\' )
            ,\'action\'     => \'json-handler-action\'
            ,\'data\'       => $this->response
         )

    }
}
问题:由于某种原因,我无法访问json_object 从控制台(它适用于其他类中的其他对象)。

到目前为止调试是否已注册并排队我试图查看脚本是否已注册:

// \'registered\': TRUE
var_dump( wp_script_is( \'json_object\' ) );

// \'queue\': TRUE
var_dump( wp_script_is( \'json_object\', \'queue\' ) );
当然,我也研究了global $wp_scripts 并且可以确认,它就在那里。

是否本地化

// Data shows up, JSON encoded
var_dump( $GLOBALS[\'wp_scripts\']->registered[\'json_object\']->extra;
它在核心的什么地方停止我进入core并通过以下方式进行回溯:

  1. wp_localize_script()
  2. »$wp_scripts->localize()
  3. »WP_Dependencies: add_data()
  4. »»»WP_Dependencies: add_data() FIN!
TheFIN! 记录对自身的调用。正如您在GitHub上的WP repo链接中所看到的,在->add_data(), 还有一个电话->add_data() (对自己)。我放弃了结果TRUE 返回

我目前没有“我还能尝试什么?”-选项。也许有人有了一个想法,这应该是如何工作的,或者也许只是我可以尝试进一步研究的地方。

谢谢

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

core是如何做到这一点的

再想一想,我觉得might be a case WP在内部做同样的事情。右图:它做到了。

示例~/wp-admin/load-scripts.php

$wp_scripts = new WP_Scripts();
wp_default_scripts($wp_scripts);

// inside wp_default_scripts( &$scripts )
$scripts->add( $handle, $src, $dependencies, $version, $args ); // from WP_Dependencies
$scripts->localize( $handle, $object_name, $data ); // from WP_Scripts
这意味着is a way, 但只能直接使用内部构件。

因此,添加(&A);本地化不存在的文件,只需添加false 而不是$src:

$wp_scripts->add(
    \'your_handle\',
    false,
    array(),
    null,
    true
);
$wp_scripts->localize(
    \'your_handle\',
    "your_handle_object",
    array(
        \'ajaxurl\'    => admin_url( \'admin-ajax.php\' ),
        \'ajax_nonce\' => wp_create_nonce( "your_handle-nonce" ),
        \'action\'     => "your_handle-action",
        \'data\'       => array(), // Whatever data you need to transport
    )
);

SO网友:kaiser

Disclaimer: 这并不能完全回答我的问题

我刚刚发现,问题是,我用的是“不”这个名字。

解决方案的一半&hellip

如果要添加一些随机字符串,则WP_Scripts/WP_Dependencies/_WP_Dependencies 将为您提供所需的javascript对象。

Drawback: 如果文件不存在,它仍将被注册并以失败结束GET, 这可能导致站点速度减慢(取决于超时)。

Temporary work around: 您可以添加空(!)文件,加载速度非常快,而且。。。什么都不做。

请注意,这并不能完全回答我的问题,因为我很高兴知道应该在哪里寻找答案。WP 3.5开发刚刚开始,现在有足够的时间为此编写补丁/票据。。。至少如果我知道problem 是我只是不明白为什么这只适用于文件,而实际的javascript对象将被推送到全局名称空间中。

结束

相关推荐