
本文详解如何在 wordpress 环境中使用 jquery ajax 安全、可靠地将 javascript 数组传递给 php 处理函数,重点解决 `$_post`/`$_request` 接收为 `null` 的常见问题,并给出可直接运行的调试友好型代码方案。
在 WordPress 开发中,通过 AJAX 将前端数组(如用户 ID 列表)传入后端 PHP 函数是高频需求,但初学者常因数据序列化方式、请求方法、PHP 接收逻辑不匹配而始终收到 null。核心问题不在于“数组不能传”,而在于传输格式与解析逻辑必须严格一致。
✅ 正确做法:前端精简发送,后端精准接收
1. 前端 jQuery:避免嵌套对象,显式指定 type: 'POST'
原代码中 'data': {data: jsonIDs} 将字符串再次包裹为对象,导致 PHP 中 $_POST['data'] 实际为关联数组而非原始 JSON 字符串。应直接传递 JSON 字符串:
var userIDs = [];
$("tr.user-row").each(function() {
userIDs.push($(this).data("userid")); // 推荐用 .data() 替代 .attr()
});
$.ajax({
type: 'POST', // 显式声明,确保 $_POST 可用
url: ajaxurl,
data: {
'action': 'built_ranking',
'data': JSON.stringify(userIDs) // 直接传字符串,不额外包装
},
dataType: 'json',
success: function(response) {
console.log('Success:', response);
// 示例:更新 DOM
// response.forEach(item => {
// $(`tr[data-userid="${item}"]`).find('td.punten').text('✓');
// });
},
error: function(xhr, status, error) {
console.error('AJAX Error:', status, error);
alert('请求失败,请检查控制台');
}
});? 提示:$(this).data("userid") 比 .attr("data-userid") 更健壮,自动处理 data-* 属性类型转换。
2. 后端 PHP:校验存在性 + 安全解码
使用 $_POST(非 $_REQUEST)并添加必要防护:
function built_ranking() {
// 1. 验证 action 和权限(生产环境必需!)
if (!isset($_POST['action']) || $_POST['action'] !== 'built_ranking') {
wp_die('Invalid action');
}
// 2. 检查 data 是否存在且非空
if (!isset($_POST['data']) || empty($_POST['data'])) {
wp_send_json_error(['message' => 'Missing or empty data']);
return;
}
// 3. 安全解码 JSON(stripslashes 防 magic quotes,现代 PHP 通常无需)
$json_string = wp_unslash($_POST['data']);
$user_ids = json_decode($json_string, true); // true → 关联数组
// 4. 验证解码结果
if (json_last_error() !== JSON_ERROR_NONE || !is_array($user_ids)) {
wp_send_json_error(['message' => 'Invalid JSON format']);
return;
}
// ✅ 此时 $user_ids 是合法 PHP 数组,可直接使用
error_log('Received IDs: ' . print_r($user_ids, true)); // 调试日志
// 示例业务逻辑:查询数据库或处理数据
// $results = get_user_rankings($user_ids);
// 5. 返回结构化响应(推荐 wp_send_json_* 系列函数)
wp_send_json_success([
'received_count' => count($user_ids),
'ids' => $user_ids,
'timestamp' => current_time('mysql')
]);
}
add_action('wp_ajax_built_ranking', 'built_ranking');
// 若需前台访问,补充:
// add_action('wp_ajax_nopriv_built_ranking', 'built_ranking');⚠️ 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 永远不要依赖 $_REQUEST:它混合了 GET/POST/COOKIE,易被意外覆盖,且 WordPress AJAX 标准约定使用 POST。
- 务必校验 action 和数据完整性:防止恶意调用或空数据导致崩溃。
- 用 wp_send_json_success() / wp_send_json_error():自动设置 Header、JSON 编码并 die(),比手动 echo + die() 更安全。
- 调试技巧:在 PHP 中 error_log(print_r($_POST, true)) 查看真实接收内容;浏览器 Network 面板检查 Request Payload 和 Response。
? 总结
成功传递数组的核心是:前端发送纯 JSON 字符串(JSON.stringify(arr)),后端用 $_POST 接收并 json_decode() 解析。跳过中间嵌套、避免 $_REQUEST 模糊性、添加防御性校验,即可彻底解决 null 问题。记住——调试不是猜测,而是观察 Network 请求载荷与 error_log 输出,让数据自己说话。










