WordPressのささいな差異に苛まされ

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
ロックマン2のクイックマンです

この記事を三行にまとめると

original_post_statusがPOSTデータに入ってきません
自分の記事をアピールしまくってるウザヤロー
クイック編集をする時には気をつけてくれぃって話です
てぇした話じゃねぇんですがうっかり引っかけられちまったので情報をさらしときやす。てやんでぃべらぼうめ。

Wordpressには記事を編集する時、通常の編集の他に投稿一覧ページからクイック編集することもできます。でも通常の編集とクイック編集では、更新ボタンを押した時にPOSTされるデータが微妙に違う。そのせいで予期せぬ動きをしてしまうことがあるので、今日はそいつをちと見て欲しいなと。



記事更新のフック

例えば記事を新規に公開、あるいは更新するタイミングで何らかの処理を発動させる場合を考えてみます。ちなみにあかつきのお宿は、記事を新規に公開した時にFacebookとTwitterに自動的に「更新したぞー」ってつぶやくようになっています。

記事を公開したタイミングで何かするには「publish_post」というアクションフックを使います。

//フックを設定
add_action('publish_post', 'tweet');

//呼び出される関数
function tweet() {
  //SNSにつぶやく
}

「add_action()」という関数を使うとフックのタイミングとその時に呼びたいメソッドを設定できるので、これで記事を公開した時にSNSに何かをつぶやくことができます。

ただしこのpublish_postというフックは、新規の公開と更新のいずれのタイミングでも発動するようになっています。つまり上記の例だと新規公開時だけでなく、記事を編集する時も毎回SNSにつぶやいてしまうのです。公開済みの記事をちょっと修正するだけでもつぶやいちゃうのはちょっとアレですよね。まあ記事を拡散するために頻繁に何度もツイートしたいってんなら良いけどさ。

とにかく、新規公開の時だけ処理を行いたいなら新規か編集かの判定が必要です。

これがベストなやり方かどうかは分からないんですけど、僕の場合は記事を公開、あるいは更新した時に、POSTされるデータの中の「original_post_status」という項目を見て判断しています。

//フックを設定
add_action('publish_post', 'tweet');

//呼び出される関数
function tweet() {
  if($_POST['original_post_status'] != 'publish') {
    //SNSにつぶやく
  }
}

original_post_statusには現在の記事の状態が入っています。記事が公開済みの状態なら「publish」、下書きの状態なら「draft」となっています。「auto-draft」の場合もあるかな。

上記のコードは、記事の状態がpublishでなければSNSにつぶやくという処理にしています。つまり公開済みの状態でなければってことですね。これで公開済みの記事を編集して更新する場合は処理をスキップできます。

しいて言うなら、公開済みの記事を一度下書きの状態に戻して再度公開した場合はスキップできないんですが、お宿の場合は僕が個人でやってるサイトだから運用対処で良いだろうってことでなあなあにしてます。

いいのよ、個人サイトなんだからそれくらいの適当さはあっても。



クイック編集

つい先日気づいたんですが、公開済みの記事をクイック編集する場合、このoriginal_post_statusがPOSTデータに入ってきません。だから上記のコードだと、クイック編集の場合は更新するたびにSNSにつぶやいちゃうんですね。今までクイック編集って使ったことなかったから完全に見落としてたわ。

クイック編集の場合は、original_post_statusではなく「post_status」に記事の状態が入っているっぽいんだけど、困ったことにこのpost_statusは、新規で公開する時もpublishになっちゃうみたいなのよね。だからさっきと同じ要領で新規と更新を区別することができない。

//フックを設定
add_action('publish_post', 'tweet');

//呼び出される関数
function tweet() {
  if($_POST['post_status'] != 'publish') {
    //新規も更新もここには来ない
  }
}

僕の場合は新規の公開をクイック編集で行うことはないだろうから、isset()でoriginal_post_statusがあるかどうかを見て、あった時に状態がpublishでなければ処理を行うみたいにしても問題はないんですけど。

//フックを設定
add_action('publish_post', 'tweet');

//呼び出される関数
function tweet() {
  if(isset($_POST['original_post_status']) && $_POST['original_post_status'] != 'publish') {
    //SNSにつぶやく
  }
}

こんな感じでね。でもクイック編集も多用するなら、これだけでは不十分かもしれないです。

もしかしたらもっと良いアクションフックがあるのかもしれないですが、すみません、そこまでは調査してないです。だから今回の話はここまで。






先日、記事の一部を新しいカテゴリに移し替えたんですけど、その時にクイック編集でぱぱーっと一気に更新したんですよ。そんときに、まさかこんなことになってるなんて思わなかったから、FacebookやTwitterに十数回連続で「新しい記事を追加したぞ〜」ってつぶやかれてしまってて、何かものすげー自分の記事をアピールしまくってるウザヤローになっちゃってました。まあ特にいいねもリツイートもされてなかったんで、誰も気にしてなかったっぽいからさり気なく削除して何事もなかったことにしておきました。

べ、別に悲しくなんかねーし。めったにいいねやリツイートされないのはいつものことだし(マジで)

とにかくだ。もしpublish_postのアクションフックでoriginal_post_statusを見て処理を分岐してるような場合は、クイック編集をする時には気をつけてくれぃって話です。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください