从函数获取返回的变量到ADD_SHORTCODE函数

时间:2018-04-19 作者:dfrojas

接下来,我成功地将一个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操作回调中获取此对象时没有出现问题

enter image description here

正如我之前所说,我唯一需要的,而且我还没有让它工作的是在timezone函数中获得$whatever(timezone是add\\u shortcode的函数),我如何实现这一点?提前谢谢。

1 个回复
最合适的回答,由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回调。

结束

相关推荐

自定义帖子类型-使用AJAX显示子页面

我有一个名为Product Pages的自定义帖子类型,每个产品页面有3个自定义字段,Overview、Details、Pricing,它们是指向页面子级的链接。我想在父页面的div中显示每个子级的内容(单击自定义字段时)。实例产品1当我单击Overview(例如)时,我希望名为Overview(自定义字段Overview中的链接)的子页面的内容显示在名为“subpage container”的div中。我想我需要ajax和jquery,但我想不出一个好方法。有什么帮助吗?迄今为止我的代码(我使用高级自定