Concrete5:同一页面多页面列表去重技术问题
解决Concrete5主页两个Page List块内容重复的问题
我来分享几个针对这个场景的靠谱解决方案,都是Concrete5开发中处理页面列表重复的常用方法:
方案1:直接通过Page List块的过滤规则排除特色页面(简单快捷)
如果你的需求是红色列表只展示非特色页面(完全排除is_featured=true的页面),这是最省事的做法:
- 编辑红色的Page List块,进入「过滤」选项卡
- 在「页面属性过滤」区域,添加一条规则:选择
is_featured属性,条件设为「不等于」,值选true - 保存块配置,这样红色列表就只会显示非特色页面,和绿色特色列表完全不重复
方案2:自定义PHP过滤(灵活处理复杂场景)
如果你的需求是红色列表可以包含特色页面,但要排除已经在绿色块里展示的具体页面(比如绿色展示最新3个特色,红色展示最新6个页面但去掉这3个),可以用Concrete5的自定义过滤回调:
- 先给绿色的Page List块设置固定排序(比如按发布时间倒序),确保展示的页面是固定的一批
- 编辑红色的Page List块,进入「高级」选项卡
- 在「自定义PHP过滤代码」文本框中,添加以下代码:
// 获取绿色块展示的特色页面ID(假设绿色块展示3个) $featuredPageIDs = []; $featuredPages = PageList::getByAttribute('is_featured', true)->sort('publication_date', 'desc')->limit(3); foreach ($featuredPages as $page) { $featuredPageIDs[] = $page->getCollectionID(); } // 排除这些ID的页面 return !in_array($page->getCollectionID(), $featuredPageIDs);
- 保存块配置,这样红色列表就会自动排除绿色块已经展示的特色页面,同时保留其他所有页面(包括未被绿色展示的特色页面,如果有的话)
方案3:使用自定义页面列表模板(适合深度定制场景)
如果需要更灵活的样式或逻辑控制,可以给红色列表创建一个自定义模板:
- 在主题的
blocks/page_list/templates目录下新建模板文件,比如exclude_featured.php - 在模板中先获取绿色块的特色页面ID集合,再在循环输出时跳过这些ID:
<?php // 获取特色页面ID $featuredPageIDs = []; $featuredList = new PageList(); $featuredList->filterByAttribute('is_featured', true); $featuredList->sort('publication_date', 'desc'); $featuredList->limit(3); foreach ($featuredList->getResults() as $fPage) { $featuredPageIDs[] = $fPage->getCollectionID(); } ?> <!-- 红色列表的HTML结构 --> <div class="red-highlight-list"> <?php foreach ($pages as $page): ?> <?php if (!in_array($page->getCollectionID(), $featuredPageIDs)): ?> <div class="list-item"> <h3><?php echo $page->getCollectionName(); ?></h3> <!-- 其他页面内容 --> </div> <?php endif; ?> <?php endforeach; ?> </div>
- 编辑红色的Page List块,在「模板」选项卡中选择这个自定义模板即可
注意:如果后续调整了绿色块展示的页面数量(比如从3个改成5个),记得同步修改代码里的limit(3)参数,保证排除的ID数量匹配。
内容的提问来源于stack exchange,提问作者ugotchi
相关产品推荐
相关产品推荐

