publish_postやpublish_pageを使わずに、transition_post_statusで記事公開時のみアクションさせる方法のメモ。
実現したいこと
- WordPressで、記事公開時に特定のアクションを実行する
- 投稿ページと固定ページ両方ともが対象
- 更新時には動作させない
サンプル
function checkPublished( $new_status, $old_status, $post ) {
if ( $old_status != 'publish' && $new_status == 'publish' ) {
// 投稿ステータスが公開以外から公開へ変化するとき実行する処理を記載
// $postからいろいろ取得できるので、記事IDが欲しい場合などは以下のようにする
// $ID = $post->ID;
}
}
add_action( 'transition_post_status', 'checkPublished', 10, 3 );
上記の記述だけで投稿ページも固定ページも対応可能です。
どちらか一方だけの場合は$postからpost_typeを取得すれば分岐できると思います(最初からpublish_postなどを使った方が良い可能性も考えられますが)。
参考記事
上記2つ目のコーデックスから$new_statusと$old_statusに使える値を引用します。
- new – 以前のステータスが存在しない状態。このステータスを含むフックは、”save_post” が実行されるとき毎回実行されます。
- publish – 投稿や固定ページが「公開済」。
- pending – 「承認待ち」の投稿。
- draft – 「下書き」の投稿。
- auto-draft – 「自動保存」。作成されたばかりの投稿で、コンテンツがない。
- future – 「予約済」。未来に公開を予定されている投稿。
- private – 「非公開」。ログインしていないユーザーには表示されない。
- inherit – 「継承」。リビジョンまたは添付ファイル(get_children() を参照のこと)。
- trash – 「ゴミ箱」にある投稿(バージョン 2.9 で追加)。
ちょっと気になるのは、上記の値では「一度公開してから下書きに戻し、再度公開した場合を特定できない」という点です。
以下のカスタムステータスを使えばいけるのかなとも思いましたが無理そうでしたが、私の目的は「記事公開時に、特定ファイルがなければ作成する」だっため対象ファイルの有無による条件分岐で対応しました。
結び
投稿タイプと状態がまとめられてスッキリとした記述ができました。
2人がこの記事を評価
役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。
連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。