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(
\' \' +
\'<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(
\' \' +
\'<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. 通常の予約投稿(従来通り)
- 投稿編集画面で未来の日付を設定
- 「予約投稿」ボタンをクリック
- 設定日時まで非公開 → 自動的に公開
2. 未来日付での即座公開(新機能)
- 投稿編集画面で未来の日付を設定
- 「予約投稿」と「公開」の2つのボタンが表示される
- 「公開」ボタンをクリック → 未来日付のまま即座に公開
実装のポイント
安全な設計思想
-
既存の
publishステータスを活用:カスタム投稿ステータスを作らず、WordPressの標準機能を尊重 - 既存機能を壊さない:通常の予約投稿機能はそのまま維持
- プラグイン互換性:他のプラグインとの競合リスクを最小化
UI/UXの工夫
- 必要な時だけ表示:「予約投稿」ボタンが表示される時のみ「公開」ボタンも表示
- 直感的な操作:2つのボタンが並ぶことで選択肢が明確
- 視覚的な区別:投稿一覧で「先行公開」ラベルを表示
技術的な特徴
- 動的ボタン追加:JavaScriptで必要な時だけボタンを追加
- 重複防止:既にボタンがある場合は追加しない制御
- 適切なタイミング:WordPressの処理完了後に実行
動作確認
実装後は以下の動作を確認してください:
✅ 確認項目
- 未来日付設定時に「予約投稿」「公開」の2つのボタンが表示される
- 「予約投稿」クリック → 従来通りの予約投稿動作
- 「公開」クリック → 未来日付で即座に公開される
- 投稿一覧で「先行公開」ラベルが表示される
- 現在日付や過去日付では「公開」ボタンが表示されない
活用シーン
このカスタマイズにより、以下のような柔軟な運用が可能になります:
企業サイト
- プレスリリースを発表日で公開、事前にクライアント確認
- イベント告知を開催日付で即座に公開
ブログサイト
- 記事の公開順序をコントロールしながら即座公開
- 連載記事の日付調整と公開タイミングの分離
メディアサイト
- ニュース記事の時系列表示と公開タイミングの独立制御
- 特集記事の日付設定と公開状態の柔軟な管理
まとめ
WordPressの既存機能を尊重しながら、「予約投稿」と「未来日付即座公開」を併用できるカスタマイズをご紹介しました。
このカスタマイズの利点:
- 既存の予約投稿機能を維持
- 新しい「先行公開」機能を追加
- 直感的で分かりやすいUI
- プラグインとの互換性を重視した安全な実装
複雑なプラグインを導入することなく、シンプルなコードで実現できるため、多くのWordPressサイトで活用していただけると思います。
投稿の公開タイミングと表示順序を柔軟にコントロールしたい場合は、ぜひお試しください。