如何将RivetsJs绑定值存入PHP变量并解决get_field失效问题
解决RivetsJs绑定PHP变量后
get_field()无效的问题 先理清楚你遇到的具体场景:
- 我尝试用RivetsJs绑定器创建PHP变量
$tourId,这个变量会从WordPress REST API获取ID,预期值是1726 - 直接
echo $tourId能正常输出1726,但调用get_field('字段名', $tourId)时完全没效果 - 如果直接把1726以字符串/整数形式赋值给
$tourId(比如$tourId = 1726;),get_field()就能正常工作
问题根源:PHP和RivetsJs的运行时机差
这事儿核心矛盾就在前后端代码的执行顺序上:
- PHP是服务器端语言,所有PHP代码会在页面发送到浏览器之前就执行完毕
- RivetsJs是客户端JavaScript库,它的逻辑要等页面加载到浏览器后才会运行
你用RivetsJs绑定出来的$tourId,本质是客户端JS后续修改页面内容后的值,但这时候服务器端的get_field()早就执行完了——也就是说,当PHP跑get_field()的时候,$tourId根本还没被RivetsJs赋值,你看到echo出1726只是客户端JS后来改了页面显示而已。
两种可行解决方案
方案1:直接在PHP里调用WP REST API拿ID(推荐)
既然需要的ID来自WP REST API,不如直接在服务器端发起请求获取,这样$tourId是PHP原生生成的,get_field()就能正常使用:
// 替换成你的REST API端点,比如获取特定tour的详情 $api_url = get_site_url() . '/wp-json/wp/v2/tours/你的目标资源标识'; $response = wp_remote_get($api_url); if (is_wp_error($response)) { $tourId = 0; // 处理请求失败的情况 } else { $tour_data = json_decode(wp_remote_retrieve_body($response), true); $tourId = $tour_data['id']; // 从返回的JSON中提取ID } // 现在调用get_field就没问题了 $target_field = get_field('你的自定义字段名', $tourId);
方案2:用AJAX把RivetsJs拿到的ID传给PHP
如果必须在客户端用RivetsJs获取ID,那就得通过AJAX把值传给服务器端,再让PHP处理get_field():
客户端JS(配合RivetsJs)
// 假设RivetsJs已经拿到了有效tourId const tourId = rivets绑定的视图模型.tourId; // 发起AJAX请求到WordPress的AJAX接口 fetch('/wp-admin/admin-ajax.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: `action=fetch_tour_field&tour_id=${tourId}` }) .then(res => res.json()) .then(data => { // 拿到返回的字段值后,渲染到页面需要的位置 console.log('字段值:', data.field_value); });
服务器端PHP(加到主题的functions.php里)
// 注册AJAX回调(登录用户和未登录用户都能访问) add_action('wp_ajax_fetch_tour_field', 'fetch_tour_field_callback'); add_action('wp_ajax_nopriv_fetch_tour_field', 'fetch_tour_field_callback'); function fetch_tour_field_callback() { // 接收并验证客户端传来的ID $tourId = isset($_POST['tour_id']) ? intval($_POST['tour_id']) : 0; if ($tourId) { $field_value = get_field('你的自定义字段名', $tourId); wp_send_json_success(['field_value' => $field_value]); } else { wp_send_json_error(['msg' => '无效的Tour ID']); } wp_die(); // 必须加,结束AJAX请求 }
最后再提一句核心逻辑
服务器端PHP先跑,客户端JS后跑,两者没法直接共享变量——要么在PHP里提前拿到数据,要么用AJAX把客户端的数据传给PHP处理,这样就能避开这个前后端时机差的坑了。
内容的提问来源于stack exchange,提问作者Bergur Ingi P
相关产品推荐
相关产品推荐

