Как программно массовое создание / обновление псевдонимов в 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;