fbpx

メニュー

WordPressで投稿を公開したときにつぶやきたい

高橋文樹 高橋文樹

この投稿は 11年 前に公開されました。いまではもう無効になった内容を含んでいるかもしれないことをご了承ください。
ペ・ヨンジュン(Wikipedia)
ペ・ヨンジュン(Wikipedia)

WordPressで投稿を公開したときになにかをやりたいと思うことはよくありますね。

  • 「投稿を公開したよー!」ってTwitterに呟きたい
  • 投稿があったことを別のサイト(Movable Typeで作った他のサイト)に通知したい
  • はじめて投稿を公開したときにだけポイントを加算したい

僕が管理している破滅派でも、誰かが作品を投稿したら、Twitterの破滅派公式アカウントがそれに反応して呟くということをやっていました。

が、これが予約投稿のときに動かないことが判明、その後色々修正すると動くことはわかるのですが、グローバル変数だよりで気持ち悪く、どうしたもんかなーと思っていたところです。本日便利なフックを発見。それが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...)

すべての投稿を見る

高橋文樹ニュースレター

高橋文樹が最近の活動報告、サイトでパブリックにできない情報などをお伝えするメーリングリストです。 滅多に送りませんので、ぜひご登録お願いいたします。 お得なダウンロードコンテンツなども計画中です。