WordPress的Code Snippets插件使用jQuery Ajax请求报400错误如何解决?
问题原因&解决步骤
1. 核心问题:JS中的PHP代码未被解析
你在JS代码中直接写<?php echo admin_url( 'admin-ajax.php' ) ?>,但Code Snippets默认不会解析独立JS代码中的PHP标签,导致最终传到前端的ajaxurl是未解析的PHP字符串,请求路径错误直接触发400。
修正方法:
将JS代码嵌入到PHP输出的前端钩子中,确保PHP代码被正常解析:
// 放在Code Snippets的PHP代码段中 add_action('wp_footer', function () { ?> <script> var jq = jQuery.noConflict(); jq(".c-day-content").click(function () { console.log ("日期选中事件处理正常..."); let day = jq(this).text(); day = day.replace(/[^0-9]/g,''); console.log("day=" + day); // 注意bookingStart变量要提前补充你原有初始化逻辑,避免未定义报错 let bookingStart = ''; bookingStart = bookingStart.concat(day); const ajaxurl = '<?php echo admin_url( 'admin-ajax.php' ) ?>'; console.log(ajaxurl); jq.ajax({ url: ajaxurl, data: { action: "retrieveAttendees", dateSelected: bookingStart }, method: 'POST', success: function(data) { console.log(JSON.stringify(data)); }, error: function (XMLHttpRequest, textStatus, errorThrown) { console.log("请求再次失败: " + JSON.stringify(XMLHttpRequest)); console.log("text status: " + textStatus); console.log("errorThrown: " + errorThrown) } }); }); </script> <?php });
2. 后端SQL语法错误修正
你原来的$wpdb->prepare写法存在语法问题,占位符拼接百分号的方式错误,会导致数据库查询报错,修正后的PHP处理代码如下:
function retrieveAttendees_request() { if ( isset($_REQUEST['dateSelected'])) { // 补充参数过滤,避免安全问题 $bookingDay = sanitize_text_field($_REQUEST['dateSelected']); global $wpdb; // 百分号放到参数中拼接,不要写在SQL语句里 $sql = $wpdb->prepare( "select apps.bookingStart, COUNT(*) as booked from wp_amelia_customer_bookings as books inner join wp_amelia_appointments as apps on books.appointmentId = apps.id where apps.bookingStart like %s and apps.status = 'approved' GROUP BY books.appointmentId;", $bookingDay . '%' ); $result = $wpdb->get_row($sql, ARRAY_A); echo json_encode($result); } // WordPress推荐用wp_die()代替die()处理Ajax请求结束 wp_die(); } add_action('wp_ajax_retrieveAttendees', 'retrieveAttendees_request'); add_action('wp_ajax_nopriv_retrieveAttendees', 'retrieveAttendees_request');
3. 额外验证步骤
如果修正后仍然报错,可以按以下顺序排查:
- 打开浏览器开发者工具的「网络」标签,找到发送到admin-ajax.php的请求,确认:
- 请求地址是正确的
https://你的域名/wp-admin/admin-ajax.php - 请求体中存在
action参数,值为retrieveAttendees
- 请求地址是正确的
- 确认Code Snippets中的PHP代码段已启用,且运行范围设置为「全局」
内容的提问来源于stack exchange,提问作者Gerardo C.
相关产品推荐
相关产品推荐

