如何在Statamic中通过courses_categories分类过滤课程条目?
Statamic Query Scope 实现课程分类过滤
我有一个包含courses_levels和courses_categories两个分类的“courses”集合,当前通过以下模板代码按层级遍历所有课程:
{{ taxonomy:courses_levels }} {{ entries query_scope="filter_by_categories_and_levels" }} {{ partial:courses.preview }} {{ /entries }} {{ /taxonomy:courses_levels }}
现在希望通过第二个分类courses_categories对条目进行过滤,已搭建表单生成类似如下的URL:http://url.test/formations/niveaux-et-categories?animalieres=1&artisanat=1
打算使用query_scope实现但不知具体写法,且现阶段不考虑JavaScript解决方案,需完善以下Query Scope类的apply方法:
<?php namespace App\Scopes; use Statamic\Query\Scopes\Scope; class FilterByCategoriesAndLevels extends Scope { /** * Apply the scope. * * @param \Statamic\Query\Builder $query * @param array $values * @return void */ public function apply($query, $values) { // HELP NEEDED HERE } }
完善后的apply方法代码
public function apply($query, $values) { // 获取URL中的所有查询参数 $categoryParams = request()->query(); // 筛选出用户选中的分类别名(参数值为1的键) $selectedCategories = collect($categoryParams) ->filter(fn($value) => $value === '1') ->keys() ->toArray(); // 如果有选中的分类,添加分类过滤条件 if (!empty($selectedCategories)) { $query->whereTaxonomy('courses_categories', $selectedCategories); } }
代码说明
- 获取查询参数:通过
request()->query()获取URL中所有的查询参数,比如示例URL会得到数组['animalieres' => '1', 'artisanat' => '1']。 - 筛选选中分类:用集合筛选出值为
1的参数键,这些键就是courses_categories分类下的条目别名,也就是用户勾选的分类。 - 添加过滤条件:如果有选中的分类,调用
whereTaxonomy方法给查询添加分类过滤规则,指定匹配courses_categories分类下的选中别名。
额外说明
因为模板是在{{ taxonomy:courses_levels }}循环内调用entries标签,Statamic会自动给查询添加当前courses_levels分类的过滤条件,所以这个Scope只需要处理courses_categories的过滤逻辑,两者会自动叠加形成“同时符合层级分类和选中分类”的查询结果。
内容的提问来源于stack exchange,提问作者Daniel Schreurs
相关产品推荐
相关产品推荐

