check_and_publish_future_post() は、予約投稿(状態が「予約済み」の投稿)を、公開の時刻を過ぎていれば公開する関数です。予約投稿を保存すると、WordPress は publish_future_post という予定を WP-Cron に登録し、時刻が来るとこの関数が呼ばれます。自分で呼ぶのは、時刻を過ぎても公開されずに残った予約投稿を、手で公開したいときです。
書き方
check_and_publish_future_post( int|WP_Post $post ): void
$post:投稿の ID か、投稿のオブジェクト(WP_Post)- 戻り値:なし。公開できたかは、呼んだあとに
get_post_status()で確認する
関数の中でしていること
- 投稿が見つからなければ、何もしない
- 状態が
future(予約済み)でなければ、何もしない。下書きや公開済みの投稿は変わらない - 公開の時刻(
post_date_gmt)がまだ先なら、公開せずに、その時刻でpublish_future_postの予定を登録し直す - 時刻を過ぎていれば、
wp_publish_post()で公開する
使い方の例
作業環境(WordPress 7.1.3)で試した結果を、コメントに書いています。試しの投稿は、確認したあと削除しています。
時刻の前と後で呼んでみる
<?php // 1 時間後に公開する予約投稿(ID は 123 とする) var_dump( get_post_status( 123 ) ); // string(6) "future" // 時刻の前に呼ぶ:公開されず、予定が同じ時刻で登録し直される check_and_publish_future_post( 123 ); var_dump( get_post_status( 123 ) ); // string(6) "future" var_dump( wp_next_scheduled( 'publish_future_post', array( 123 ) ) ); // int(1793941599)(公開の時刻。作業環境で試したときの値) // 時刻を過ぎてから呼ぶ:公開され、予定も消える check_and_publish_future_post( 123 ); var_dump( get_post_status( 123 ) ); // string(7) "publish" var_dump( wp_next_scheduled( 'publish_future_post', array( 123 ) ) ); // bool(false)
下書きの投稿や、ない ID を渡しても、エラーにはならず、何も変わりませんでした。公開済みの投稿にもう一度呼んでも、状態は publish のままです。
時刻を過ぎた予約投稿をまとめて公開する
WP-Cron が動かず、予約投稿が「予約済み」のまま残っているときに、管理画面を開いたタイミングでまとめて公開する例です。公開してよいかの判断は、この関数に任せています。
functions.php
<?php
// 管理画面を開いたら、時刻を過ぎた予約投稿を公開する(WP-Cron が直るまでのつなぎ)
add_action( 'admin_init', 'my_publish_missed_posts' );
function my_publish_missed_posts() {
if ( wp_doing_ajax() || ! current_user_can( 'publish_posts' ) ) {
return;
}
$posts = get_posts( array(
'post_status' => 'future',
'orderby' => 'date',
'order' => 'ASC',
'numberposts' => 20,
) );
foreach ( $posts as $post ) {
if ( strtotime( $post->post_date_gmt . ' GMT' ) <= time() ) {
check_and_publish_future_post( $post );
}
}
}
get_posts() は、post_type を書かないと投稿(post)だけを探します。固定ページやカスタム投稿の予約も対象にするなら、post_type に足してください。
気をつけること
- この関数は、予約投稿を公開するだけです。予約投稿が時刻どおりに出ない原因(WP-Cron が動いていない・wp-cron.php への接続がふさがれている・タイムゾーンのずれ)は直りません。
- 時刻の判断は
post_date_gmt(世界標準時)で行います。「設定」→「一般」のタイムゾーンがずれていると、思っていた時刻とずれて公開されます。 - 公開すると、
publish_postなどの公開のときのフックが動きます。公開したら SNS に送る・メールを送るプラグインがあると、まとめて公開したぶん、まとめて動きます。 - 公開すると、
publish_future_postの予定は WordPress が消します(作業環境で、公開のあとwp_next_scheduled()が false に戻ることを確認しました)。自分でwp_clear_scheduled_hook()を呼ぶ必要はありません。 - WordPress の中から呼ばれる関数です。テーマやプラグインから呼ぶときは、上の例のように時刻を過ぎた予約投稿だけに絞り、何度も公開の処理が走らないようにします。

