WordPressで記事公開時と更新時のフックを使い分ける方法

Post Status Transitions

記事公開時のフックは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フックを使っても実現できるとの情報をいただいた。

以下にサンプルコードを。

add_action( 'transition_post_status', 'myfunction', 10, 3 );
function myfunction( $new_status, $old_status, $post ) {
    // $new_status, $old_status を使って分岐
    // 〜 処理 〜
}
  • ブックマーク
  • Feedly

この記事を書いた人

キタジマタカシ

長崎在住、フリーランスのWordPress テーマ / プラグインデベロッパー。 多数のプロダクトをオープンソースで開発・公開しています。現在は WordPress 有料テーマ Snow Monkey を開発・販売しています。