Cómo publicar nodos no publicados mediante programación


16

Tengo algunos nodos no publicados, para los cuales tengo sus ID de nodo. ¿Cómo puedo publicarlos programáticamente? ¿Es correcto lograrlo en un módulo personalizado utilizando una consulta como la siguiente?

db_query("UPDATE {node} SET status = 1 WHERE nid = %d", $nid)

Aunque no es el más limpio, es uno de los más rápidos.
Oskar Calvo

3
El problema fundamental con este método es que no se actualiza node_revision, por lo que causará inconsistencia.
artfulrobot

Respuestas:


21

El uso db_query()es un método Drupal 6, que no se usa en Drupal 7. Para lograr su trabajo, sugiero este código (sin ninguna consulta manual).

// load the node object
$node = node_load($nid);
// set status property to 1
$node->status = 1;
// re-save the node
node_save($node);

Si tiene más ID de nodo y desea publicar todos esos nodos, puede usar el siguiente código.

$nids = array();
// Load all nodes in one go for better performance.
$nodes = node_load_multiple($nids);
foreach ($nodes as $node) {
  // set status property to 1
  $node->status = 1;
  // re-save the node
  node_save($node);
}

3
¿Eh? db_queryTambién es un método Drupal 7. Solo toma diferentes argumentos.

@andrewtweber, ¡sí, ahora es parte de drupal, pero mira la primera versión de drupal 7 y luego reclama!
Yusef

¿Qué gancho usaré? He agregado dentro de hook_node_submit pero estoy tomando un error. ¿Alguna ayuda?
sokratis

@sokratis en hook_form_alter agregue un submitcontrolador personalizado a su desde entonces en el controlador de envío personalizado yu puede usar algo como esto.
Yusef

No olvides las citas. $ nodo-> estado = "1";
Selwyn Polit

8

cuando utiliza node_load (), node_load_multiple () para cargar un (múltiple) nodo (s), los módulos invocarán muchos ganchos, como hook_node_load , hook_node_operations , hook_node_prepare , hook_node_accesse . Pero al realizar consultas directamente en el esquema de drupal, esos ganchos serán ignorados y generará muchos problemas.

Las consultas son:

db_query("UPDATE {node} SET `status` = '1' WHERE `nid` =:nid ;"
    ,array(':nid'=>$node->nid));

db_query("UPDATE {node_revision} SET `status` = '1' WHERE `nid` =:nid AND  `vid` =:vid;"
    ,array(':nid'=>$node->nid,'vid'=> $node->vid));

Simplemente use el código anterior si node_load () o node_load_multiple () no funciona debido a la falta de memoria disponible.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.