如何在Drupal 7中以编程方式批量创建/更新别名

时间:2012-05-16 09:19:38

标签: drupal drupal-7 pathauto drupal-path-aliases

如何通过仅使用drupal 7核心(使用它的优秀批处理API)以编程方式批量别名节点URL?

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

背景:

我工作的项目有超过200,000个节点(Drupal 7),并且所有这些节点的系统默认URL别名将花费数年时间来使用pathauto模块(每20分钟10个别名)。我尝试了一切来改善这些性能但失败了(尝试了不同的服务器,不同的mysql优化,不同的模式)。

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

感谢您的提示,答案或想法......非常感谢!

4 个答案:

答案 0 :(得分:8)

此函数将更新指定类型

的所有节点的别名
<?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);

?>

答案 1 :(得分:2)

如果您在hook_node_update或Rule或其他内容中执行此操作,则新的$节点将无法用于其他模块,如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);
?>

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

此代码基于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;