Comment puis-je réenregistrer rapidement tous les nœuds de mon site (pour déclencher une règle qui s'active lors de la mise à jour du contenu)?

24

J'ai fait quelques erreurs en configurant un certain type de contenu sur mon site. Pour corriger ces erreurs, j'ai créé une règle qui effectue certaines actions "lorsque le contenu existant est mis à jour". Cependant, je ne veux pas parcourir mon site et enregistrer à nouveau tous les nœuds manuellement un par un. Existe-t-il un moyen d'utiliser des règles ou des vues en bloc pour sauvegarder rapidement tous les nœuds?

Patrick Kenny
la source

Réponses:

22

VBO a une action "Exécuter du code PHP". Exécutez-le et entrez "node_save ($ entity);" (sans les guillemets) dans la zone de texte. Cela fera l'affaire, tout en gérant les délais d'attente pour vous.

Bojan Zivanovic
la source
1
Ahh, beaucoup plus vite :)
Clive
5
Il y a une option dans VBO pour "Enregistrer le contenu", qui fera de même sans avoir à écrire votre propre PHP.
stevenw00
Je n'ai pas trouvé l'option "Enregistrer le contenu", mais la méthode php que vous avez mentionnée a très bien fonctionné! Merci!
hockey2112
J'ai essayé les méthodes php et vbo sans succès. Dans mon cas, seul un enregistrement manuel met correctement à jour les étiquettes d'un champ de table. Étrange ...
Bisonbleu
14

Je ne connais pas les règles ou le VBO, mais vous pouvez utiliser un extrait de code court pour obtenir le même résultat:

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

Si vous avez beaucoup de nœuds qui pourraient prendre un peu de temps, donc si votre serveur le permet, ce serait une bonne idée de prolonger la limite de temps au début de ce code, peut-être à un nombre illimité s'il s'agit d'un seul :

set_time_limit(0);
Clive
la source
12

Vous pouvez utiliser la fonction node_mass_update () :

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

C'est très bien car vous n'avez pas besoin de vous soucier du délai. Le processus par lots pour la mise à jour des nœuds démarre automatiquement s'il y a plus de 10 nœuds.

milkovsky
la source
5
Fonctionne parfaitement sur plus de 200 000 nœuds. Gère le lot pour vous. Si le module devel est activé, vous pouvez simplement coller le code ci-dessus sur la page '/ devel / php'
2pha
1
Brilliant solution, runs in the background so no chance of a timeout or kill a sites performance
Daniel Waters
5

Mise à jour: je viens de créer Resave All Nodes . Pour l'instant, il ne contient qu'un formulaire pour déclencher un processus par lots pour réenregistrer tous les nœuds des types de nœuds sélectionnés. Actuellement en alpha. J'ai l'intention d'ajouter une commande Drush (bêta) et quelques tests (stables) également.

Drupal Resave All Nodes formulaire capture d'écran


Il y a des nœuds de réenregistrement . Il est destiné à être utilisé sur les courses cron. Mais vous pouvez également le déclencher manuellement. Choisissez simplement les nœuds de type de contenu à réenregistrer.

Avant de pouvoir exécuter la réenregistrement manuel en appuyant sur "Réenregistrer les nœuds maintenant", vous devez une fois "Enregistrer la configuration" (choisissez un type de cron et un type de contenu).

leymannx
la source
2

Accédez à admin / content et filtrez par votre type de contenu - publié uniquement. Sélectionnez tout, puis sélectionnez «modifier la valeur» dans la liste déroulante des opérations. Cliquez sur «exécuter». Sur la page suivante, sélectionnez «statut» dans les propriétés et laissez publié. Cliquez sur 'suivant' Tous les nœuds publiés seront réenregistrés sans changement.

Répétez l'opération pour les nœuds non publiés (mais sélectionnez non publié comme propriété).

Robb Davis
la source