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

如何在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);
    }
}

代码说明

  1. 获取查询参数:通过request()->query()获取URL中所有的查询参数,比如示例URL会得到数组['animalieres' => '1', 'artisanat' => '1']。
  2. 筛选选中分类:用集合筛选出值为1的参数键,这些键就是courses_categories分类下的条目别名,也就是用户勾选的分类。
  3. 添加过滤条件:如果有选中的分类,调用whereTaxonomy方法给查询添加分类过滤规则,指定匹配courses_categories分类下的选中别名。

额外说明

因为模板是在{{ taxonomy:courses_levels }}循环内调用entries标签,Statamic会自动给查询添加当前courses_levels分类的过滤条件,所以这个Scope只需要处理courses_categories的过滤逻辑,两者会自动叠加形成“同时符合层级分类和选中分类”的查询结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:25:02