
本文介绍如何通过复用同一过滤器函数,为多个 gravity forms 表单(如 id 为 138 和其他自定义 id 的表单)统一添加只读字段功能,避免代码重复,提升可维护性与扩展性。
本文介绍如何通过复用同一过滤器函数,为多个 gravity forms 表单(如 id 为 138 和其他自定义 id 的表单)统一添加只读字段功能,避免代码重复,提升可维护性与扩展性。
在 WordPress + Gravity Forms 开发中,常需对特定表单的输入字段动态设置 readonly 属性(例如基于用户角色或表单状态)。若为每个表单单独注册 gform_pre_render_{ID} 过滤器并复制整段脚本逻辑,不仅违反 DRY(Don’t Repeat Yourself)原则,还会显著增加后期维护成本。
正确做法是:复用同一个回调函数,为多个表单 ID 绑定同一过滤器。 Gravity Forms 的 gform_pre_render_{ID} 钩子支持通配符式注册,但更推荐显式、清晰地为多个 ID 分别挂载——既保证可读性,又便于后续增删管理。
✅ 推荐实现方式如下:
// 为多个表单复用同一只读脚本(支持数字ID与字符串ID)
add_filter( 'gform_pre_render_138', 'add_readonly_script' );
add_filter( 'gform_pre_render_205', 'add_readonly_script' );
add_filter( 'gform_pre_render_contact_form', 'add_readonly_script' ); // 支持自定义表单ID(如命名ID)
function add_readonly_script( $form ) {
?>
<script type="text/javascript">
jQuery(document).on('gform_post_render', function() {
// 精准匹配:仅作用于带有 .gf_readonly 类的容器内的 input 元素
jQuery(".gf_readonly input").prop("readonly", true).addClass("gf-readonly-applied");
});
</script>
<?php
return $form;
}? 关键说明与最佳实践:
立即学习“PHP免费学习笔记(深入)”;
- ✅ jQuery.prop("readonly", true) 比 attr() 更语义准确且兼容性更佳(尤其在现代 jQuery 版本中);
- ✅ 添加 .gf-readonly-applied 类便于 CSS 样式区分或调试验证;
- ✅ 支持混合 ID 类型:数字 ID(如 138)和字符串 ID(如 contact_form)均可直接使用,Gravity Forms 均可识别;
- ⚠️ 注意:确保目标表单中确实存在含 gf_readonly 类的包装容器(如 <div class="gf_readonly">...</div>),否则选择器不生效;
- ? 若未来需差异化逻辑(如不同表单应用不同规则),建议改用闭包或参数化函数,但当前场景下复用函数已是最简洁、健壮的方案。
通过此方式,新增表单只需追加一行 add_filter() 调用,无需修改核心逻辑,真正实现“一次编写、多处生效”。



















