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


24

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

回答:


22

VBOには「PHPコードの実行」アクションがあります。実行して、「node_save($ entity);」と入力します (引用符なし)テキストボックスに。タイムアウトを処理しながら、それはトリックを行います。


1
ああ、はるかに速い:)
クライブ

5
VBOには「コンテンツを保存」するオプションがあり、独自のPHPを作成しなくても同じことができます。
stevenw00

「コンテンツを保存」オプションが見つかりませんでしたが、あなたが言及したphpメソッドはうまくいきました!ありがとう!
hockey2112

phpとvboの両方のメソッドを試してみましたが成功しませんでした。私のユースケースでは、手動保存のみがテーブルフィールドのラベルを適切に更新します。奇妙な...
Bisonbleu

14

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

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

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

set_time_limit(0);

12

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

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

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


5
200,000以上のノードで完全に機能しました。バッチを処理します。develモジュールを有効にしている場合は、上記のコードをページ '/ devel / php'に貼り付けることができます
-2pha

1
素晴らしいソリューション、バックグラウンドで実行されるため、タイムアウトの可能性やサイトのパフォーマンス
ダニエルウォーターズ

5

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

Drupalはすべてのノードをスクリーンショットから再保存します


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

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


2

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.