WordPressで投稿に未来の日付を設定すると、自動的に「予約投稿」となり、その日時まで非公開になります。しかし実際の運用では、「未来の日付だけど今すぐ公開したい」というニーズがあります。

 

例えば、以下のような場面で必要になります:

  • イベント告知で開催日を投稿日にしたいが、すぐに公開したい
  • クライアントにプレビューを見せるために未来日付で公開状態にしたい
  • 時系列での表示順序を調整しながらも即座に公開したい

今回は、通常の「予約投稿」機能を残しつつ、「未来日付での即座公開」も選択できるカスタマイズをご紹介します。

解決したい課題

従来の問題点:

  • 未来日付 = 自動的に予約投稿になる
  • 未来日付で即座に公開するには、HTMLで直接書くかプラグインが必要
  • 「予約投稿」と「未来日付即座公開」を使い分けできない

理想的な運用:

  • 通常の予約投稿:設定日時まで非公開 → 自動公開
  • 先行公開:未来日付だが即座に公開状態
  • 投稿編集画面で簡単に使い分けができる

実装方法

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

<?php
/* 未来日付設定時に「公開」ボタンを追加する */
function add_publish_button_for_future_dates() {
  echo '<script>
jQuery(document).ready(function($) {
  //日付変更のOKボタンがクリックされた時の処理
  $(document).on("click", "#misc-publishing-actions .hide-if-no-js.button", function() {
    
    //少し遅延させてWordPressの処理が完了してから実行
    setTimeout(function() {
      
      //「予約投稿」ボタンが表示されているかチェック
      if ($("#publish").val() === "予約投稿") {
        
        //既に「公開」ボタンが追加されていなければ追加
        if ($("#publish_now").length === 0) {
          
          //「予約投稿」ボタンの後に「公開」ボタンを追加
          $("#publishing-action").append(
            \'&nbsp;\' +
            \'<input name="original_publish_now" type="hidden" id="original_publish_now" value="公開">\' +
            \'<input type="submit" name="publish_now" id="publish_now" class="button button-primary button-large" value="公開">\'
          );
        }
      } else {
        //「予約投稿」ボタンでない場合は「公開」ボタンを削除
        $("#publish_now, #original_publish_now").remove();
        $("#publishing-action br:last, #publishing-action p:last").remove();
      }
      
    }, 100);
  });
  
  //ページ読み込み時にも同様のチェックを実行
  function checkAndAddPublishButton() {
    if ($("#publish").val() === "予約投稿") {
      if ($("#publish_now").length === 0) {
        $("#publishing-action").append(
          \'&nbsp;\' +
          \'<input name="original_publish_now" type="hidden" id="original_publish_now" value="公開">\' +
          \'<input type="submit" name="publish_now" id="publish_now" class="button button-primary button-large" value="公開">\'
        );
      }
    }
  }
  
  //初期読み込み時
  checkAndAddPublishButton();
  
});
</script>';
}
add_action('admin_footer-post.php', 'add_publish_button_for_future_dates');
add_action('admin_footer-post-new.php', 'add_publish_button_for_future_dates');

//「公開」ボタンがクリックされた時の処理
function handle_publish_now_submission($data, $postarr) {

  //「公開」ボタン(publish_now)がクリックされた場合
  if (isset($_POST['publish_now'])) {

    //投稿タイプのチェック
    if (($data['post_type'] == 'post' || $data['post_type'] == 'inform')) {

      //未来日付でも強制的に公開状態にする
      $data['post_status'] = 'publish';
    }
  }

  return $data;
}
add_filter('wp_insert_post_data', 'handle_publish_now_submission', 10, 2);

//投稿一覧での表示状態を調整
function display_future_publish_state($post_states, $post) {
  //未来日付でpublishステータスの投稿に「先行公開」表示を追加
  if ($post->post_status == 'publish' && strtotime($post->post_date) > current_time('timestamp')) {
    $post_states['future_publish'] = '先行公開';
  }
  return $post_states;
}
add_filter('display_post_states', 'display_future_publish_state', 10, 2);

使い方

1. 通常の予約投稿(従来通り)

  1. 投稿編集画面で未来の日付を設定
  2. 「予約投稿」ボタンをクリック
  3. 設定日時まで非公開 → 自動的に公開

2. 未来日付での即座公開(新機能)

  1. 投稿編集画面で未来の日付を設定
  2. 「予約投稿」と「公開」の2つのボタンが表示される
  3. 「公開」ボタンをクリック → 未来日付のまま即座に公開

 


実装のポイント

安全な設計思想

  • 既存のpublishステータスを活用:カスタム投稿ステータスを作らず、WordPressの標準機能を尊重
  • 既存機能を壊さない:通常の予約投稿機能はそのまま維持
  • プラグイン互換性:他のプラグインとの競合リスクを最小化

UI/UXの工夫

  • 必要な時だけ表示:「予約投稿」ボタンが表示される時のみ「公開」ボタンも表示
  • 直感的な操作:2つのボタンが並ぶことで選択肢が明確
  • 視覚的な区別:投稿一覧で「先行公開」ラベルを表示

技術的な特徴

  • 動的ボタン追加:JavaScriptで必要な時だけボタンを追加
  • 重複防止:既にボタンがある場合は追加しない制御
  • 適切なタイミング:WordPressの処理完了後に実行

動作確認

実装後は以下の動作を確認してください:

✅ 確認項目

  • 未来日付設定時に「予約投稿」「公開」の2つのボタンが表示される
  • 「予約投稿」クリック → 従来通りの予約投稿動作
  • 「公開」クリック → 未来日付で即座に公開される
  • 投稿一覧で「先行公開」ラベルが表示される
  • 現在日付や過去日付では「公開」ボタンが表示されない

活用シーン

このカスタマイズにより、以下のような柔軟な運用が可能になります:

企業サイト

  • プレスリリースを発表日で公開、事前にクライアント確認
  • イベント告知を開催日付で即座に公開

ブログサイト

  • 記事の公開順序をコントロールしながら即座公開
  • 連載記事の日付調整と公開タイミングの分離

メディアサイト

  • ニュース記事の時系列表示と公開タイミングの独立制御
  • 特集記事の日付設定と公開状態の柔軟な管理

まとめ

WordPressの既存機能を尊重しながら、「予約投稿」と「未来日付即座公開」を併用できるカスタマイズをご紹介しました。

このカスタマイズの利点:

  • 既存の予約投稿機能を維持
  • 新しい「先行公開」機能を追加
  • 直感的で分かりやすいUI
  • プラグインとの互換性を重視した安全な実装

複雑なプラグインを導入することなく、シンプルなコードで実現できるため、多くのWordPressサイトで活用していただけると思います。
投稿の公開タイミングと表示順序を柔軟にコントロールしたい場合は、ぜひお試しください。