ARCHIVE

◆次のエラーに対応(2025-04-07 2:49 PM)

  • 既存の投稿を下書きに変更した場合に意図せず投稿が公開となる事象(誤動作)
  • =下書きとして保存・更新したはずの投稿が、日時指定がないのに status フィールドが draft のままでも公開されてしまう

誤動作がおこる作業:

  • ①下書き投稿を修正して下書きとして更新>Cron イベントのタイミングで公開(誤動作)
  • ②下書き投稿を更新のみおこなう>Cron イベントのタイミングで公開(誤動作)
  • ③公開中の投稿を下書きに変更して更新>Cron イベントのタイミングで公開(誤動作)

正しい動作の作業

  • ①投稿を下書きに変更。加えて日時指定して更新>Cron イベントのタイミングで公開(正常)
  • ②新規作成した下書き状態の投稿(更新を伴う作業はなし)>投稿は下書きの状態(正常)
  • ③下書き投稿をプレビュー>投稿は下書きの状態(正常)

原因の予測

  • Cron フック check_acf_scheduled_posts 内のクエリ条件が緩すぎて、「日時未設定(空欄)」の投稿も誤って対象になっている

修正案

functions.php>イベントフック処理

// イベントフック処理
function check_and_publish_scheduled_posts() {
$current_time = current_time('timestamp');
$query = new WP_Query(array(
'post_type' => 'post',
'post_status' => 'draft',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'status',
'value' => 'draft',
'compare' => '=',
),
array(
'key' => 'scheduled_publish_date',
'value' => '',
'compare' => '!=',
),
array(
'key' => 'scheduled_publish_date',
'value' => date('Y-m-d H:i:s', $current_time),
'compare' => '<=',
'type' => 'CHAR',
),
),
));

if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$post_id = get_the_ID();
$publish_date = get_post_meta($post_id, 'scheduled_publish_date', true);
$publish_date_gmt = get_gmt_from_date($publish_date);

wp_update_post(array(
'ID' => $post_id,
'post_status' => 'publish',
'post_date' => $publish_date,
'post_date_gmt' => $publish_date_gmt,
));

update_field('status', 'publish', $post_id);
delete_post_meta($post_id, 'scheduled_publish_date');
}
}
wp_reset_postdata();
}
add_action('check_acf_scheduled_posts', 'check_and_publish_scheduled_posts');

修正後の動作チェック項目(再テスト)

操作内容 期待される動作
下書きのまま日時未指定で更新 公開されない
公開中の投稿を下書きに変更、日時未指定 公開されない
日時をセットした下書き 指定時刻に公開される
日時が過去のまま更新 すぐに公開される

◆現在の最新(2025-03-11-1500)

この仕組みの概要:

  • 新規投稿:フロントエンドで投稿作成(ドラフト)
  • アーカイブドラフトから当該投稿を開いて編集
  • 公開もしくは予約投稿を選んで更新(update)
    • 公開=即公開
    • 予約投稿=
      • 1時間ごとにおこなわれるCron イベント(check_acf_scheduled_posts)機能
      • 毎時00分に公開

※今回の追加機能

  • 投稿関連のフロントエンド画面をボタンのコラプス(下に出る)に改造
  • 固定ページにフロントエンドからのプレビュー機能

修正店(GTP

  • ① scheduled_publish_date の meta_query の問題
  • ② post_date の設定ミス
  • ③ wp_schedule_event の二重登録

改善点(GTP

  • ① acf_form() の return 設定
  • ② redirect_scheduled_posts() で is_singular() の前に !is_admin() を追加
  • ③ add_noindex_for_scheduled_posts() の適用範囲を wp_head 以外にも拡張

エラー発生

  • ※予約の公開が実行されていない件を解決する
  • 動作確認
  • 動きが硬かったよう

動いているの確認:2025-03-11-11:00