通过jQuery AJAX传递SessionStorage数据至WordPress数据库失败求助
问题排查与修复方案
核心错误点分析
前端数据编码错误:
sessionStorage.getItem('shoppingCart')返回的本身就是JSON格式字符串,再次调用JSON.stringify()会把它转成双重JSON编码的字符串,后端解析后无法得到正确的对象结构。同时用字符串拼接方式传递AJAX数据,会导致JSON中的特殊字符(如引号、&符号)被破坏,无法正确传递。后端变量未定义:
在update_post_meta中使用了未定义的变量$menu_make_arr,这直接导致数据库存入null。此外缺少数据合法性校验,也没有正确终止WordPress AJAX请求。
修复后的前端代码
// 直接获取sessionStorage中的JSON字符串,无需再次stringify var dataStorage = sessionStorage.getItem('shoppingCart'); $.ajax({ url: "https://mywebsite.com/wp-admin/admin-ajax.php", method: "POST", // 使用对象形式传递数据,jQuery会自动处理编码 data: { globalvar: dataStorage, action: 'myfunction' }, dataType: "json" }).done(function (response) { console.log('数据保存成功:', response); }).fail(function(err) { console.error('请求失败:', err); });
修复后的后端PHP代码
if (!function_exists('myfunction')) { function myfunction() { // 先校验数据是否存在 if (!isset($_POST['globalvar']) || empty($_POST['globalvar'])) { wp_send_json_error(['message' => '缺少有效数据']); } $object = $_POST['globalvar']; // 解析JSON,第二个参数设为true转成数组,适配WordPress存储习惯 $decoded_data = json_decode($object, true); // 校验解析是否成功 if (json_last_error() !== JSON_ERROR_NONE) { wp_send_json_error(['message' => '数据解析失败']); } // 使用解析后的有效数据更新元字段 $update_result = update_post_meta('42393', 'menu_items_list', $decoded_data); // 返回响应并终止请求 if ($update_result) { wp_send_json_success(['message' => '数据保存成功']); } else { wp_send_json_error(['message' => '数据保存失败']); } } add_action('wp_ajax_myfunction', 'myfunction'); add_action('wp_ajax_nopriv_myfunction', 'myfunction'); }
额外验证步骤
- 在浏览器控制台执行
sessionStorage.getItem('shoppingCart'),确认返回的是合法的JSON字符串 - AJAX请求发送前,可在
done回调中打印response,查看后端返回的状态信息 - 检查WordPress数据库中
postmeta表,确认post_id=42393的menu_items_list字段是否正确存储数据
内容的提问来源于stack exchange,提问作者Tod
相关产品推荐
相关产品推荐

