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

16

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)
Jim Gaslingson
la source
Bien que ce ne soit pas le plus propre, c'est l'un des plus rapides.
Oskar Calvo
3
Le problème fondamental de cette méthode est qu'elle ne se met pas à jour node_revision, ce qui entraînera une incohérence.
artfulrobot

Réponses:

21

L'utilisation 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 aucune 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);
}
Yusef
la source
3
Hein? db_queryest également une méthode Drupal 7. Prend simplement différents arguments.
@andrewtweber, oui maintenant c'est une partie de drupal mais regardez la première version de drupal 7 et revendiquez ensuite !!!
Yusef
Quel crochet dois-je utiliser? J'ai ajouté à l'intérieur hook_node_submit mais je prends une erreur.
sokratis
@sokratis dans hook_form_alter ajoutez un submitgestionnaire personnalisé à partir de là dans le gestionnaire de soumission personnalisé, vous pouvez utiliser quelque chose comme ça.
Yusef
N'oubliez pas les citations. $ node-> status = "1";
Selwyn Polit
8

lorsque vous utilisez node_load (), node_load_multiple () pour charger un (plusieurs) noad (s), il existe de nombreux hooks qui seraient invoqués par des 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 entraîneront 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.

B Ravanbakhsh
la source