WordPressで投稿を公開するときに記事をTwitterにツイートしたり、Slackに通知したり、はたまたWEBフックを使ってJAMStackのビルドをしたりしたいことがあります。

そのためにWordPressでは投稿ステータスが変わったタイミングで動くtransition_post_statusフックがあります。

今回はtransition_post_statusフックの使い方を紹介します。

WordPressの投稿システムは記事を即時公開したタイミングや予約投稿のときの予約時刻の後のタイミングでWP-CRONやページアクセスのタイミングで投稿のステータスが変わるようになっています。また公開中の記事を非公開にしたタイミングも投稿ステータスの変更タイミングです。

そのように投稿のステータスが変更されるタイミングでtransition_post_statusフックが呼ばれます。

transition_post_statusフック

transition_post_statusフックには以下の3つの引数をコールバック関数に渡します。

引数名説明
new_status変更後の投稿ステータスstring
old_status変更前の投稿ステータスstring
posts投稿WP_Post

この引数を使ってtransition_post_statusフックのコールバック関数作れば投稿のステータスが変わったタイミングで何かしらの処理ができるようになります。

投稿のステータスには以下のような種類があります。

ステータス説明
new以前のステータスが存在しない。新規作成のとき
publish投稿が公開済の状態
pending投稿が承認待ちの状態
draft投稿が下書きの状態
auto-draft投稿が自動保存で下書きの状態
future投稿が予約済の状態
private投稿が非公開の状態。ログイン済でないと表示されない。
inherit投稿に親が存在する状態。いわゆるリビジョンやサムネイル画像など。
trash投稿が削除されている状態

transition_post_statusフックを使ったサンプル

transition_post_statusフックを使ったサンプル関数を作ってみます。

functions.php
function publish_post_transition($new_status, $old_status, $post) {
    if ($new_status == 'publish' && $old_status != 'publish') {
        // 何かしらの処理
    }
}
add_action( 'transition_post_status', 'publish_post_transition', 10, 3);

上記のサンプルは、投稿のステータスが公開に変わったタイミングで何かしらの処理をするサンプルになります。公開以外のタイミングでは何も処理を行いません。

functions.php
function trigger_post_transition($new_status, $old_status, $post) {
    $statuses = ['publish', 'private', 'trash'];
    if ( in_array($new_status, $statuses, true)) {
        // 何かしらの処理
    }
}
add_action( 'transition_post_status', 'trigger_post_transition', 10, 3);

上記は投稿のステータスが「公開」「非公開」「ゴミ箱」に入れたタイミングで何かしらの処理をするサンプルです。公開のタイミングだけではなく非公開やゴミ箱に入れたタイミングとかにも処理ができるようになります。

まとめ

今回は、transition_post_statusフックについて紹介しました。transition_post_statusフックを使えば投稿のステータスが変わったときにいろんな処理ができます。

またtransition_post_statusフック以外にも公開ステータスが変わったタイミングで処理をしたいみたいなことができたりするのでそちらについてはまた別に紹介します。