Timber框架:按自定义分类列出CPT文章的实现问题
按自定义分类法分组展示自定义文章类型内容
没问题,我来帮你搞定这个按分类展示车辆文章的需求!你之前的代码只是把所有vehicles文章一次性拉取出来,没有按vehicles_category分类分组,所以没法实现分类下罗列对应文章的效果。咱们分两步来解决:
第一步:后端PHP代码(传递分类及对应文章到模板)
修改你的上下文赋值代码,先获取目标分类,再逐个拉取每个分类下的文章,把分类和文章关联起来:
// 获取指定的vehicles_category分类(精准匹配你需要的四个分类) $vehicle_categories = Timber::get_terms([ 'taxonomy' => 'vehicles_category', 'slug' => ['construction', 'road', 'waste', 'other'], 'orderby' => 'name', 'order' => 'ASC' ]); // 遍历分类,为每个分类绑定对应的文章 $grouped_vehicles = []; foreach ($vehicle_categories as $category) { $category->posts = Timber::get_posts([ 'post_type' => 'vehicles', 'posts_per_page' => -1, 'order' => 'ASC', 'tax_query' => [ [ 'taxonomy' => 'vehicles_category', 'field' => 'term_id', 'terms' => $category->term_id ] ] ]); $grouped_vehicles[] = $category; } // 将分组后的数据传到模板上下文 $context['grouped_vehicles'] = $grouped_vehicles;
第二步:前端Twig模板代码(渲染分类及文章)
在你的Twig模板里,循环遍历分组后的分类数据,先输出分类名称,再罗列该分类下的文章:
{% for category in grouped_vehicles %} <h2>{{ category.name|title }}</h2> <!-- 首字母大写显示分类名称 --> <div class="vehicle-list"> {% for post in category.posts %} <span><a href="{{ post.link }}">{{ post.title }}</a></span> {% else %} <span>暂无相关车辆文章</span> {% endfor %} </div> {% endfor %}
补充小提示
- 要是不需要限定那四个分类,可以删掉
slug参数,这样会拉取所有vehicles_category分类 - 文章排序规则可以按需调整,比如改成按发布日期排序:
'orderby' => 'date' - 模板里的HTML结构可以根据你的页面样式自由修改,比如把span换成li或者其他标签
内容的提问来源于stack exchange,提问作者mfos
相关产品推荐
相关产品推荐

