首页 > 解决方案 > 使用数据表服务器端脚本 Wordpress 调用 ajax 函数时出现 400 Bad Request

问题描述

我正在创建一个插件来使用数据表服务器端脚本从自定义表中获取数据。

在查询中我得到正确的响应但在 ajax 函数调用中得到 400 错误请求

请求 URL:http://localhost/Project_name/wp-admin/admin-ajax.php 请求方法:POST 状态码:400 错误请求远程地址:[::1]:80

我的ajax js文件

$(document).ready(function() {
var dataTable = $('#employee-grid').DataTable( {
        "processing": true,
        "serverSide": true,
        dataType: "json",
        contentType: "application/json",
        "ajax":{
            "url" : 'admin-ajax.php',
            "type": "POST",
            "data": {action: 'my_action'},
            error: function(){  // error handling
                $(".employee-grid-error").html("");
                $("#employee-grid").append('<tbody class="employee-grid-error"><tr><th colspan="3">No data found in the server</th></tr></tbody>');
    $("#employee-grid_processing").css("display","none");},
        success: function(data){
            alert(data);
        }
    },
        "columns": [
            {"data": "employee_name"},
            {"data": "employee_salary"},
            {"data": "employee_age"}                       
        ], "columnDefs": [
            //{"orderable": false, "targets": 12}
            ]
        } );
    } ); 

在 ajax 文件中还添加了 wp_ajax_my_action 和 wp_ajax_nopriv_my_action 动作。

ajaxfile 函数文件

add_action( 'wp_ajax_my_action', 'my_action' );
add_action( 'wp_ajax_nopriv_my_action', 'my_action' );

function my_action() {

global $wpdb;

## Read value
$draw = $_POST['draw'];
$row = $_POST['start'];
$rowperpage = $_POST['length']; // Rows display per page
$columnIndex = $_POST['order'][0]['column']; // Column index
$columnName = $_POST['columns'][$columnIndex]['data']; // Column name
$columnSortOrder = $_POST['order'][0]['dir']; // asc or desc
$searchValue = $_POST['search']['value']; // Search value

## Search 
$searchQuery = " ";
if($searchValue != ''){
    $searchQuery = " and (reportNo like '%".$searchValue."%' or  ) ";
}


$totalRecordwithFilter = $records['allcount'];

## Total number of records without filtering
$sel = $wpdb->get_results('SELECT * FROM ' . $wpdb->prefix . 'employee');
$totalRecords = count($sel);


## Total number of records with filtering
/* $sel = mysqli_query($con,"select count(*) as allcount from employee WHERE 1 ".$searchQuery);
$records = mysqli_fetch_assoc($sel); */

$resultCount = $wpdb->get_results('SELECT * FROM ' . $wpdb->prefix . 'employee where '.$searchQuery);
$totalRecordwithFilter = count($resultCount);



## Fetch records
//$empQuery = "select * from employee WHERE 1 ".$searchQuery." order by ".$columnName." ".$columnSortOrder." limit ".$row.",".$rowperpage;
$empRecords = $wpdb->get_results('SELECT * FROM ' . $wpdb->prefix . 'employee where '.$searchQuery.' order by ' . $columnName . ' ' . $columnSortOrder . ' limit ' . $row . ',' . $rowperpage);
$empRecords = mysqli_query($con, $empQuery);
$data = array();

foreach ($sel as $row) {
    $data[] = array(
            "emp_name"=>$row->employee_name,
            "salary"=>$row->employee_salary,
            "age"=>$row->employee_age
        );
}

## Response
$response = array(
    "draw" => intval($draw),
    "iTotalRecords" => $totalRecords,
    "iTotalDisplayRecords" => $totalRecordwithFilter,
    "aaData" => $data
);

echo json_encode($response);

exit();
}

标签: ajaxwordpressdatatablesserver-side-scripting

解决方案


更新 当我检查您使用 POST 方法中不存在的参数时,您需要添加它们并检查它们是否存在

你应该像这样用你的ajax函数传递你的POST参数

data: {
    action: 'search_enrollment_by_scode',
    draw : 'draw',
    row : 'start',
    rowperpage : 'length',
    columnIndex : 'order',
    columnName : 'columns',
    columnSortOrder : 'order',
    searchValue : 'search',

}

注意:您应该添加有效数据或变量

你的 PHP 文件

<?php 
add_action( 'wp_ajax_my_action', 'my_action' );
add_action( 'wp_ajax_nopriv_my_action', 'my_action' );

function my_action() {

global $wpdb;

## Read value
// you need to check that you have this data or not
// you just add action data not any of bellow list
if ($_POST['draw']) {
        $draw = $_POST['draw'];
.
.
.
.
.
.
.

    echo json_encode($response);
}
else
{
    echo json_encode('Data is invalid or not complete');
}
exit();
}
 ?>

试试这个,然后替换你的 ajaxurl 变量"url" : 'admin-ajax.php',

<script type="text/javascript">
    var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>";
</script>

如 Wordpress AJAX 文档中所述,您有两个不同的挂钩 - wp_ajax_(action) 和 wp_ajax_nopriv_(action)。这些之间的区别是:

wp_ajax_(action):如果从管理面板内部进行 ajax 调用,则会触发此事件。wp_ajax_nopriv_(action):如果 ajax 调用是从网站的前端进行的,则会触发此事件。


推荐阅读