Как программно массово создавать / обновлять псевдонимы в 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 или в 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);
?>
Убедитесь, что для этого пакета установлена переменная для pathauto.
Имя переменной - pathauto_[entity]_[bundle]_pattern, поэтому pathauto_node_[bundle]_pattern
Этот код основан на Eugene Fidelin's, но использует глобальный $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;