0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【WordPress】未来の日付の投稿を公開状態にするカスタマイズ(「予約投稿」と併用)

0
Posted at

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サイトで活用していただけると思います。
投稿の公開タイミングと表示順序を柔軟にコントロールしたい場合は、ぜひお試しください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?