Drupal中如何为同一个节点自动生成2个URL别名?
Drupal同一节点自动生成多URL别名的实现方案
实现方式判定
Pathauto 模块原生仅支持单节点生成1个默认URL别名,无法通过后台配置直接实现单节点多别名自动生成,该需求必须通过自定义代码扩展完成。
具体实现步骤
- 前置准备:确认已启用Pathauto、Path核心模块,拥有可正常运行的自定义功能模块
- 通过Drupal实体钩子监听节点的新增、更新事件,在Pathauto生成默认别名后,自动插入第二条自定义规则的别名即可
- 参考代码(放置在自定义模块的
.module文件中,以内容类型article为例,可按需修改适配):
<?php use Drupal\node\NodeInterface; /** * Implements hook_node_insert(). * 节点新增时自动生成第二个别名 */ function your_custom_module_node_insert(NodeInterface $node) { // 仅对指定内容类型生效,可修改为你需要的内容类型机器名 if ($node->bundle() !== 'article') { return; } // 生成第二个别名,规则可按业务需求自行调整,示例规则为/second-prefix/[节点ID] $second_alias = '/second-prefix/' . $node->id(); // 保存别名到系统别名表,关联到当前节点的默认系统路径 \Drupal::service('path.alias_storage')->save( '/node/' . $node->id(), $second_alias, $node->language()->getId() ); } /** * Implements hook_node_update(). * 节点更新时同步更新第二个别名 */ function your_custom_module_node_update(NodeInterface $node) { if ($node->bundle() !== 'article') { return; } $langcode = $node->language()->getId(); $system_path = '/node/' . $node->id(); // 删除旧的自定义别名避免重复 $existing_aliases = \Drupal::service('path.alias_storage')->loadByProperties([ 'source' => $system_path, 'langcode' => $langcode, ]); foreach ($existing_aliases as $alias) { // 仅删除我们自定义前缀的别名,不影响Pathauto生成的默认别名 if (str_starts_with($alias['alias'], '/second-prefix/')) { \Drupal::service('path.alias_storage')->delete($alias); } } // 插入新的自定义别名 $new_second_alias = '/second-prefix/' . $node->id(); \Drupal::service('path.alias_storage')->save($system_path, $new_second_alias, $langcode); }
- 代码部署完成后清空Drupal缓存,后续新增/更新对应内容类型的节点时,就会自动生成2个可访问的URL别名
额外注意事项
- 多别名场景建议配置其中一个地址为canonical标签,避免搜索引擎判定为重复内容影响收录
- 上述代码的别名生成规则、生效内容类型都可以根据业务需求自由调整,支持生成更多数量的别名
内容的提问来源于stack exchange,提问作者RitikaDesai
相关产品推荐
相关产品推荐

