check_and_publish_future_post():時刻を過ぎた予約投稿を公開する(WordPress)

WordPress

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() で確認する

関数の中でしていること

  1. 投稿が見つからなければ、何もしない
  2. 状態が future(予約済み)でなければ、何もしない。下書きや公開済みの投稿は変わらない
  3. 公開の時刻(post_date_gmt)がまだ先なら、公開せずに、その時刻で publish_future_post の予定を登録し直す
  4. 時刻を過ぎていれば、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 の中から呼ばれる関数です。テーマやプラグインから呼ぶときは、上の例のように時刻を過ぎた予約投稿だけに絞り、何度も公開の処理が走らないようにします。

関係する関数

逆引きリファレンスの一覧へ