web-dev-qa-db-fra.com

Comment publier des nœuds non publiés par programme

J'ai des nœuds non publiés, pour lesquels j'ai leurs ID de nœud. Comment puis-je les publier par programme? Est-il correct de le réaliser dans un module personnalisé en utilisant une requête comme la suivante?

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

L'utilisation de db_query() est une méthode Drupal 6, qui n'est pas utilisée dans Drupal 7. Pour réaliser votre travail, je suggère ce code (sans toute requête manuelle).

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

Si vous avez plus d'ID de nœud et que vous souhaitez publier tous ces nœuds, vous pouvez utiliser le code suivant.

$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);
}
20
Yusef

lorsque vous utilisez node_load (), node_load_multiple () pour le chargement a(multiple) noad (s), il existe de nombreux hooks appelés par les modules, tels que hook_node_load , hook_node_operations, hook_node_prepare, hook_node_accesse. Mais en effectuant une requête directement sur le schéma drupal), ces crochets seront ignorés et conduit à de nombreux problèmes.

Les requêtes sont:

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));

Utilisez simplement le code ci-dessus si node_load () ou node_load_multiple () ne fonctionne pas en raison de la saturation de la mémoire disponible.

7
B Ravanbakhsh