¿Cómo puedo volver a guardar rápidamente todos los nodos en mi sitio (para activar una regla que se activa en la actualización de contenido)?

24

Cometí algunos errores al configurar un determinado tipo de contenido en mi sitio. Para corregir estos errores, hice una regla que realiza algunas acciones "cuando se actualiza el contenido existente". Sin embargo, no quiero ir a mi sitio y guardar manualmente todos los nodos nuevamente uno por uno. ¿Hay alguna manera de usar Reglas o vistas de operaciones masivas para volver a guardar rápidamente todos los nodos?

Patrick Kenny
fuente

Respuestas:

22

VBO tiene una acción "Ejecutar código PHP". Ejecútelo e ingrese "node_save ($ entity);" (sin las comillas) en el cuadro de texto. Eso hará el truco, mientras maneja los tiempos de espera por usted.

Bojan Zivanovic
fuente
1
Ahh, mucho más rápido :)
Clive
55
Hay una opción en VBO para "Guardar contenido", que hará lo mismo sin tener que escribir su propio PHP.
stevenw00
No pude encontrar la opción "Guardar contenido", ¡pero el método php que mencionaste funcionó muy bien! ¡Gracias!
hockey2112
Probé los métodos php y vbo sin éxito. En mi caso de uso, solo un Guardar manual actualiza correctamente las etiquetas para un campo de tabla. Extraño ...
Bisonbleu
14

No sé acerca de las reglas o VBO, pero podría usar un fragmento de código corto para obtener el mismo resultado:

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

Si tiene muchos nodos que pueden tomar un poco de tiempo, por lo que si su servidor lo permite, sería una buena idea extender el límite de tiempo al comienzo de ese código, tal vez a ilimitado si es único :

set_time_limit(0);
Clive
fuente
12

Puede usar la función node_mass_update () :

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

Es muy bueno ya que no necesita preocuparse por el límite de tiempo. El proceso por lotes para la actualización de nodos se iniciará automáticamente si hay más de 10 nodos.

milkovsky
fuente
55
Funcionó perfectamente en más de 200,000 nodos. Maneja el lote por ti. Si tiene habilitado el módulo de desarrollo, simplemente puede pegar el código anterior en la página '/ devel / php'
2pha
1
Solución brillante, se ejecuta en segundo plano, por lo que no hay posibilidad de un tiempo de espera o matar el rendimiento de un sitio
Daniel Waters
5

Actualización: Acabo de crear Resave All Nodes . Por ahora solo contiene un formulario para activar un proceso por lotes para volver a guardar todos los nodos de los tipos de nodo seleccionados. Actualmente en alfa. Planeo agregar un comando Drush (beta) y algunas pruebas (estables) también.

Captura de pantalla de formulario Drupal Resave All Nodes


Hay Nodos de Resave . Está destinado a usarse en ejecuciones cron. Pero también puedes activarlo manualmente. Simplemente elija qué nodos de tipo de contenido se deben volver a guardar.

Antes de que pueda ejecutar el resave manual presionando "Resave Nodes Now", debe "Guardar configuración" (elija un tipo de cron y un tipo de contenido).

leymannx
fuente
2

Vaya a admin / contenido y filtre por su tipo de contenido, solo publicado. Seleccione todo y luego seleccione "cambiar valor" del menú desplegable de operaciones. Haga clic en 'ejecutar'. En la página siguiente, seleccione 'estado' de las propiedades y déjelo publicado. Haga clic en 'siguiente'. Todos los nodos publicados se guardarán sin cambios.

Repita para nodos no publicados (pero seleccione no publicados como la propiedad).

Robb Davis
fuente