如何以编程方式发布未发布的节点


15

我有一些未发布的节点,这些节点有其节点ID。如何以编程方式发布它们?使用以下查询在自定义模块中实现此目标是否正确?

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

尽管它不是最干净的一种,但却是速度最快的一种。
奥斯卡·卡尔沃

3
此方法的根本问题是它不会更新node_revision,因此会导致不一致。
artfulrobot 2014年

Answers:


20

使用db_query()是Drupal 6方法,在Drupal 7中没有使用。为完成您的工作,我建议使用此代码(无需任何手动查询)。

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

如果您有更多的节点ID,并且想要发布所有这些节点,则可以使用以下代码。

$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
??db_query也是Drupal 7方法。只是采用不同的论点。

@andrewtweber,是的,现在它是drupal的一部分,但请查看drupal 7的第一个版本,然后声明!!!
Yusef 2013年

我应该在哪个钩子上使用?我在hook_node_submit中添加了内容,但出现错误。有帮助吗?
sokratis

@sokratis在hook_form_alter中submit向您添加一个自定义处理程序,然后在自定义提交处理程序中,yu可以使用类似这样的东西。
优素福2015年

不要忘记引号。$ node-> status =“ 1”;
Selwyn Polit

7

当您使用node_load(),node_load_multiple()加载一个(多个)noad时,模块会调用很多钩子,例如hook_node_loadhook_node_operationshook_node_preparehook_node_accesse。但是通过直接在drupal模式上执行查询,这些挂钩将被忽略,并导致许多问题。

查询是:

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

如果由于可用内存不足而导致node_load()或node_load_multiple()不起作用,则只需使用上面的代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.