接下来,我成功地将一个ajax对象传递到后端(JS中的脚本实际上并不重要,因为我已经很好地完成了):
add_action( \'wp_ajax_my_action\', \'my_action_callback\' );
add_action( \'wp_ajax_nopriv_my_action\', \'my_action_callback\' );
add_action( \'wp_enqueue_scripts\', \'theme_name_scripts\' );
add_shortcode(\'tagtest\', \'timezone\');
function theme_name_scripts() {
wp_enqueue_script( \'script-name\', plugins_url( \'/assets/js/timezone.js\', __FILE__ ), array(\'jquery\'), \'1.0.0\', true );
wp_localize_script( \'script-name\', \'MyAjax\', array(
\'ajaxurl\' => admin_url( \'admin-ajax.php\' ),
\'security\' => wp_create_nonce( \'my-special-string\' ),
));
}
function my_action_callback() {
$whatever = strval( $_POST[\'whatever\'] );
echo $whatever;
return $whatever;
wp_die();
}
但我有一个时区函数,它是add\\u shortcode挂钩的函数。我需要从timezone函数中的\\u action\\u回调中获取变量$whatever。我该怎么做?
function timezone(){
$whatever = //Here I need the result from my_action_callback function
}
以防万一,这里是我的JS脚本和一个确保对象成功通过的图像
jQuery(document).ready(function($) {
var data = {
action: \'my_action\',
security : MyAjax.security,
whatever: \'Hello there\'
};
// since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
$.post(MyAjax.ajaxurl, data, function(response) {
alert(\'Here is: \' + response);
return response;
});
});
以下是XHR响应:
action: my_action
security: f1860eab4b
whatever: Hello there
我在add\\u操作回调中获取此对象时没有出现问题
正如我之前所说,我唯一需要的,而且我还没有让它工作的是在timezone函数中获得$whatever(timezone是add\\u shortcode的函数),我如何实现这一点?提前谢谢。
最合适的回答,由SO网友:Jacob Peattie 整理而成
不能将AJAX放入短代码的回调中。这样做没有任何意义。如果您正在发出AJAX请求,那么您将在前端发出请求,并且短代码已经呈现。
因此,您对AJAX请求的响应所做的任何事情都需要在前端进行。因此,您需要做的是在短代码中输出一些HTML,其中包含一个类或ID,您的JavaScript可以使用该类或ID填充前端的数据。
因此,您的短代码可能如下所示:
function timezone(){
echo \'<div class="timezone"></div>\';
}
然后,AJAX请求应在完成时使用响应填充该div:
$.post(MyAjax.ajaxurl, data, function(response) {
$(\'.timezone\').html( response );
});
在该示例中,我们使用jQuery将该div的HTML设置为响应的值。
如果希望短代码具有默认值,那么一种方法是将负责输出的函数抽象为自己的函数。然后在AJAX回调和shortcode回调中使用相同的函数。
因此,让我们创建一个输出文本的函数:
function wpse_301294_whatever() {
return \'Whatever\';
}
该函数将返回字符串
Whatever
.
然后,我们可以更新shortcode以在div中使用此函数:
function timezone(){
echo \'<div class="timezone">\' . wpse_301294_whatever() . \'</div>\';
}
以及AJAX回调:
function my_action_callback() {
echo wpse_301294_whatever();
wp_die();
}
现在你有了一个函数,
wpse_301294_whatever()
, 负责输出内容,以及一个可以在不同上下文中使用该输出的短代码和AJAX回调。