如何在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内置函数,更可靠) - 提交时传入当前文章ID
get_the_ID()给update_field(),确保更新的是当前菜单文章的字段 - 用
esc_html()、esc_attr()、sanitize_text_field()处理输出和输入,避免XSS攻击 - 验证提交的值是否在字段的可选选项中,防止恶意数据提交
内容的提问来源于stack exchange,提问作者Frank Lin
相关产品推荐
相关产品推荐

