Drupal で cron ジョブからノードを作成するにはどうすればよいですか?
質問
drupal 4.7 のカスタム モジュールで、ノード オブジェクトをハックして、それを node_save($node) に渡してノードを作成しました。このハックは drupal 6 では機能しなくなったようです。このハックは修正できると確信していますが、フォームなしでノードを作成する標準的なソリューションがあるかどうかに興味があります。この場合、データは別の Web サイトのカスタム フィードから取得されます。
解決
ノードを実用的に作成するための標準 API を知りません。しかし、これは私があなたがやろうとしていることを実行するモジュールを構築することから収集したものです。
- 重要なフィールドが設定されていることを確認してください。uid、名前、タイプ、言語、タイトル、本文、フィルター (「
node_add()
そしてnode_form()
) - ノードを通過させる
node_object_prepare()
そのため、他のモジュールが $node オブジェクトに追加できるようになります。
他のヒント
これを実現するためのベスト プラクティス方法は、drupal_execute を利用することです。drupal_execute は、システムが期待するとおりに動作するように、標準の検証と基本的なノード操作を実行します。drupal_execute には癖があり、単なる node_save よりも直観的ではありませんが、Drupal 6 では、次の方法で drupal_execute を利用できます。
$form_id = 'xxxx_node_form'; // where xxxx is the node type
$form_state = array();
$form_state['values']['type'] = 'xxxx'; // same as above
$form_state['values']['title'] = 'My Node Title';
// ... repeat for all fields that you need to save
// this is required to get node form submits to work correctly
$form_state['submit_handlers'] = array('node_form_submit');
$node = new stdClass();
// I don't believe anything is required here, though
// fields did seem to be required in D5
drupal_execute($form_id, $form_state, $node);
node_save() は Drupal 6 でも引き続き正常に動作します。これを機能させるには、いくつかの特定のデータを適切に配置する必要があります。
$node = new stdClass();
$node->type = 'story';
$node->title = 'This is a title';
$node->body = 'This is the body.';
$node->teaser = 'This is the teaser.';
$node->uid = 1;
$node->status = 1;
$node->promote = 1;
node_save($node);
「ステータス」と「プロモート」は見落としがちです。これらを設定しないと、ノードは非公開およびプロモートされないままになり、コンテンツ管理画面に移動した場合にのみ表示されます。
私が発見したもう 1 つの答えは、 例 Drupal コアの blogapi モジュールから。それがコアにあるという事実は、それが将来のバージョンでも動作し続けるという確信を少し与えてくれます。
上記には良い答えがいくつかありますが、取り込まれたフィード項目をノードに変換する具体的な例では、simplefeed モジュールを使用するアプローチを取ることもできます (http://wwww.drupal.org/project/simplefeed)。このモジュールは、simplepie エンジンを使用してフィードを取り込み、各フィードの個々のアイテムをノードに変換します。これが cron からノードを作成する問題に具体的に対処しているわけではないことは承知していますが、問題全体に対するより簡単な解決策になる可能性があります。