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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:13:16