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

如何限制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:15:39