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