如何按当前分类法动态过滤ACF Post Object字段可选文章
现有代码的问题
- 语法错误:函数内部多了一处多余的右大括号,会直接导致代码解析失败,功能无法生效。
- 未适配分类编辑页的ID规则:ACF在分类术语编辑页传入的
$post_id为term_{ID}格式的字符串(例如编辑ID为8的分类时,值为term_8),直接传入查询参数无法匹配到对应分类。 - 分类法写死:固定查询
category分类,无法适配所有分类法动态生效的需求。
可行解决方案
将以下代码添加到主题的functions.php文件或自定义功能插件中,注意替换代码中的字段名为你实际创建的Post Object字段名称:
// 钩子后缀的your_post_object_field替换为你自己的Post Object字段名 add_filter('acf/fields/post_object/query/name=your_post_object_field', 'filter_post_object_by_current_term', 10, 3); function filter_post_object_by_current_term( $args, $field, $post_id ) { // 判断当前是否为分类术语编辑页 if ( str_starts_with($post_id, 'term_') ) { // 提取纯数字的术语ID $term_id = (int) str_replace('term_', '', $post_id); $current_term = get_term($term_id); // 术语校验通过后动态添加分类过滤规则 if ( !is_wp_error($current_term) ) { $args['tax_query'] = [ [ 'taxonomy' => $current_term->taxonomy, 'field' => 'term_id', 'terms' => $term_id, ] ]; } } return $args; }
如果你的WordPress版本低于5.9(无原生str_starts_with函数),将判断条件替换为以下兼容写法:
if ( substr($post_id, 0, 5) === 'term_' )
注意事项
如果需要让规则对所有Post Object字段生效,可将钩子改为acf/fields/post_object/query,无需加字段名后缀,不建议这么做,避免影响其他无关的Post Object字段的查询结果。
内容的提问来源于stack exchange,提问作者user2115227
相关产品推荐
相关产品推荐

