You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:47:20