予約投稿を無効化して未来の投稿を表示する方法

Cocoonカスタマイズ集
この記事は約5分で読めます。
記事内に広告が含まれています。

完成イメージ

実装手順

以下のコードをfunctions.phpに追加します。

add_filter('wp_insert_post_data', function ($post, $wp_error) {
  if ($post['post_status'] == 'future') {
    $post['post_status'] = 'publish';
  }

  return $post;
}, 10, 2);

拡張:投稿ごとに「予約/即公開」を切り替える方法

前章では、未来日付の投稿を全て「公開済み」として扱う方法を紹介しました。
しかし運用によっては、特定の記事だけ未来日でも即公開したいというケースもあります。

そこで本章では、投稿ごとに「予約投稿」か「即公開」かを選択できるようにする方法を紹介します。
これにより、通常は予約投稿を使いつつ、必要な記事だけ柔軟に公開方法を切り替えられるようになります。

完成イメージ

実装手順

以下のコードをfunctions.phpに追加します。

// メタボックスを追加
add_action('add_meta_boxes', function () {
  add_meta_box(
    'future_publish',
    '未来投稿の公開',
    'render_future_publish',
    'post',
    'side',
    'high'
  );
});


/**
 * メタボックスの入力フォームを出力
 *
 * @param WP_Post $post 投稿オブジェクト
 * @return void
 */
if (!function_exists('render_future_publish')):
function render_future_publish($post) {
  $value = get_post_meta($post->ID, 'my_future_publish', true);

  wp_nonce_field('future_publish_action', 'future_publish_nonce');
  ?>
  <label>
    <input type="checkbox" name="future_publish" value="publish" <?php checked($value, 'publish'); ?>>
    未来の投稿を今すぐ公開する
  </label>
  <p class="howto">チェックなしの場合は予約投稿になります。</p>
  <?php
}
endif;


// 投稿保存時にステータスを制御
add_filter('wp_insert_post_data', function ($data, $postarr) {
  // 自動保存チェック
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
    return $data;
  }

  // nonceチェック
  $nonce = $_POST['future_publish_nonce'] ?? '';
  if (!wp_verify_nonce($nonce, 'future_publish_action')) {
    return $data;
  }

  // 投稿日時をtimestampに変換
  $post_time = strtotime($data['post_date']);
  $now = current_time('timestamp');

  // 未来日時以外は処理対象外
  if ($post_time <= $now) {
    return $data;
  }

  // チェック状態を確認
  $future_publish = isset($_POST['future_publish']);

  // チェックONは即公開
  if ($future_publish) {
    $data['post_status'] = 'publish';
    return $data;
  }

  // チェックOFFは予約投稿
  if (in_array($data['post_status'], ['publish', 'future'], true)) {
    $data['post_status'] = 'future';
  }

  return $data;
}, 10, 2);


// 投稿データを保存
add_action('save_post', function ($post_id) {
  // nonceチェック
  $nonce = $_POST['future_publish_nonce'] ?? '';
  if (!wp_verify_nonce($nonce, 'future_publish_action')) {
    return;
  }

  // 自動保存チェック
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
    return;
  }

  // リビジョンは除外
  if (wp_is_post_revision($post_id)) {
    return;
  }

  // 権限チェック
  if (!current_user_can('edit_post', $post_id)) {
    return;
  }

  if (isset($_POST['future_publish'])) {
    update_post_meta($post_id, 'my_future_publish', 'publish');
  } else {
    delete_post_meta($post_id, 'my_future_publish');
  }
});

さいごに

今回紹介した方法を使えば、未来の日付の記事でも「予約投稿」ではなく、通常の「公開済み」として表示させることが可能です。
この方法を使って、投稿が予約投稿として扱われず、指定した未来の日付で公開できるようになります。

タイトルとURLをコピーしました