最近の制作において、新規に投稿した時に別なカスタム投稿タイプも同時に追加、という動作が必要なことがありました。
ここでいくつか迷った件があったのでそれを書いてみたいと思います。
投稿時のアクションフック
WordPressで投稿する際に使えるアクションフックには以下のようなものがあります。
- edit_post
- save_post
- wp_insert_post
あと、関連のWP関数としては『wp_publish_post($id)』というのがあります。これは、引数に与えたIDの記事を公開にする関数です。これが呼び出された時には上記のアクションフックが順に呼び出されます。
最初、上記のアクションフックの中で知っていたのがedit_postとsave_postの2つだったので、まず前者を使って以下のような関数をfunctions.phpに記述しました。
function modify_movie_data($id){
$post = get_post($id);
$title = $post->post_title;
$author_id = $post->post_author;
$movie = get_post_meta($id,'movie',true);
$photo = get_post_meta($id,'photo',true);
// ここにその他の処理
}
add_action( 'edit_post', 'modify_movie_data' );
ここで、post_titleとpost_authorだけだったら問題無かったのですが、カスタムフィールドも取得しなければいけなかったため、get_post_meta関数を使う必要がありました。しかし、この時点ではカスタムフィールドの値は取得出来ず。
さらにsave_postでも試してみましたが、それでもカスタムフィールドの値は取得できませんでした。
新規投稿時にカスタムフィールドの値も取得出来るのはwp_insert_postだけ
というわけで、edit_postやsave_postなどを詳しく調べました。
調べたのは以下のサイトです。WordPressのアクションフック、フィルターフックについて調べられます。
するとここでwp_insert_postというアクションフックを発見。これは以下のような感じでedit_post、save_postと共に連続して呼び出されています。
do_action('edit_post', $post_id, $post);
do_action('save_post', $post_id, $post);
do_action('wp_insert_post', $post_id, $post);
というわけで、このアクションフックを使ってみました。
//情報更新時にユーザー情報も更新
function modify_movie_data($id){
// 処理
}
add_action( 'wp_insert_post', 'modify_movie_data' );
するとうまくいきました。
まとめ
3つのアクションフックは同じような場面で使われますが、カスタムフィールドについてはwp_insert_post時にしか取得できません。save_post時にカスタムフィールドの値が追加されているということでしょうか。
この辺やはりWordPressのソースを改めて読んでみる必要がありますね。もう少し研究を進めてみたいと思います。
また、調べていて気付いたのですが、edit_postは新規登録時には動作しないようです。なので、今回の場合には使うべきではありませんでした。この辺は難しいですね。もっと経験が必要だなと改めて思いました。
あと思ったのは、『wp_insert_post』など、WP関数とフックにも同じ名称のものが存在する場合もあるので、それも覚えておかないといけないですね。