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

如何在WordPress单文章页面模板前端添加ACF单选按钮字段?

解决WordPress ACF单选按钮在餐饮菜单页面前端显示与提交问题

你的代码核心问题在于混淆了ACF字段值和字段配置的获取方式:

  • get_field('waiter_service') 返回的是当前文章该字段的选中值,不是包含label、choices的字段配置数组
  • 你需要用acf_get_field('waiter_service')来获取字段的完整配置(包括选项列表)

另外,提交表单时需要指定文章ID,否则update_field可能无法正确更新当前菜单文章的字段,同时建议添加CSRF验证提升安全性。

以下是修正后的完整代码:

<?php
// 获取ACF字段的配置(包含选项、标签等)
$waiter_field = acf_get_field('waiter_service');
// 获取当前文章该字段的选中值
$selected_value = get_field('waiter_service');

if ($waiter_field) {
    // 生成表单nonce,防止CSRF攻击
    wp_nonce_field('waiter_service_submit', 'waiter_service_nonce');
    ?>
    <form action="" method="post">
        <label><?php echo esc_html($waiter_field['label']); ?></label><br />
        <?php foreach ($waiter_field['choices'] as $value => $label) : ?>
            <input type="radio" name="waiter_service" value="<?php echo esc_attr($value); ?>" 
                <?php checked($selected_value, $value); ?> />
            <?php echo esc_html($label); ?><br />
        <?php endforeach; ?>
        <input type="submit" name="submit_form" value="呼叫服务员" />
    </form>
    <?php
}

// 处理表单提交
if (isset($_POST['submit_form'])) {
    // 验证nonce和提交的数据
    if (!isset($_POST['waiter_service_nonce']) || !wp_verify_nonce($_POST['waiter_service_nonce'], 'waiter_service_submit')) {
        wp_die('非法请求');
    }

    $post_id = get_the_ID();
    $field_value = isset($_POST['waiter_service']) ? sanitize_text_field($_POST['waiter_service']) : '';
    $waiter_field = acf_get_field('waiter_service');

    // 验证提交的值是否在字段可选范围内
    if (array_key_exists($field_value, $waiter_field['choices'])) {
        update_field('waiter_service', $field_value, $post_id);
        // 提交后可以添加提示或刷新页面
        echo '<p>已成功发送呼叫请求!</p>';
    } else {
        echo '<p>无效的选择,请重新提交</p>';
    }
}
?>

关键修正点说明:

  • 用acf_get_field()获取字段配置,get_field()获取选中值,分离了配置与数据
  • 添加wp_nonce_field()和wp_verify_nonce()防止跨站请求伪造
  • 使用checked()函数简化单选框选中状态的判断(WordPress内置函数,更可靠)
  • 提交时传入当前文章IDget_the_ID()给update_field(),确保更新的是当前菜单文章的字段
  • 用esc_html()、esc_attr()、sanitize_text_field()处理输出和输入,避免XSS攻击
  • 验证提交的值是否在字段的可选选项中,防止恶意数据提交

内容的提问来源于stack exchange,提问作者Frank Lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:17:28