如何限制Drupal分类法搜索层级?自定义模块代码修改
解决Drupal视图区块按特定层级分类术语展示的问题
背景说明
- 已创建分类术语及子术语,每个节点仅关联单个术语
- 已创建展示置顶节点的视图区块,添加了上下文过滤器「Content: Has taxonomy term identifier (with depth)」
- 需求:视图区块仅在特定层级术语、其子术语、父术语、兄弟术语关联的页面显示(示例:关联Wallet的置顶节点需在Crypto及其所有子术语页面呈现)
- 当前问题:现有自定义模块代码会获取最顶层父术语,需要修改为获取倒数第二级父术语来限制搜索层级
现有完整代码
<?php use Drupal\views\ViewExecutable; use Drupal\node\NodeInterface; /** * Implements hook_views_pre_view(). */ function sticky_content_views_pre_view(ViewExecutable $view, $display_id, array &$args) { if ($view->id() !== 'sticky_content' || $display_id !== 'block_1') { return; } $node = \Drupal::routeMatch()->getParameter('node'); if (!$node instanceof NodeInterface) { return; } $tid = $node->field_tags->target_id; $parents = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadAllParents($tid); $args[0] = $parents ? array_key_last($parents) : $tid; }
需要修改的代码片段
$tid = $node->field_tags->target_id; $parents = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadAllParents($tid); $args[0] = $parents ? array_key_last($parents) : $tid;
修改方案
loadAllParents()返回的数组是从当前术语到最顶层父术语的关联数组(键为术语ID,值为术语实体)。要获取倒数第二级父术语,需根据层级数量判断取值:
修改后的代码片段:
$tid = $node->field_tags->target_id; // 加载当前术语的所有父级(包含自身) $parents = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadAllParents($tid); // 移除当前术语本身,只保留父级链条 unset($parents[$tid]); if (!empty($parents)) { // 将父级数组转为索引数组,方便按位置取值 $parent_ids = array_keys($parents); // 如果父级数量>=2,取倒数第二个(即倒数第二级父术语);否则取唯一的父级 $target_tid = count($parent_ids) >= 2 ? $parent_ids[count($parent_ids) - 2] : $parent_ids[0]; $args[0] = $target_tid; } else { // 没有父级,用当前术语ID $args[0] = $tid; }
代码说明
unset($parents[$tid]):移除数组中的当前术语,仅保留父级链条array_keys($parents):提取父术语ID列表,转为索引数组便于按位置取值- 层级判断:根据父级数量决定取倒数第二个或唯一父级,确保拿到倒数第二级术语ID
- 无父级时 fallback 到当前术语ID,避免空值导致视图出错
内容的提问来源于stack exchange,提问作者francky
相关产品推荐
相关产品推荐

