2017-10-24

【WordPressネタ】publish_post アクションフックと post_meta

株式会社qnote > 投稿一覧 > ブログ > 【WordPressネタ】publish_post アクションフックと post_meta

たまには、WordPress の話しなど。

WordPressには、「アクションフック」といって、特定の操作、データ状態の遷移をトリガに処理を走らせることができる便利な機能があります。たとえば、記事の公開時にメールを飛ばしたければ、以下のように書きます。

 

{code type=php}
function post_notice($post_id) {
mb_send_mail('xxxxxx@xxxxxx', '投稿のお知らせ', '記事ID='.$post_id);
}
add_action('publish_post', 'post_notice', 10, 2);
{/code}

 

「publish_post」アクションフックで「投稿が公開された時点」をトリガとして、「post_notice」関数をコールするわけですね。

 

しかし、このフックにはひとつ重大な問題が。
publish_postフックで関数が実行される時点では、その投稿のカスタムフィールド=wp_postmetaテーブルのデータはまだ書き込まれていないのです。

 

なので、post_notice関数の中でカスタムフィールドを使うようなケースや、カスタムフィールドを頼りにクエリを発行するようなケースでは、特に新規投稿時に期待どおりの動作をしてくれない、ということがあります。

 

本当はpublish_postとは別に、完全に投稿とカスタムフィールド、添付(アタッチメント)のデータが登録完了した時点のアクションフックがあればよいのですが、ドキュメントを見る限りでは見当たりません。

 

そこで、とりあえず「カスタムフィールドが保存された時点」をトリガとする場合、「updated_postmeta」というアクションフックが使えます。

 

このへんの動作はブラックボックスなので、「あれ?!publish_postフックが動作しない!」と勘違いすることが多いです。
実際にはpublish_postフックはちゃんと呼ばれていて、単に投稿データが完全に保存されきっていないだけなのですが、プログラマの感覚と仕様にズレがあるので、けっこうハマりやすいポイントだったりしますね。他にいい方法があれば是非教えてください(笑)。

 

p.s.
台風一過、大荒れの七里ヶ浜。qnote湘南オフィス(つまり私の自宅)も停電したりで大変でした。

Recommend

Contact

お問い合わせ

ご要望など、お気軽にお問い合わせください。