【问题标题】:Issues using WordPress transient caching and AJAX json script使用 WordPress 瞬态缓存和 AJAX json 脚本的问题
【发布时间】:2012-11-12 05:15:40
【问题描述】:

我有一个我正在开发的 WordPress 插件,它会调查所有主要的社交网站并返回特定用户的社交数量(关注者)。

这在服务器上可能会非常缓慢和密集,因此我使用 WordPress 瞬态缓存构建了插件来存储从社交网络站点返回的详细信息,并且还使用 jQuery AJAX json 来显示数据。

这些是主要功能:

检索 Facebook 计数

/**
 * Fetch Facebook count.
 *
 * @param string $url The url to fetch.
 * @return int of Facebook counts.
 */
function ass_get_fb_likes($facebook_id) {

    try {
        $json = wp_remote_get("http://graph.facebook.com/".$facebook_id);

        if(is_wp_error($json))
            return false;

        $fbData = json_decode($json['body'], true);
        return format(intval($fbData['likes']));

    } catch (Exception $e) {
        return false;
    }
}

上面的这个函数也连接到另一个处理瞬态缓存的函数。这方面效果很好。

处理社交网络数据的初始显示

jQuery(function($) {

    $('#fblikes').advanceddashboardwidget({
        'action':'get_facebook_likes',
        'service':'facebook',
        'countof':'likes',
        'callback':'formatCount'
    });
});

帮助函数格式化显示

function formatCount(element,count){
    var display_count='';
    count=parseInt(count,10);
    if(count>1000000)
    {
        count=count/1000000;
        count=count.toFixed(0);
        display_count=count+'m';
    }
    else if(count>1000)
    {
        count=count/1000;
        count=count.toFixed(0);
        display_count=count+'k';
    }
    else
    {
        display_count=count;
    }
    element.html(display_count);
}

下面的函数如果给我的问题。它用于与 WordPress 通信以调用 PHP 函数并检索数据。

(function($) {
    $(document).ready( function() {

        var AdvancedDashboardWidget = function(element, options)
        {
            var ele = $(element);
            var settings = $.extend({
                action: '',
                service: '',
                countof: '',
                query:   '',
                callback:''
            }, options || {});
            this.count=0;
            var url='';
            switch(settings.service)
            {
                case 'facebook':
                    if(settings.countof=='likes' || settings.countof=='talks')
                    {
                        ajaxCall(action,ele,settings);  
                    }
                    break;
            }
        };

    var ajaxCall = function(action,ele,settings){
        opts = {
            url: ajaxurl, // ajaxurl is defined by WordPress and points to /wp-admin/admin-ajax.php
            type: 'POST',
            async: true,
            cache: false,
            dataType: 'json',
            data:{
                action: settings.action // Tell WordPress how to handle this ajax request
            },
            success:function(response) {
                //alert(response);
                ele.html(response);
                return; 
            },
            error: function(xhr,textStatus,e) {  // This can be expanded to provide more information
                alert(e);
                //alert('There was an error deleting the cache');
                return; 
            }
        };
        $.ajax(opts);
    };


        $.fn.advanceddashboardwidget = function(options)
        {
            return this.each(function()
            {
                var element = $(this);

                // Return early if this element already has a plugin instance
                if (element.data('advanceddashboardwidget')) return;

                // pass options to plugin constructor
                var advanceddashboardwidget = new AdvancedDashboardWidget(this, options);

                // Store plugin object in this element's data
                element.data('advanceddashboardwidget', advanceddashboardwidget);
            });
        };

    });
})(jQuery);

问题

问题在于,当从瞬态函数返回数据时,总是会在数字后面附加一个额外的 0(零)。从我一直在阅读的内容来看,这可能是因为我使用的是“json”而不是“jsonp”。

当我将其更改为“jsonp”时,出现错误“错误:未调用 jQuery172011280598581866697_1353705456268”。我猜这与回调函数有关。

到目前为止,我发现这是在网站上显示此信息的最快方式。如果数据存在于瞬态缓存中,则页面加载速度很快,但如果不是,则可能需要几秒钟,这就是我希望 jQuery 进入的地方,并且可能会显示加载图形,直到检索到数据。

任何帮助将不胜感激。

【问题讨论】:

  • 额外的 0 可能是由于未退出返回 JSON 数据的方法造成的。总能抓住我。

标签: javascript json wordpress jsonp transient


【解决方案1】:

在将 AJAX 数据返回给 AJAX 函数之前,您需要 die(),否则它会通过以 die('0') 结尾的 WordPress'。

编辑: WordPress 现在(自 3.5.0 起)为此提供了功能:

wp_send_json_success( $data ):http://codex.wordpress.org/Function_Reference/wp_send_json_success

wp_send_json_error( $data )http://codex.wordpress.org/Function_Reference/wp_send_json_error

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多