WordPressの『wp_insert_post』は、アクションフックとしてのものと関数としてのもので別々に存在しています。
もちろん完全に別なものというわけではなく、関数『wp_insert_post』の最後でアクションフックが『do_action(‘wp_insert_post’, $post_ID, $post);』として記述されています。
つまり関数『wp_insert_post』を使って投稿する→最後にアクションフック『wp_insert_post』が呼び出される、という構造になっています。同じ名称なので、間違わないように注意する必要がありますね。
で、アクションフック『wp_insert_post』についてはその部分で呼び出されるだけなので、特に言うことはないですが、関数『wp_insert_post』については300行程度(WordPress3.5において)と、結構長めの記述であり、いろいろ処理をしています。
ということで関数『wp_insert_post』について書こうかと。
とは言え、細かく書こうと思っても書ききれないので、今回は関数『wp_insert_post』内で使われているアクションフックについて書いてみたいと思います。
アクションフック『pre_post_update』
呼び出されるのは更新時のみ。渡される引数は投稿IDのみ。使う時はこんな感じです。
function post_function($post_id){
//処理
}
add_action('pre_post_update', 'post_function');
タイミングとしては、データベースに投稿が書き込まれる直前です。これの次の行で『$wpdb->update()』で、投稿をデータベースに書き込んでいます。
ちなみに、WordPressデフォルト状態でこのアクションフックに『wp_save_post_revision』という関数がフックされており、これは投稿のリビジョンを保存するものです。以下のようなコードを適切な場所に記述することで、リビジョンを保存しないように出来ます。
remove_action("pre_post_update","wp_save_post_revision");
更新時に呼び出されるアクションフック『edit_post』『post_updated』
記事更新時には『edit_post』『post_updated』というアクションフックが連続して呼び出されます。新規投稿時にはどちらも呼び出されません。
『edit_post』の引数は、1つ目が投稿ID、2つ目が投稿データ(関数『get_post』で取得するもの)。
function post_function($post_id, $post){
//処理
}
add_action('edit_post', 'post_function');
『post_updated』は、edit_postの直後に『$post_after = get_post($post_ID);』として、更新後の投稿データを$post_afterに入れた後に呼び出されます。ソースは以下のようになっています。
if ( $update ) {
do_action('edit_post', $post_ID, $post);
$post_after = get_post($post_ID);
do_action( 'post_updated', $post_ID, $post_after, $post_before);
}
引数は投稿ID、$post_afterと更新前の投稿データ$post_beforeの3つです。
function post_function($post_id, $post_after, $post_before){
//処理
}
add_action('post_updated', 'post_function');
『edit_post』については、この部分の他にwp-includes/comment.phpの関数『wp_update_comment_count_now』内でも使われています。
最後のアクションフック2つ
最後にアクションフック『save_post』とアクションフック『wp_insert_post』が連続して呼び出されます。
do_action('save_post', $post_ID, $post);
do_action('wp_insert_post', $post_ID, $post);
以前の『WordPressで新規投稿時に、別なカスタム投稿も追加する方法』という記事で、「新規投稿時、save_postにフックした場合にはカスタムフィールドが読み込めない」という状況がありましたが、これの原因はとりあえず判りません。(カスタムフィールドもここで保存されているはずなのですが・・・。)
とりあえず、新規投稿時にカスタムフィールドを読み込む必要がある場合には『wp_insert_post』を使い、それ以外の場合には『save_post』でも良いと思います。
おわりに
関数『wp_insert_post』の中では、新規投稿時には『save_post』『wp_insert_post』の2つが呼び出され、更新時には更に『pre_post_update』『pre_post_update』『post_updated』という3つが呼び出されます。
『save_post』『wp_insert_post』の2つの違いは、get_post_metaでカスタムフィールドを取得できるかどうかだと思います。(間違えているかもしれませんが・・・。)
『pre_post_update』は更新前に投稿IDのみ、『edit_post』は更新後に投稿データ付きで、『post_updated』は更新後に更新前後のデータを持つ、と覚えておくといいかもしれません。
いくつか使われているフィルターフックもいずれ書いてみたいと思います。
ピンバック: wp_insert_postに含まれるアクションフックとフィルターフック | hacknote