我正在使用Wordpress Google Maps插件,该插件通过Ajax从数据库中提取位置并返回一个XML文件,然后由Javascript脚本处理,以便将它们绘制在Google Map上。这一切都很完美,但我希望能够将显示的数据限制为当前登录用户拥有的那些位置。由于WP用户id存储在表中,这应该很容易......
在我的主题functions.php文件中,我有这个功能:
// Same handler function...
add_action( 'wp_ajax_get_current_user_id', 'get_current_user_id_callback' );
function get_current_user_id_callback() {
if (is_user_logged_in()) {
echo get_current_user_id();
wp_die();
}
}
add_action('template_redirect', 'my_enqueue');
function my_enqueue() {
// Enqueue the Javascript file
wp_enqueue_script( 'ajax-script', '/ajax/ajax-user.js', array('jquery') );
// in JavaScript, object properties are accessed as ajax_object.ajax_url, ajax_object.we_value
wp_localize_script( 'ajax-script', 'ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' )) );
}
在处理XML的Javascript文件中,我有以下功能:
function getUserId() {
var data = {'action': 'get_current_user_id'};
jQuery.post(ajax_object.ajax_url, data, function(response) {
userId=response;
alert ('Within JQuery userId=' + userId);
return userId;}
);
}
脚本加载时由此调用:
var userId;
function load () {
userId=getUserId();
alert ('Outside of JQuery UserId=' + userId);
}
问题是getUserId在它有时间从数据库获得响应之前运行并返回undefined。我知道解决这个问题的方法是使用Ajax承诺,但是我找不到任何关于如何在Wordpress中专门执行此操作的实例。
根据这个:
How do I return the response from an asynchronous call?
我只需要重写我的getUserId函数,使其包含.done和.fail但是如果我尝试这个,我会得到语法错误,因为它不是真正的JQuery
如何在JQuery语法中重写getUserId,以便我可以使用.done和.fail并从现有脚本中调用它?可悲的是,我没有JQuery专家,而且我在Javascript上的表现也不是很好!
答案 0 :(得分:0)
目前尚不清楚你曾经尝试过什么。但是如果你只是从AJAX调用中返回jqXHR它应该可以工作:
function getUserId() {
var data = {'action': 'get_current_user_id'};
return jQuery.post(ajax_object.ajax_url, data);
}
然后只需调用done
方法:
getUserId().done(function(data) {
alert( /* userid, depends on data */ );
});
顺便说一句,如果你告诉jquery解析JSON会更容易;这样,data
将是一个对象而不是一串JSON。有两种方法可以做到这一点。您可以向'json'
添加jQuery.post
参数:
jQuery.post(ajax_object.ajax_url, data, null, 'json');
或者您可以编写PHP脚本,以便它发送HTTP Content-Type标头:
header('Content-type: application/json');
你必须在任何身体被发送之前做这一点,甚至是空白。如果您这样做,那么jQuery.ajax
将默认将其作为JSON读取。