WordPressのTwitter Toolsプラグインでdaily digestが多重投稿される不具合

以下の修正について、私自身は試していませんが、試した方によるとどうもこれでは修正されないようです。

twitter-toolsのdaily digestが時々二重投稿されるので、ダイジェスト投稿を止めました。
README | alexking.org

二重投稿以前に、そもそもダイジェストの必要性を感じなくなってきたので止めたってのもありますが、プログラマ的に不具合を放置するのも気持ち悪いので一応ソースを軽く見てみました。

で、ざっと眺めた感じだとダイジェスト投稿処理中の排他制御が甘いのが原因な気がします。
たくさんtwitterに投稿した日に限って起こっていた現象なので、おそらくビンゴでしょう。
アクセス数の多いサイトなら3重4重投稿になる可能性もあるかもしれません。

手っ取り早く修正するならnextDateFieldの更新をdo_digest_post()諸々の呼び出しより前に済ませておいて、呼び出しに失敗したら元に戻すって感じですかね。
排他制御としては穴がありますが、ここまで頻繁には起こらなくなるはずです。

PHP:
  1. function ping_digest($nextDateField, $lastDateField, $title, $defaultDuration) {
  2.  
  3.         $next = get_option($nextDateField);
  4.        
  5.         if ($next) {       
  6.             $next = $this->validateDate($next);
  7.             $rightNow = time();
  8.             if ($rightNow>= $next) {
  9.                 // ↓これ追加(ここでダイジェスト投稿より先に次の更新日を入れちゃう)
  10.                 update_option($nextDateField, $next + $defaultDuration);
  11.                 $start = get_option($lastDateField);
  12.                 $start = $this->validateDate($start, $rightNow - $defaultDuration);
  13.                 if ($this->do_digest_post($start, $next, $title)) {
  14.                     update_option($lastDateField, $rightNow);
  15.                     update_option($nextDateField, $next + $defaultDuration);
  16.                 } else {
  17.                     update_option($lastDateField, null);
  18.                     // ↓これも追加(ダイジェスト投稿に失敗したら前のに戻す)
  19.                     update_option($nextDateField, $next );
  20.                 }
  21.             }
  22.         }
  23.     }

これでうまく動いたって方はご連絡ください(殴


関連記事