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

記事公開時のフックは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 を使って分岐
    // 〜 処理 〜
}

MW WP Form

MW WP Form はショートコードベースのフォームプラグインです。多くの機能を持っており、例えば、多くのバリデーションルール、問い合わせデータの保存、そしてグラフ機能集計などを使用することができます。

さらに詳しく
Habakiri

Habakiri

Bootstrap ベースのシンプルな WordPress テーマ。レスポンシブ、多くのカスタマイズ機能。圧縮された CSS・JS を使用する高速化対策。Microformats 対応。Sass、クラスベースの functions.php。

さらに詳しく
basis-stylus

Basis

軽量なレスポンシブ Stylus/CSS フレームワーク。Flexbox ベースのグリッドシステム、疎結合なコンポーネント、バーティカルリズム。

さらに詳しく