この投稿は3年半前の記事です。 情報が古くなっている可能性があるので、その点ご了承ください。
2013 年 6 月 13 日 1,380日前)
2,893文字 (読了時間7分)

SPONSORED LINK

ペ・ヨンジュン(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からあったらしいので、なんというかまあ、「やっと会えたね」という感じでした。

冬のソナタ 韓国KBSノーカット完全版 ブルーレイBOX [Blu-ray]

冬のソナタ 韓国KBSノーカット完全版 ブルーレイBOX [Blu-ray] [DVD]

価格¥ 38,880

監督ユン・ソクホ

出演者ペ・ヨンジュン

出版社ソニー・ピクチャーズエンタテインメント

商品カテゴリーBlu-ray

Supported by amazon Product Advertising API

 

フォローしてください

ここで会ったのもなにかの縁。
高橋文樹.comの最新情報を見逃さないためにもフォローをお願いします。
めったに送らないメルマガもあります。

SPONSORED LINK

この記事について

この記事はが2013 年 6 月 13 日にプログラミングの記事として公開しました。

高橋先生の電子書籍

高橋先生の電子書籍

Amazonで電子書籍も買えます。

好きな言葉

変革者というのは、世界の残忍さをそのまま受け入れ、そして一段と激しい残忍さで世界に応酬できる人間のことを言うのだと思う。

— ミシェル・ウエルベック

高橋先生の処女作

『途中下車』高橋文樹

2001年幻冬舎NET学生文学大賞受賞作です。

Web制作やります

Web制作やります

Web制作のご依頼は株式会社破滅派へ

不定期メルマガ

高橋文樹.comでは、不定期でニュースレターを配信しています。滅多に送らないので是非購読してください。

高橋文樹.comではプライバシーポリシーに準じて登録情報を取り扱います。