WordPress ACF日期字段校验:阻止返程时间早于出发时间的文章保存
ACF日期字段校验:返程时间晚于出发时间的实现方案
要实现返程时间必须晚于出发时间的校验,需要同时做前端即时提示和后端强制拦截,避免用户绕过后端提交不符合要求的数据。
一、前端JS校验(即时提示)
利用ACF提供的前端钩子,在用户填写或提交时实时校验并给出提示:
// 放在主题的functions.php里,通过ACF钩子输出前端脚本 add_action('acf/input/admin_head', 'voyage_date_validation_js'); function voyage_date_validation_js() { ?> <script type="text/javascript"> (function($) { // 监听出发/返程时间字段的变化 $(document).on('change', '[name="acf[field_XXXXXXX]"], [name="acf[field_YYYYYYY]"]', function() { // 替换成你的departure_time(出发时间)字段ID const departure = $('[name="acf[field_XXXXXXX]"]').val(); // 替换成你的return_time(返程时间)字段ID const returnTime = $('[name="acf[field_YYYYYYY]"]').val(); if (departure && returnTime && returnTime <= departure) { // 显示错误提示 $('.acf-field-field_YYYYYYY').find('.acf-error-message').remove(); $('.acf-field-field_YYYYYYY').append('<div class="acf-error-message" style="color:red;">返程时间必须晚于出发时间</div>'); } else { // 清除错误提示 $('.acf-field-field_YYYYYYY').find('.acf-error-message').remove(); } }); // 提交表单前做最终校验 $('form#post').on('submit', function(e) { const departure = $('[name="acf[field_XXXXXXX]"]').val(); const returnTime = $('[name="acf[field_YYYYYYY]"]').val(); if (departure && returnTime && returnTime <= departure) { e.preventDefault(); alert('返程时间必须晚于出发时间,请修正后再保存'); $('[name="acf[field_YYYYYYY]"]').focus(); } }); })(jQuery); </script> <?php }
注意:字段ID可以在ACF字段编辑页面的地址栏中找到,替换代码中的field_XXXXXXX和field_YYYYYYY即可。
二、后端PHP校验(强制拦截)
前端校验可能被绕过,必须在后端保存前做强制校验,不符合规则则阻止保存:
add_action('acf/save_post', 'voyage_date_validation_backend', 10, 1); function voyage_date_validation_backend($post_id) { // 排除自动保存场景 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; // 校验用户编辑权限 if (!current_user_can('edit_post', $post_id)) return; // 只针对voyage类型的文章(根据你的文章类型调整) if (get_post_type($post_id) !== 'voyage') return; // 获取ACF字段原始值 $departure = get_field('departure_time', $post_id, false); $return_time = get_field('return_time', $post_id, false); // 时间比较逻辑 if (!empty($departure) && !empty($return_time) && strtotime($return_time) <= strtotime($departure)) { // 添加ACF校验错误 add_filter('acf/validate_post', function($errors) { $errors[] = __('返程时间必须晚于出发时间,请修正后再保存', 'your-text-domain'); return $errors; }); // 阻止文章保存 wp_die('返程时间必须晚于出发时间,请修正后再保存', '保存失败', array('back_link' => true)); } }
说明:
- 如果你的日期字段是纯日期格式(如YYYYMMDD),直接用字符串比较即可(
$return_time <= $departure),无需strtotime转换。 - 替换
your-text-domain为你的主题/插件文本域,用于多语言翻译。
三、注意事项
- 确保两个日期字段的格式完全一致(比如都是日期时间格式,或都是纯日期),否则比较逻辑会出错。
- 后端校验是核心,必须保留,避免用户通过工具直接提交非法数据。
内容的提问来源于stack exchange,提问作者zakaryaaghlaoui
相关产品推荐
相关产品推荐

