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

ACF验证异常:员工重复校验时触发500错误且字段消失

问题:员工存在校验时触发500错误,ACF字段消失

环境信息

  • ACF 6.0.7
  • PHP 7.4.26
  • Apache 2.4.51

问题背景

已创建entreprise和employe两个自定义文章类型,在创建employe时通过ACF字段校验员工是否已存在:当员工姓名为空或格式错误时,错误提示能正常显示;但校验员工是否已存在时,会触发500内部服务器错误,ACF字段直接消失。

原校验代码如下:

add_filter('acf/validate_value/name=nomprenoms', 'existenceEmploye',10,4);

function existenceEmploye( $valid, $value, $field, $input_name ) {


$entreprise=$_GET['ent'];

  if ( !$value) {
      return __( "employee name is mandatory" );  
  }


$nomPrenoms=explode(",",$value);

if (strlen($nomPrenoms[0]) ==0 || 
    strlen($nomPrenoms[0]) == strlen($value) ||
    strlen($nomPrenoms[0]) == strlen($value) -1 ) {
  return __( "La syntaxe est nom, prenoms" ); 
}


$args = array(
'posts_per_page'    => -1,
'post_type'         => 'employe',
'meta_query'      => array (
  'relation'      =>'AND',
  array (
    'key'         =>'nomprenoms',
    'value'       =>$value,
    'compare'     =>'=',
     ),
array (
    'key'         =>'entreprise',
    'value'       =>$entreprise,
    'compare'     =>'=',
     ),
  ),

);

// var_dump($args);

$the_query = new WP_Query( $args );


if (count($the_query->posts)) {  
        wp_reset_postdata(); 
        return ( "The employee exits already" );  
    }
else {
          wp_reset_postdata(); 
}


  return $valid;
    
}

错误原因分析

  1. $_GET['ent']未做存在性检查:如果URL中没有ent参数,直接访问会触发PHP未定义变量警告,若服务器错误级别设置严格,会直接抛出500错误。
  2. wp_reset_postdata()使用错误:该函数用于重置WordPress主查询的全局变量,而这里用的是自定义WP_Query,错误调用会导致全局查询状态混乱。
  3. 未对$entreprise做合法性校验:传入非法值会导致WP_Query执行出错,进而触发服务器错误。

修复后的代码

add_filter('acf/validate_value/name=nomprenoms', 'existenceEmploye', 10, 4);

function existenceEmploye($valid, $value, $field, $input_name) {
    // 校验员工姓名非空
    if (!$value) {
        return __("employee name is mandatory");  
    }

    // 校验姓名格式
    $nomPrenoms = explode(",", $value);
    if (strlen($nomPrenoms[0]) == 0 || 
        strlen($nomPrenoms[0]) == strlen($value) ||
        strlen($nomPrenoms[0]) == strlen($value) - 1 ) {
        return __("La syntaxe est nom, prenoms"); 
    }

    // 处理关联企业ID,避免未定义错误
    $entreprise = isset($_GET['ent']) ? intval($_GET['ent']) : 0;
    if (!$entreprise) {
        return __("无法获取关联企业信息");
    }

    $args = array(
        'posts_per_page' => -1,
        'post_type'      => 'employe',
        'post_status'    => 'publish,draft', // 包含草稿状态,避免漏查未发布员工
        'meta_query'     => array(
            'relation' => 'AND',
            array(
                'key'     => 'nomprenoms',
                'value'   => $value,
                'compare' => '=',
            ),
            array(
                'key'     => 'entreprise',
                'value'   => $entreprise,
                'compare' => '=',
            ),
        ),
    );

    $the_query = new WP_Query($args);

    if ($the_query->have_posts()) {  
        wp_reset_query(); // 重置自定义查询的全局状态
        return __("The employee exits already");  
    }

    wp_reset_query();
    return $valid;
}

关键修改说明

  • 增加isset($_GET['ent'])检查,并用intval()转换为整数,既避免未定义错误,也防止SQL注入风险。
  • 将wp_reset_postdata()替换为wp_reset_query(),适配自定义WP_Query的重置需求。
  • 新增post_status参数,确保查询到所有状态的员工(包括草稿),避免漏判已创建但未发布的重复员工。
  • 增加$entreprise为0时的错误提示,提升用户体验。

内容的提问来源于stack exchange,提问作者kikou73

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:15:35