对php函数的AJAX调用不能运行PHP代码

时间:2018-10-22 作者:Federico

我有一张这样的表格:

<form method="post" action="" id="BookingForm">
    <label for="email">Email</label>
    <input type="text" name="email" id="emailId" value="" />
    <input type="hidden" name="action" value="1" />
    <input type="submit" name="submitname" value="Send" />
</form>
<div id="container"></div>
我的自定义js文件位于以下路径:assets/js/makebooking。jsMy JS文件makebooking.js :

jQuery(document).ready(function(event) {
 jQuery(\'#BookingForm\').submit(validateForms);
 function validateForms(event) {
 event.preventDefault();

     var x =  MBAjax.ajaxurl;
     alert(x);

    jQuery.ajax({
      action:  \'makeBooking\',
      type:    "POST",
      url:     MBAjax.admin_url,
      success: function(data) {
         alert(data);
         //jQuery("#container" ).append(data);
      },
    fail: function(error){
        alert("error" + error);
    }
    });
     return false;
  }
});
Functions.php 文件:

// embed the javascript file that makes the AJAX request
wp_enqueue_script( \'make-booking-ajax\',\'/wp-content/themes/twentyseventeen/assets/js/makebooking.js\', array( \'jquery\' ) );
// declare the URL to the file that handles the AJAX request (wp-admin/admin-ajax.php)
wp_localize_script( \'make-booking-ajax\', \'MBAjax\', array( \'ajaxurl\' => admin_url( \'admin-ajax.php\' ) ) );

function makeBooking(){
    echo "Home again";
    return "Home";
}


add_action(\'wp_ajax_make_booking\', \'makeBooking\');

The problem is that the ajax call returns all the dom and not what the php function returns. The code in the php function does not work; the echo message is not printed

<下图显示了问题:

enter image description here

谢谢

费德里科

<小时>

enter image description here

这是我的状态码和我对ajax的响应

3 个回复
最合适的回答,由SO网友:Alexander Holsgrove 整理而成

看起来像MBAjax.ajaxurlMBAjax.admin_url 可能未设置。如果它不能发布到正确的Wordpress处理程序,那么您可能会得到返回的404页HTML,而不是PHP函数返回值。

您可以通过将ajax url硬编码为url: "/wp-admin/admin-ajax.php", 看看这能不能解决问题。

其次,我总是在我的动作表单上添加一个隐藏字段<input type="hidden" name="action" value="make_booking">

试试看,你过得怎么样。同时检查浏览器控制台network 选项卡以查看正在发送的AJAX请求。您可以检查正在发布的数据以及收到的回复。比尝试使用警报更简单。

enter image description here

您还可以使用console.log(x) 相反

更新:我认为您缺少在AJAX请求中发送任何内容:

jQuery.ajax({
   action : \'make_booking\',
   type   : "POST",
   data   : {
      action: \'make_booking\'
   }
   url    : MBAjax.admin_url,
   success: function(data) {
      alert(data);
      //jQuery("#container" ).append(data);
   },
   fail: function(error){
      alert("error" + error);
   }
});
试试看。

SO网友:Antti Koskinen

Ajax调用中的操作似乎不正确。根据wp_ajax_{action} 法典条目,

wp\\u ajax\\uhooks遵循“wp\\u ajax\\u$youraction”格式,其中$youraction是提交给admin ajax的“action”字段。php。

所以试着改变一下action: \'makeBooking\',action: \'make_booking\', 然后看看它是否有效。

如果希望ajax调用适用于未登录的用户,还可以使用wp_ajax_nopriv_{action} 行动挂钩。像这样

add_action(\'wp_ajax_nopriv_make_booking\', \'makeBooking\');
EDIT: 哦,我真傻。你也失踪了wp_die(); 从ajax响应结束时开始。看见codex / AJAX in Plugins 了解更多详细信息。

function makeBooking(){
    echo "Home again";
    wp_die(); // this is required to terminate immediately and return a proper response
}
EDIT 2: 您也可以使用wp_send_json 而不是回应你的回答。

SO网友:Mehul

add below actions

add_action( \'wp_ajax_makeBooking\', \'makeBooking\');
add_action( \'wp_ajax_nopriv_makeBooking\', \'makeBooking\');
结束