記事公開時のフックはpublish_post?
WordPressで記事公開時に動作するフックが何か調べたところ「publish_post」を使うのがスタンダードのようだったので、publish_postフックを利用するコードを書いてみたのだが、公開したときだけでなく記事の「更新時」も処理が実行されてしまった。
公開時だけ処理をさせたかったので調べてみると、publish_postフックで呼び出す関数内で公開か更新か条件分岐させるような方法をされている方が。
publish_postフックで呼び出した関数内で、グローバル変数や$_POSTの内容をもとに条件分岐させているようだが、少し煩雑…。日本語版のCodexを見ても特にフックが載っていなかったので、半分諦め気味で英語版のCodexを覗いたところ、希望通りのフックを発見した。
Post Status Transitions
WordPressには「下書き」「公開」「レビュー待ち」などいくつかの投稿ステータスがあり、そのステータスの遷移に応じて稼働させることができるフックが用意されている。書式は次の通り。
// 書式 {$old_status}_to_{$new_status} // 例)下書き状態から公開状態になったとき add_action( 'draft_to_publish', 'my_function' );
上記のフックで利用できる投稿ステータスは以下のとおり。
ステータス名 | 内容 |
---|---|
new | 前のステータスがないとき |
publish | 公開された投稿やページ |
pending | レビュー待ちの投稿 |
draft | 下書き状態の投稿 |
auto-draft | 新しく作成された内容がない投稿 |
future | 公開予約された投稿 |
private | ログインしていないユーザーには表示されない投稿 |
inherit | リビジョンまたは添付ファイル |
trash | ゴミ箱に入っている投稿 |
従って、例えば「新規公開時に限って処理を実行したい」という場合は、{$old_status}_to_publishの形式で全てのフックを指定すれば良い。
add_action( 'new_to_publish', 'my_function' ); add_action( 'pending_to_publish', 'my_function' ); add_action( 'draft_to_publish', 'my_function' ); add_action( 'auto-draft_to_publish', 'my_function' ); add_action( 'future_to_publish', 'my_function' ); add_action( 'private_to_publish', 'my_function' );
transition_post_statusフック
@jim0912さんから、transition_post_statusフックを使っても実現できるとの情報をいただいた。
transition_post_statusフックでパラメーターの$new_status, $old_statusで条件分岐しても可 RT @inc2734: 記事書いた。/ WordPressで記事公開時と更新時のフックを使い分ける方法 http://t.co/w0sztWmW
— まがぞん (@jim0912) January 21, 2013
以下にサンプルコードを。
add_action( 'transition_post_status', 'myfunction', 10, 3 ); function myfunction( $new_status, $old_status, $post ) { // $new_status, $old_status を使って分岐 // 〜 処理 〜 }