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

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

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

Задний план:

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

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

Спасибо за ваши подсказки, ответы или идеи ... очень признательны!


person Ironflood    schedule 16.05.2012    source источник


Ответы (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);

?>
person Eugene Fidelin    schedule 30.08.2012
comment
Никогда не используйте variable_set() для временного изменения значения во время запроса - условия гонки могут вас легко укусить. Вместо этого установите и восстановите $conf['pathauto_update_action'], который не может повлиять на другие запросы. - person phils; 14.11.2013

Если вы сделаете это в 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);
?>
person Charlie Schliesser    schedule 10.01.2013

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

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

person fmitchell    schedule 16.05.2012

Этот код основан на коде Евгения Фиделина, но использует глобальную переменную $ 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;
person energee    schedule 30.03.2016