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)

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.