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

ACF Field Group Relationships 多层关联指定值输出方法

实现方案

首先先修正现有ACF结构的核心问题:当前你把related_team_group和related_service两个关系字段都挂在团队成员(Team Member)CPT下,服务和分组之间没有直接绑定,根本没法区分某一项服务具体属于哪个分组,这是之前没法做定向筛选的根本原因。

先补1个必要的字段配置:

  • 给团队分组(Team Group)CPT新增ACF关系字段,字段名设为related_group_service,筛选可选项仅保留服务(Service)CPT,用来绑定当前分组下的所有专属服务:比如Photography分组就勾选Location Shoots、Studio Shoots、Retouching三个服务,Videography分组就勾选Basic Filming、Drone Shoots、Postproduction三个服务,补全「分组-服务」的二级关联。

补完结构后,所有定向页面都按「先定位目标分组→查分组绑定的服务→查归属分组的成员」的逻辑写即可,不用遍历成员下的全量数据。


各页面代码实现

page-photography.php

直接按固定slug匹配目标分组,输出分组名称、绑定服务、归属成员即可:

<?php
// 替换'photography'为你站点Photography分组的实际文章slug
$target_group = get_page_by_path('photography', OBJECT, 'team-group');
if ($target_group) :
?>
<!-- 输出分组名称 -->
<h2 class="group-title"><?php echo esc_html($target_group->post_title); ?></h2>

<h3>该分组下提供的服务</h3>
<ul class="service-list">
<?php
// 读取当前分组绑定的所有服务
$group_services = get_field('related_group_service', $target_group->ID);
if ($group_services) :
    foreach ($group_services as $service) :
?>
    <li>
        <a href="<?php echo esc_url(get_the_permalink($service->ID)); ?>">
            <?php echo esc_html($service->post_title); ?>
        </a>
    </li>
<?php
    endforeach;
endif;
?>
</ul>

<h3>该分组下的团队成员</h3>
<?php
// 查询归属当前分组的所有团队成员
$member_query = new WP_Query([
    'post_type' => 'team-member',
    'posts_per_page' => -1,
    'orderby' => 'title',
    'order' => 'ASC',
    'meta_query' => [
        [
            'key' => 'related_team_group',
            'value' => '"' . $target_group->ID . '"',
            'compare' => 'LIKE'
        ]
    ]
]);
if ($member_query->have_posts()) :
    while ($member_query->have_posts()) : $member_query->the_post();
?>
    <div class="member-card">
        <h4><?php the_title(); ?></h4>
        <!-- 可按需补充头像、简介等成员信息 -->
    </div>
<?php
    endwhile;
    wp_reset_postdata();
endif;
?>
<?php endif; ?>

该页面会直接输出Photography分组名,以及对应3个服务、归属成员John Doe,完全匹配需求。


page-videography.php

逻辑和摄影页完全一致,仅需修改目标分组的slug即可,其余代码可直接复用:

// 仅修改这一行,替换为Videography分组的实际slug
$target_group = get_page_by_path('videography', OBJECT, 'team-group');

页面会输出Videography分组名,以及Basic Filming、Drone Shoots、Postproduction三个对应服务、归属成员John Doe。


page-aerial-shooting.php

在分组服务遍历环节加一层过滤,仅保留需要展示的服务即可:

<?php
// 先获取所属的Videography分组对象
$target_group = get_page_by_path('videography', OBJECT, 'team-group');
// 定义当前页需要展示的服务slug,替换为站点对应服务的实际slug
$allow_service_slugs = ['drone-shoots', 'postproduction'];
if ($target_group) :
?>
<!-- 输出所属分组名称 -->
<h2 class="group-title">所属分组:<?php echo esc_html($target_group->post_title); ?></h2>

<h3>对应服务</h3>
<ul class="service-list">
<?php
$group_services = get_field('related_group_service', $target_group->ID);
if ($group_services) :
    foreach ($group_services as $service) :
        // 跳过不在允许列表里的服务
        if (!in_array($service->post_name, $allow_service_slugs)) {
            continue;
        }
?>
    <li>
        <a href="<?php echo esc_url(get_the_permalink($service->ID)); ?>">
            <?php echo esc_html($service->post_title); ?>
        </a>
    </li>
<?php
    endforeach;
endif;
?>
</ul>

<h3>对应团队成员</h3>
<?php
// 成员查询逻辑和前述页面一致,仅查归属Videography分组的成员
$member_query = new WP_Query([
    'post_type' => 'team-member',
    'posts_per_page' => -1,
    'meta_query' => [
        [
            'key' => 'related_team_group',
            'value' => '"' . $target_group->ID . '"',
            'compare' => 'LIKE'
        ]
    ]
]);
if ($member_query->have_posts()) :
    while ($member_query->have_posts()) : $member_query->the_post();
?>
    <div class="member-card">
        <h4><?php the_title(); ?></h4>
    </div>
<?php
    endwhile;
    wp_reset_postdata();
endif;
?>
<?php endif; ?>

该页面会输出Videography分组名,以及指定的Drone Shoots、Postproduction两个服务、对应成员John Doe。


原有代码的修正提示
  • 之前写的WP_Query中meta_query的value传空数组是无效写法:ACF关系字段存的是序列化的文章ID数组,精准匹配要传带双引号的ID字符串,格式为'"' . $目标ID . '"',避免ID相似导致的查询错误。
  • 现有single-team-members.php里调用分组字段用的是related_group,和定义的字段名related_team_group不一致,会导致拿不到数据,记得统一字段名。
  • 所有自定义WP_Query循环结束后必须加wp_reset_postdata(),避免全局$post对象被污染,导致页面后续内容输出错乱。
  • 输出文章标题、固定链接时加esc_html()、esc_url()做安全转义,避免XSS漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:36:21