7

如何仅使用 drupal 7 核心以编程方式批量化别名节点 url(使用它很棒的批处理 API!)?

我的问题实际上是如何使用 drupal 并识别存储在 url_alias 表中的别名

背景:

我从事的项目有超过 200,000 个节点(Drupal 7),并且使用 pathauto 模块(每 20 分钟 10 个别名)为所有这些节点的系统默认 URL 设置别名实际上需要数年时间。我尝试了一切来提高这些性能,但失败了(尝试了不同的服务器、不同的 mysql 优化、不同的模式)。

我已经准备好批处理功能,它们在 20 分钟内为 200,000 个节点起别名,它们创建了存储在表“url_alias”中的干净别名。我花了很多时间查看 pathauto 代码,但无法找到或理解该模块如何为 drupal 提供识别批量更新路径的命令。

感谢您的提示、答案或想法……非常感谢!

4

4 回答 4

9

这是将更新指定类型的所有节点的别名的函数

<?php
  module_load_include('inc', 'pathauto');
  module_load_include('inc', 'pathauto.pathauto');

  // Get all nodes that need to be updated
  $query = db_select('node', 'n');
  $query->addField('n', 'nid');
  $query->condition('n.type', array('TYPE1', 'TYPE2'), 'IN');

  $nids = $query->execute()->fetchCol();

  // Save current action for new aliases and change it to delete old one.
  $alias_action = variable_get('pathauto_update_action', 0);
  variable_set('pathauto_update_action', PATHAUTO_UPDATE_ACTION_DELETE);

  pathauto_node_update_alias_multiple($nids, 'bulkupdate');

  // Restore original action for new aliases.
  variable_set('pathauto_update_action', $alias_action);

?>
于 2012-08-30T15:44:12.453 回答
2

如果您在 hook_node_update 或 Rule 或其他内容中执行此操作,则新的 $node 将无法用于其他模块,如 token、pathauto 等,因此您不会得到预期的结果。一个解决方案是重置缓存$node

<?php
// Reset the cached $node.
entity_get_controller('node')->resetCache(array($node->nid));

// Get all nids that reference this node. This is just an example.
$nids = db_query("SELECT entity_id FROM field_data_field_reference WHERE field_reference_target_id = {$node->nid}")->fetchCol();

// Include necessary Pathauto files.
module_load_include('inc', 'pathauto');
module_load_include('inc', 'pathauto.pathauto');

// Save current action for new aliases and change it to delete old one.
$alias_action = variable_get('pathauto_update_action', 0);
variable_set('pathauto_update_action', PATHAUTO_UPDATE_ACTION_DELETE);

pathauto_node_update_alias_multiple($nids, 'bulkupdate');

// Restore original action for new aliases.
variable_set('pathauto_update_action', $alias_action);

// Clear path cache. 
cache_clear_all('*', 'cache_path', TRUE);
?>
于 2013-01-10T21:13:52.997 回答
1

检查以确保为 pathauto 包设置了变量。

变量名是pathauto_[entity]_[bundle]_pattern,所以pathauto_node_[bundle]_pattern

于 2012-05-16T21:49:03.763 回答
1

此代码基于 Eugene Fidelin 的代码,但使用 $conf 全局而不是变量集。

  module_load_include('inc', 'pathauto');
  module_load_include('inc', 'pathauto.pathauto');

  // Get all nodes that need to be updated.
  $query = db_select('node', 'n');
  $query->addField('n', 'nid');
  $query->condition('n.type', array('TYPE1', 'TYPE2'), 'IN');

  $nids = $query->execute()->fetchCol();

  global $conf;
  // Store old value.
  $old_pathauto_var = $conf['pathauto_update_action'];
  // Set new value.
  $conf['pathauto_update_action'] = PATHAUTO_UPDATE_ACTION_DELETE;

  // Generate aliases.
  pathauto_node_update_alias_multiple($nids, 'bulkupdate');

  // Restore original action for new aliases.
  $conf['pathauto_update_action'] = $old_pathauto_var;
于 2016-03-30T19:52:44.053 回答