Как программно массовое создание / обновление псевдонимов в Drupal 7

как программно массовые URL-адреса узлов псевдонимов, используя только ядро drupal 7 (с его отличным пакетным API !)?

мой вопрос на самом деле как сделать drupal использовать и распознавать псевдонимы, хранящиеся в таблице url_alias?

Справочная информация:

проект, над которым я работаю, имеет более 200 000 узлов (Drupal 7), и псевдонимирование url-адреса системы по умолчанию всех этих узлов буквально займет годы с модулем pathauto (10 псевдонимов каждые 20 минут). Я попытался все, чтобы улучшить эти характеристики, но не удалось (пробовали разные серверы, разные оптимизации mysql, разные шаблоны).

У меня уже есть функции пакетного процесса, они псевдонимы 200,000 узлов за 20 минут, они создают чистые псевдонимы, хранящиеся в таблице "url_alias". Я потратил много времени, глядя на код pathauto, но не мог найти или понять, как модуль давал drupal приказ распознавать массовые обновленные пути.

Спасибо за подсказки, ответы или идеи..высоко ценится!

4 ответов


вот функция, которая обновит псевдонимы для всех узлов указанного типа

<?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);

?>

Если вы сделаете это в hook_node_update или в правиле или что-то еще, новый узел $не будет доступен для других модулей, таких как 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);
?>

проверьте, чтобы убедиться, что переменная установлена для этого пакета для pathauto.

имя переменной-pathauto_[entity]_[bundle]_pattern, поэтому pathauto_node [bundle] _pattern


этот код основан на Eugene Fidelin, но использует $conf global вместо наборов переменных.

  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;