非公開ノードをプログラムで公開する方法


16

非公開のノードがいくつかあり、そのノードIDがあります。プログラムでそれらを公開するにはどうすればよいですか?次のようなクエリを使用してカスタムモジュールでそれを達成するのは正しいですか?

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

それは最もクリーンなものではありませんが、より高速なものの1つです。
オスカーカルボ

3
このメソッドの基本的な問題は、更新しないnode_revisionため、不整合が発生することです。
artfulrobot 14

回答:


21

を使用するの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_queryDrupal 7のメソッドでもあります。異なる引数を取ります。

@andrewtweber、はい、これはdrupalの一部ですが、drupal 7の最初のバージョンを見て、それから主張してください!!!
ユセフ

どのフックを使用しますか?hook_node_submit内に追加しましたが、エラーが発生しています。
ソクラティス

hook_form_alterの@sokratisは、カスタムsubmitハンドラーをカスタムハンドラーに追加し、カスタム送信ハンドラーでこのようなものを使用できます。
ユセフ

引用符を忘れないでください。$ node-> status = "1";
セルウィンポリト

8

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()が機能しない場合は、上記のコードを使用してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.