在WordPress+ACF中实现前端ACF字段只读的可靠方案探讨
ACF字段前端只读方案分析与自定义实现
前置定义
- 此处的“前端”指客户端渲染场景,包括后台文章编辑界面等,与服务端操作相对;
- “只读”指ACF字段可正常显示,但无法被修改。
ACF原生disabled/readonly属性的局限性
ACF自带的给输入元素添加disabled或readonly属性的方案存在诸多不足:
- 并非所有ACF字段都支持自定义
readonly或disabled属性,比如下拉框、滑块等字段本应适用却不支持; disabled属性存在数据丢失风险:提交包含禁用checkbox类型ACF字段的表单时,会清空该字段原有数据,且仅部分字段支持该属性:- 可通过
$field['disabled']=1;设置的字段:text,textarea,number,email,url,password,date_picker,time_picker,select - 可通过
$field['disabled']=array(<需要禁用的元素>)设置的字段:checkbox,radio
- 可通过
readonly属性支持的字段范围更小,且不会从POST请求中移除字段值——如果该字段在其他场景被修改,提交当前页面会覆盖掉只读字段的最新变更。
自定义拦截方案
针对上述问题,我尝试通过钩子拦截字段更新,判断请求是否来自前端(通过检查$_POST['acf']是否存在),代码实现如下:
function prevent_acf_field_from_updating($null, $value, $post_id, $field) { // 若未设置$_POST['acf'],则为服务端更新操作,不拦截 if (!isset($_POST['acf'])) { return $null; } // 仅对包含read_only_acf类的字段执行拦截 if (!str_contains($field['wrapper']['class'], 'read_only_acf')) { return $null; } return false; } add_filter('acf/pre_update_value', 'prevent_acf_field_from_updating', 10, 4);
同时,我还通过acf/field_wrapper_attributes过滤器给字段容器添加了inert属性,但不确定这个方案是否合理,以及通过检查$_POST['acf']来判断是否为前端请求的方式是否可靠?
内容的提问来源于stack exchange,提问作者hugogogo
相关产品推荐
相关产品推荐

