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; }
错误原因分析
$_GET['ent']未做存在性检查:如果URL中没有ent参数,直接访问会触发PHP未定义变量警告,若服务器错误级别设置严格,会直接抛出500错误。wp_reset_postdata()使用错误:该函数用于重置WordPress主查询的全局变量,而这里用的是自定义WP_Query,错误调用会导致全局查询状态混乱。- 未对
$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
相关产品推荐
相关产品推荐

