7

drupal 7コアのみを使用してエイリアスノードURLをプログラムで一括処理する方法(優れたバッチAPIを使用!)?

私の質問は、実際にdrupal を使用して url_alias テーブルに保存されているエイリアスを認識する方法です。

バックグラウンド:

私が取り組んでいるプロジェクトには 200,000 を超えるノード (Drupal 7) があり、これらすべてのノードのシステムの既定の URL をエイリアシングするには、pathauto モジュールを使用すると文字通り何年もかかります (20 分ごとに 10 のエイリアス)。これらのパフォーマンスを改善するためにあらゆることを試みましたが、失敗しました (別のサーバー、別の mysql 最適化、別のパターンを試しました)。

私はすでにバッチ処理機能を準備しており、20 分で 200,000 ノードにエイリアスを作成し、テーブル「url_alias」に格納されたクリーンなエイリアスを作成します。私は多くの時間をかけて pathauto コードを調べましたが、モジュールがどのように drupal に一括更新されたパスを認識する命令を与えているのかを見つけたり、理解したりすることができませんでした。

ヒント、回答、またはアイデアをありがとう..どうもありがとうございました!

4

4 に答える 4

9

指定されたタイプのすべてのノードのエイリアスを更新する関数は次のとおりです

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

?>
于 2012-08-30T15:44:12.453 に答える
2

これを 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);
?>
于 2013-01-10T21:13:52.997 に答える
1

pathauto のそのバンドルに変数が設定されていることを確認してください。

変数名は pathauto_[entity]_[bundle]_pattern なので、pathauto_node_[bundle]_pattern

于 2012-05-16T21:49:03.763 に答える