Buddyboss Group Loop按群组分类筛选实现多网格展示
BuddyBoss群组循环按分类分网格展示实现方案
问题原因
你之前的代码筛选不生效,核心是两个问题:
- 原模板仅调用一次
bp_has_groups()拉取全量群组,所有循环块复用同一个结果集,没有传入任何分类过滤参数 - 第一次
while (bp_groups())循环执行完成后,全局查询的结果指针已经移到数据集末尾,就算重复复制循环代码,也读不到有效数据,更无法实现分类过滤
实现方法
前置确认
首先确认你使用的群组分类类型:
- 如果是后台「BuddyBoss > 群组 > 群组类型」中创建的原生分类,直接使用对应分类的slug即可,比如你提到的"KOMMISIONEN"默认slug是
kommisionen - 如果是你自己通过自定义代码注册的分类法(taxonomy),需要额外传入分类法查询参数,后续会给出示例
改造后代码
核心逻辑是为每个网格单独发起带筛选规则的群组查询,不依赖默认的全量查询,公共的群组卡片渲染逻辑直接复用,新增网格只需要加配置项即可,不需要重复写HTML结构。
<?php /** * BuddyBoss - Groups Loop * * @since BuddyPress 3.0.0 * @version 3.1.0 */ bp_nouveau_before_loop(); ?> <?php if ( bp_get_current_group_directory_type() ) : ?> <div class="bp-feedback info"> <span class="bp-icon" aria-hidden="true"></span> <p class="current-group-type"><?php bp_current_group_directory_type_message(); ?></p> </div> <?php endif; ?> <?php $cover_class = bp_disable_group_cover_image_uploads() ? 'bb-cover-disabled' : 'bb-cover-enabled'; ?> <?php // 网格配置,新增分类网格直接在数组里加项即可 $group_grids = array( array( 'grid_id' => 'groups-list-kommissionen', 'type_slug' => 'kommisionen', // 替换为KOMMISIONEN分类的实际slug 'grid_title' => 'KOMMISIONEN', 'per_page' => 20 // 当前网格展示的群组数量,按需调整 ), // 第二个网格配置示例 array( 'grid_id' => 'groups-list-second', 'type_slug' => 'replace-with-your-second-type-slug', // 替换为第二个分类的实际slug 'grid_title' => '替换为第二个分类的显示名称', 'per_page' => 20 ) ); // 循环渲染每个分类网格 foreach ( $group_grids as $grid ) : // 构造查询参数,原生群组类型用这个 $query_args = array( 'group_type' => $grid['type_slug'], 'per_page' => $grid['per_page'], ); /* —— 如果你用的是自定义分类法,注释掉上面的$query_args,改用下面这段 —— $query_args = array( 'per_page' => $grid['per_page'], 'tax_query' => array( array( 'taxonomy' => '替换为你自定义的群组分类法名称', 'field' => 'slug', 'terms' => $grid['type_slug'], ) ) ); */ if ( bp_has_groups( $query_args ) ) : ?> <h3 class="group-grid-title"><?php echo esc_html( $grid['grid_title'] ); ?></h3> <ul id="<?php echo esc_attr( $grid['grid_id'] ); ?>" class="<?php bp_nouveau_loop_classes(); ?> <?php echo esc_attr( $cover_class ); ?>"> <?php while ( bp_groups() ) : bp_the_group(); ?> <li <?php bp_group_class( array( 'item-entry' ) ); ?> data-bp-item-id="<?php bp_group_id(); ?>" data-bp-item-component="groups"> <div class="list-wrap"> <?php if( !bp_disable_group_cover_image_uploads() ) { ?> <?php $group_cover_image_url = bp_attachments_get_attachment( 'url', array( 'object_dir' => 'groups', 'item_id' => bp_get_group_id(), ) ); $default_group_cover = buddyboss_theme_get_option( 'buddyboss_group_cover_default', 'url' ); $group_cover_image_url = $group_cover_image_url ?: $default_group_cover; ?> <div class="bs-group-cover only-grid-view"><a href="<?php bp_group_permalink(); ?>"><img src="<?php echo esc_url($group_cover_image_url); ?>"></a></div> <?php } ?> <?php if ( ! bp_disable_group_avatar_uploads() ) : ?> <div class="item-avatar"> <a href="<?php bp_group_permalink(); ?>" class="group-avatar-wrap"><?php bp_group_avatar( bp_nouveau_avatar_args() ); ?></a> <div class="groups-loop-buttons only-grid-view"> <?php bp_nouveau_groups_loop_buttons(); ?> </div> </div> <?php endif; ?> <div class="item"> <div class="item-block"> <h2 class="list-title groups-title"><?php bp_group_link(); ?></h2> <?php if ( bp_nouveau_group_has_meta() ) : ?> <p class="item-meta group-details only-list-view"><?php bp_nouveau_group_meta(); ?></p> <p class="item-meta group-details only-grid-view"><?php $meta = bp_nouveau_get_group_meta(); echo $meta['status']; ?> </p> <?php endif; ?> <p class="last-activity item-meta"> <?php printf( __( 'active %s', 'buddyboss-theme' ), bp_get_group_last_active() ); ?> </p> </div> <div class="item-desc group-item-desc only-list-view"><?php bp_group_description_excerpt( false , 150 ) ?></div> <?php bp_nouveau_groups_loop_item(); ?> <div class="groups-loop-buttons footer-button-wrap"><?php bp_nouveau_groups_loop_buttons(); ?></div> <div class="group-members-wrap only-grid-view"> <?php echo buddyboss_theme()->buddypress_helper()->group_members( bp_get_group_id(), array( 'member', 'mod', 'admin' ) ); ?> </div> </div> </div> </li> <?php endwhile; ?> </ul> <?php else : ?> <p class="no-group-notice"><?php printf( '暂无%s分类下的群组', esc_html( $grid['grid_title'] ) ); ?></p> <?php endif; endforeach; ?> <?php bp_nouveau_after_loop(); ?>
注意事项
- 原模板自带的顶部、底部分页是为全量群组列表设计的,分多个分类网格展示时全局分页没有作用,所以代码中移除了这部分逻辑,如果需要给单个网格加分页,给对应查询传入
page参数,配合独立分页逻辑实现即可 - 不要在自定义查询中混用
bp_ajax_querystring( 'groups' ),否则全局的搜索、排序参数会覆盖你设置的分类筛选规则,导致筛选失效 - 新增网格只需要在
$group_grids数组中添加对应配置项,不需要重复写群组卡片的HTML代码,后续维护更方便
内容的提问来源于stack exchange,提问作者David Hollerwöger
相关产品推荐
相关产品推荐

