post branchで作成したブランチ記事を予約投稿する


以前紹介したWordPressのプラグインの記事『wordpress post branchプラグインを編集する』についでのネタ記事です。

post branchでブランチ記事を作成した場合、その記事が未来日時の公開設定にすると1つの記事の場合は自動的に『予約済み』→『公開済み』となるのですが、複数記事を同じように未来日時の公開設定とした場合、2つ目以降の記事が『予約済み』→『予約投稿失敗』となります。

今回は、複数のブランチ記事を予約投稿したした場合でも自動的に『予約済み』→『公開済み』にさせる編集をします。

『予約投稿失敗』となる原因

通常の場合もそうですが、『予約済み』状態が『予約投稿失敗』となる原因はいろいろあるようです。BASIC認証を管理画面(/wp-admin)配下に設定している場合、失敗する事があるそうです。

予約投稿失敗となる場合は、こちらのサイトが参考になります。SSHでwp-cron.phpを叩いてみると原因がわかる場合もあります。

wget http://example.com/wp-cron.php

『予約投稿失敗』というラベルが表示されるのは、予約記事が公開処理されずに、時間が過ぎてしまった場合に表示されるようです。

また、これから記載するプラグインの修正では、一気に予約済みを公開済みに変更する為、バッチ処理中に管理画面を開いた場合でも一部記事が『予約投稿失敗』となる現象がありましたが、こちらはバッチ処理終了後に管理画面をリロードすれば、きちんと『公開済み』となっていました。

wp post branchの修正

今回使用したのはwp post branch 2.3.2です。

修正概要

1つ目の記事はブランチ記事の予約投稿をマージできているので、そのタイミングで現在時間以前の予約投稿を一括マージさせてしまう。(数百件の処理の場合は最初の画面表示に時間がかかるデメリットがあります)

wpbs_save_post()処理をredirectさせない

wpbs_save_post()は処理の最後に管理画面へのリダイレクトと処理exitを行っているのでreturnでも返却できるように変更します。

function wpbs_save_post( $id, $post, $is_cron=false ) // 190行目辺り オプションパラメータ追加
  :       :           :         :          :          :
   wp_delete_post( $id ); // 309行目辺り
   if($is_cron) return; // ここを追記
  :       :           :         :          :          :

予約投稿→公開済み状態変更時をフックする

こちらこちらを参考にさせてもらいました。大変助かりました!公開状態変更時はtransition_post_statusというアクションフックで取得できます。プラグインソースの後ろに以下追記します。

/**
 * 記事が公開状態に変わったとき
 */
function _future_cron_publish($new_status, $old_status, $post){
     // 新しいステータスが公開だったら
     if($post->post_type == 'post' && $new_status == 'publish'){
          switch($old_status){
               case 'future':
                   $args = array( 'post_type' => 'post','post_status'=>'future', 'numberposts' => -1);
                   $posts_array = get_posts( $args );
                   foreach($posts_array as $v_post){ // 全予約投稿LOOP
                      // 日付比較し投稿済みを処理対象とする
                      // サーバ時間がGMT標準の場合は+9hourします
                      if(strtotime($v_post->post_date) < strtotime(date("Y-m-d H:i:s",strtotime("+9 hour")))){
                          wpbs_save_post($v_post->ID, $v_post, true);
                      }
                   }
                    break;
               case 'draft': // 下書き->公開
               case 'pending':  // レビュー待ち->公開
               case 'auto-draft': // 自動保存->公開
               case 'private': // 非公開->公開
                    break;
               case 'publish': // 公開->公開
                    break;
          }
     }
     return $post;
}
add_action('transition_post_status', '_future_cron_publish', 9999, 3);

余談ですが、wpbs_pre_post_update()の方で同じような修正を試みると無限LOOPに陥ります・・・。

公開処理自身でフックしてはいけないですね。。。

// やってはいけないよ
function wpbs_pre_post_update( $id , $is_call = false) { // 56行目辺り オプションパラメータ追加
  :       :           :         :          :          :
   add_post_meta($draft_id, '_wpbs_pre_post_id', $id); // 154行目辺り
   if($is_call) return; // ここを追記
  :       :           :         :          :          :

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です