WordPressで投稿を公開したときになにかをやりたいと思うことはよくありますね。
- 「投稿を公開したよー!」ってTwitterに呟きたい
- 投稿があったことを別のサイト(Movable Typeで作った他のサイト)に通知したい
- はじめて投稿を公開したときにだけポイントを加算したい
僕が管理している破滅派でも、誰かが作品を投稿したら、Twitterの破滅派公式アカウントがそれに反応して呟くということをやっていました。
高橋文樹さんの安否です。「破滅したりもしたけれど、私はげんきです」 http://t.co/SZpF4qlY
— 破滅派@文フリ京都う-10 (@hametuha) September 14, 2012
が、これが予約投稿のときに動かないことが判明、その後色々修正すると動くことはわかるのですが、グローバル変数だよりで気持ち悪く、どうしたもんかなーと思っていたところです。本日便利なフックを発見。それがtransition_post_status
さんです。こんな風に使います。
/** * 投稿が公開状態に変わったときだけポイント加算 * * @param string $new_status 新しいステータス * @param string $old_status 以前のステータス * @param object $post 該当する投稿オブジェクト */ function _my_tweet($new_status, $old_status, $post){ // 投稿タイプが新着情報(カスタム投稿タイプnews)で、 // 新しいステータスが公開だったら if($post->post_type == 'news' && $new_status == 'publish'){ switch($old_status){ case 'draft': case 'pending': case 'auto-draft': case 'future': update_twitter_status(sprint('%s を公開しました!', $post->post_title)); break; case 'private': // 非公開→公開はおそらく一度公開済みなので、 // なにもしません。 break; case 'publish': // これは起動するのかな? よくわかりません。 break; } } } // 上記の関数をアクションに登録する add_action('transition_post_status', '_my_tweet', 10, 3);ちなみに、
update_twitter_status
というのは拙作プラグインGianismの関数ですので、普通のWordPressで書いても動きません。というか、Fatal Errorになります。コピパーの方におかれましては、十分に注意してください。他のステータス変更も取れるので、色々アイデアはあるでしょう。特に、共同編集者が多い場合(自分の投稿のステータスが管理画面を見ていないときに変わる可能性があるサイト)に有用です。
勢いあまってCodexも訳しておいたので、迷子の人も減ることでしょう。Gianismのマニュアルもなおさんといかんとですよ。
save_postにさよなら
WordPressには投稿を保存する
save_post
というアクションフックがあって、ググるとこればっかりヒットするのですが、このフック自体に「投稿のステータス遷移」を関知する機能はありません。一応、やろうと思えばやれるはずなのですが……
function _my_tweet($post_id, $post){ if(wp_is_post_autodraft($post) || wp_is_post_revision){ // リビジョンまたは自動保存だったらなにもしない return; } if($post->post_status == 'publish' && $_POST['original_post_status'] != 'publish'){ // 元のステータスがpublishではなく、今のステータスがpublishだったら公開 do_stuff(); } } add_action('save_post', '_my_tweet', 10, 2);この方法の問題点は次の通りです。
- 「投稿が公開されたらつぶやく」という単純な機能を持つべき関数の分岐処理において、グローバルオブジェクトを参照している
- POSTで投げてくるのは管理画面だけで、iOSアプリ(XML-RPC)やWP Cronによる投稿保存ではたぶん動かない。今後、保存方法の手段が増えない保証はない。
というわけで、この方法はあんまりおすすめしません。というより、save_post
は思ったよりも色々な場所で使われてるので、フックをかけるときは注意が必要です。意図しない動作になる可能性がすごく高いです。
和歌山県に住むWordPressに詳しい中年男性も初見では無限ループにはまったりしているので、注意しましょう。
ちなみにtransition_post_status
を発見したのは、たまたまsave_postにバグのあるWordPressの修正を試みていた最中だったからです。Codexによると2.3からあったらしいので、なんというかまあ、「やっと会えたね」という感じでした。
[429] [429] Client error: `POST https://webservices.amazon.co.jp/paapi5/getitems` resulted in a `429 Too Many Requests` response: {"__type":"com.amazon.paapi5#TooManyRequestsException","Errors":[{"Code":"TooManyRequests","Message":"The request was de (truncated...)