Como publicar nós não publicados programaticamente

16

Eu tenho alguns nós não publicados, para os quais tenho seus IDs de nós. Como publicá-los programaticamente? É correto alcançá-lo no módulo personalizado usando uma consulta como a seguinte?

db_query("UPDATE {node} SET status = 1 WHERE nid = %d", $nid)
jim gaslingson
fonte
Embora não seja o mais limpo, é um dos mais rápidos.
Oskar Calvo
3
O problema fundamental desse método é que ele não é atualizado node_revision, causando inconsistência.
Artfulrobot

Respostas:

21

O uso db_query()é um método Drupal 6, que não é usado no Drupal 7. Para realizar seu trabalho, sugiro este código (sem nenhuma 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);

Se você tiver mais ID do nó e desejar publicar todos esses nós, poderá usar o código a seguir.

$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
fonte
3
Hã? db_querytambém é um método Drupal 7. Apenas leva argumentos diferentes.
@andrewtweber, Sim, agora faz parte do drupal, mas olhe para a primeira versão do drupal 7 e depois reivindique !!!
Yusef
Qual gancho devo usar isso? Eu adicionei dentro hook_node_submit, mas estou recebendo um erro.
Sokratis # 22/15
@sokratis em hook_form_alter adicione um submitmanipulador personalizado ao seu, a partir de então, no manipulador de envio personalizado, você poderá usar algo assim.
Yusef
Não esqueça as aspas. $ node-> status = "1";
Selwyn Polit
8

quando você estiver usando node_load (), node_load_multiple () para carregar um (múltiplo) noad (s), muitos ganchos seriam chamados por módulos, como hook_node_load , hook_node_operations , hook_node_prepare , hook_node_accesse . Porém, ao executar a consulta diretamente no esquema drupal, esses ganchos serão ignorados e levarão a muitos problemas.

As consultas são:

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

Basta usar o código acima Se node_load () ou node_load_multiple () não estiver funcionando devido à falta de memória disponível.

B Ravanbakhsh
fonte