web-dev-qa-db-ja.com

サイトのすべてのノードをすばやく再保存するにはどうすればよいですか(コンテンツの更新時にアクティブになるルールをトリガーするため)?

私のサイトで特定のコンテンツタイプを設定するときにいくつかの間違いをしました。これらの間違いを修正するために、「既存のコンテンツが更新されたときに」いくつかのアクションを実行するルールを作成しました。しかし、自分のサイトを調べて、手動ですべてのノードを1つずつ保存したくありません。ルールまたはビューの一括操作を使用してすべてのノードをすばやく再保存する方法はありますか?

23
Patrick Kenny

VBOには、「PHPコードの実行)アクションがあります。実行して、テキストボックスに「node_save($ entity);」(引用符なし)と入力してください。これにより、あなたのためのタイムアウト。

22
Bojan Zivanovic

ルールやVBOについては知りませんが、短いコードスニペットを使用して同じ結果を得ることができます。

$nids = db_query('SELECT nid FROM {node}')->fetchCol();
foreach (node_load_multiple($nids) as $node) {
  node_save($node);
}

少し時間がかかる可能性があるノードがたくさんあるので、サーバーで許可されている場合は、そのコードの開始時に制限時間を延長することをお勧めします。 :

set_time_limit(0);
14
Clive

node_mass_update() 関数を使用できます。

module_load_include('inc', 'node', 'node.admin');
$nids = db_query('SELECT nid FROM {node}')->fetchCol();
node_mass_update($nids, array());

時間制限を気にする必要がないのでとても良いです。ノードが10個を超えると、ノード更新のバッチプロセスが自動的に開始されます。

12
milkovsky

更新: Resave All Nodes を作成しました。現時点では、選択したノードタイプのすべてのノードを再保存するバッチプロセスをトリガーするフォームのみが含まれています。現在アルファ版です。 Drushコマンド(ベータ版)といくつかのテスト(安定版)も追加する予定です。

Drupal Resave All Nodes form screenshot


Resave Nodes があります。これは、cronの実行で使用することを目的としています。ただし、手動でトリガーすることもできます。再保存するコンテンツタイプのノードを選択するだけです。

「今すぐノードを再保存」をクリックして手動で再保存を実行する前に、「設定を保存」する必要があります(cronタイプとコンテンツタイプを選択します)。

5
leymannx

Admin/contentに移動し、コンテンツタイプでフィルタリングします-公開済みのみ。すべて選択し、操作ドロップダウンから[値の変更]を選択します。 「実行」をクリックします。次のページで、プロパティから「ステータス」を選択し、公開したままにします。 「次へ」をクリックします。公開されたすべてのノードが変更なしで再保存されます。

非公開ノードに対して繰り返します(ただし、プロパティとして非公開を選択します)。

2
Robb Davis