Drupal批量更新Url别名

Drupal批量更新Url别名,drupal,drupal-path-aliases,Drupal,Drupal Path Aliases,我有一组节点(大约200个)需要更新url别名,因为我们更改了设置;从“site.com/things to do/title”到“site.com/guides/title” 我尝试使用VBO,但当我选择节点时,单击“更新Url别名”,然后执行,什么也没有发生 虽然我不想直接更新数据库,但我也尝试了: “更新url_别名集dst=replace(dst,'要做的事情','指南'),其中url_别名类似于'要做的事情/%” 谢谢路径自动应能解决您的问题: 它将为您提供删除现有别名并重新生成别名

我有一组节点(大约200个)需要更新url别名,因为我们更改了设置;从“site.com/things to do/title”到“site.com/guides/title”

我尝试使用VBO,但当我选择节点时,单击“更新Url别名”,然后执行,什么也没有发生

虽然我不想直接更新数据库,但我也尝试了: “更新url_别名集dst=replace(dst,'要做的事情','指南'),其中url_别名类似于'要做的事情/%”


谢谢

路径自动应能解决您的问题:


它将为您提供删除现有别名并重新生成别名的选项。

除了使用上述pathauto模块外,您还应该使用path redirect模块,以便将旧链接重定向到新创建的链接,否则旧链接将消失。
您还可以使用全局重定向-

下面是我编写的解决此问题的快速脚本。它对别名执行简单的查找和替换,然后创建重定向

您需要安装url\u别名和path\u重定向模块,这是针对Drupal 6的。这不是最干净的语法(编写速度很快),但它可以工作

$string_to_replace = "foo";
$replacement_string = "bar";

//Get an array containing all aliases that need to be updated
$query = "SELECT * from url_alias where dst like '%$string_to_replace%'";
$result = db_query($query);
$paths = array();
while ($row = db_fetch_array($result)){
  $paths[] = $row;
}

foreach($paths as $path){

  //Determine the new path
  $path['new_dst'] = str_replace($string_to_replace,$replacement_string,$path['dst']);

  //Update the existing url_alias
  $query = "UPDATE url_alias SET dst = '".$path['new_dst']."' WHERE pid = " . $path['pid'];
  $result = db_query($query);

  //Create and save a redirect
  $redirect = array(
    'source' => $path['dst'],
    'redirect' => $path['src'],
  );
  path_redirect_save($redirect);

}

我希望上面的代码能够解决这个问题。

我们已经安装了它(它已经创建了url别名),但如何让它为需要更改的特定节点重新生成别名呢?我们有1500个节点,我不想为所有节点重新生成别名。如果有这些节点的列表,可以将它们转储到php数组中,并使用它们编写快速脚本。只需调用$node=node\u load(nid);node\u save($node);在每个页面上。如何将旧别名自动重定向到新别名?如果旧别名被删除,搜索索引链接将丢失其用户,并将出现404页。反馈良好。我总是忘记安装重定向,因为我总是在不需要它们的开发系统上工作。
$nids = Drupal::entityQuery('node')
    ->condition('type', 'CONTENT_TYPE')
    ->execute();
$nodes = Node::loadMultiple($nids);

foreach($nodes as $node) {
    $node->path->pathauto = 1;
    $node->save();
}