Wie kann ich schnell alle Knoten auf meiner Site erneut speichern (um eine Regel auszulösen, die bei der Inhaltsaktualisierung aktiviert wird)?

24

Ich habe einige Fehler beim Konfigurieren eines bestimmten Inhaltstyps auf meiner Website gemacht. Um diese Fehler zu beheben, habe ich eine Regel erstellt, die einige Aktionen ausführt, "wenn vorhandene Inhalte aktualisiert werden". Ich möchte meine Site jedoch nicht durchsuchen und alle Knoten einzeln manuell speichern. Gibt es eine Möglichkeit, mithilfe von Massenoperationen für Regeln oder Ansichten alle Knoten schnell wieder zu speichern?

Patrick Kenny
quelle

Antworten:

22

VBO hat eine Aktion "PHP-Code ausführen". Führen Sie es aus und geben Sie "node_save ($ entity)" ein. (ohne die Anführungszeichen) im Textfeld. Das erledigt den Trick, während die Zeitüberschreitungen für Sie behandelt werden.

Bojan Zivanovic
quelle
1
Ahh, viel schneller :)
Clive
5
In VBO gibt es eine Option zum "Speichern von Inhalten", die dasselbe macht, ohne dass Sie Ihr eigenes PHP schreiben müssen.
stevenw00
Ich konnte die Option "Inhalt speichern" nicht finden, aber die von Ihnen erwähnte PHP-Methode hat hervorragend funktioniert! Vielen Dank!
Hockey2112
Versuchte sowohl PHP als auch VBO Methoden ohne Erfolg. In meinem Fall werden die Beschriftungen für ein Tabellenfeld nur durch manuelles Speichern ordnungsgemäß aktualisiert. Seltsam ...
Bisonbleu
14

Ich kenne Regeln oder VBO nicht, aber Sie könnten einen kurzen Codeausschnitt verwenden, um das gleiche Ergebnis zu erzielen:

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

Wenn Sie viele Knoten haben, die möglicherweise etwas Zeit in Anspruch nehmen. Wenn Ihr Server dies zulässt, ist es eine gute Idee, das Zeitlimit zu Beginn dieses Codes zu verlängern, möglicherweise auf unbegrenzt, wenn dies einmalig ist :

set_time_limit(0);
Clive
quelle
12

Sie können die Funktion node_mass_update () verwenden:

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

Es ist sehr gut, da Sie sich nicht um das Zeitlimit kümmern müssen. Der Stapelprozess für die Knotenaktualisierung startet automatisch, wenn mehr als 10 Knoten vorhanden sind.

milkovsky
quelle
5
Funktionierte perfekt auf über 200.000 Knoten. Erledigt die Charge für Sie. Wenn Sie das Entwicklungsmodul aktiviert haben, können Sie den obigen Code einfach auf der Seite '/ devel / php'
2pha
1
Brillante Lösung, läuft im Hintergrund, so dass keine Chance auf ein Timeout oder das Beenden einer Website-Leistung
Daniel Waters
5

Update: Ich habe gerade Resave All Nodes erstellt . Derzeit enthält es nur ein Formular zum Auslösen eines Stapelprozesses zum erneuten Speichern aller Knoten ausgewählter Knotentypen. Derzeit in Alpha. Ich habe vor, einen Drush-Befehl (Beta) und einige Tests (Stable) hinzuzufügen.

Drupal Resave All Nodes-Formular-Screenshot


Es gibt Resave-Knoten . Es ist für Cron Runs gedacht. Sie können es aber auch manuell auslösen. Wählen Sie einfach, welche Knoten des Inhaltstyps erneut gespeichert werden sollen.

Bevor Sie den manuellen Neustart ausführen können, indem Sie auf "Knoten jetzt neu speichern" klicken, müssen Sie einmal "Konfiguration speichern" (einen Cron-Typ und einen Inhaltstyp auswählen).

leymannx
quelle
2

Gehen Sie zu admin / content und filtern Sie nach Ihrem Inhaltstyp - nur veröffentlicht. Wählen Sie alle aus und wählen Sie dann "Wert ändern" aus der Dropdown-Liste. Klicken Sie auf "Ausführen". Wählen Sie auf der nächsten Seite in den Eigenschaften die Option "Status" aus und lassen Sie sie veröffentlicht. Klicken Sie auf "Weiter". Alle veröffentlichten Knoten werden ohne Änderungen erneut gespeichert.

Wiederholen Sie diesen Vorgang für nicht veröffentlichte Knoten (wählen Sie jedoch nicht veröffentlicht als Eigenschaft aus).

Robb Davis
quelle