はじめに
以下をCocoonで実現します。
通常、記事に現在の日付より未来の日付を指定すると、「予約投稿」として扱われます。
しかし、未来の日付の記事を予約投稿ではなく、通常の「公開済み」として保存します。
この記事では、この方法について説明します。
完成イメージ

実装手順
以下のコードを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');
}
});
さいごに
今回紹介した方法を使えば、未来の日付の記事でも「予約投稿」ではなく、通常の「公開済み」として表示させることが可能です。
この方法を使って、投稿が予約投稿として扱われず、指定した未来の日付で公開できるようになります。


