WordPressテックラボ

wp_insert_post_dataを使って予約投稿機能を無効にする

WordPressには、設定日に記事を公開するための予約投稿機能があり、公開日を未来の日付にするだけで有効となります。
便利な機能ですが、この公開日を投稿予約の日時としてではなく、たとえば商品の発売日などに使っている場合、予約投稿機能により発売日まで記事が公開されなくなります。発売日前に記事を公開するには、この機能をオフにする必要があります。

予約投稿機能をオフにする方法はいろいろありますが、今回は functions.php にフィルタフックを追加する方法を紹介します。
使うフィルタフックは wp_insert_post_data で、このフックはデータベースへの保存前に実行されます。

// 未来投稿機能を無効にする
// 引数: フォームに入力した情報, DB に保存されている情報(新規投稿では空)
function af_disable_auto_posting( $data, $postarr ) {
	// 投稿タイプがpostで、記事のステータスがfutureの場合
	if ( $data['post_type'] == 'post' && $data['post_status'] == 'future' )
		$data['post_status'] = 'publish';	// 記事のステータスを publish に変更
	return $data;
};

// 引数:フィルタフックの名前, コールバック関数の名前, 実行する順序, 引数の数
add_filter( 'wp_insert_post_data', 'af_disable_auto_posting', 10, 2 );

上記では、add_filter で wp_insert_post_data をフィルタフックとして登録し、コールバック関数として af_disable_auto_posting を指定しています。
これで、記事の更新時に、af_disable_auto_posting 関数が呼び出されるようになります。

wp_insert_post_data により、記事の投稿時に af_disable_auto_posting 関数が呼び出されるようになりました。
あとは、関数内でどの投稿時に処理したいのか条件を設定したり、データの変更を行います。

今回は、投稿タイプがpostの時と記事のステータスがfutureの場合に、記事ステータスを publish に変更しています。
第1引数の$dataを書き換えることで、投稿されたフォームの内容を変更することができます。

ここでは書き換えの条件として、通常の投稿タイプを指定しているので、カスタム投稿などは対象外となります。
たとえば特定のカスタム投稿(ここでは仮にpost_item)に対して行いたい場合は下記のように変更します。

// 特定のカスタム投稿(post_item)のみ処理する
if ( $data['post_type'] == 'post_item' && $data['post_status'] == 'future' )
....

下記のように、記事タイトルや本文などの変更処理を追加することも可能です。

記事タイトルを変更する処理を追加
if ( $data['post_type'] == 'post' && $data['post_status'] == 'future' ) {
	$data['post_status'] = 'publish';
	// 【追加】記事タイトルに文言を追加
	$data['post_title'] = '【test】'.$data['post_title'];
}

$dataには下記のようなフォームの内容が連想配列として格納されています。

  • post_author
  • post_date
  • post_date_gmt
  • post_content
  • post_content_filtered
  • post_title
  • post_excerpt
  • post_status
  • post_type
  • comment_status
  • ping_status
  • post_password
  • post_name
  • to_ping
  • pinged
  • post_modified
  • post_modified_gmt
  • post_parent
  • menu_order
  • guid

$postarrには下記のようなDBの内容が連想配列として格納されています。

  • post_status
  • post_type
  • post_author
  • ping_status
  • post_parent
  • menu_order
  • to_ping
  • pinged
  • post_password
  • guid
  • post_content_filtered
  • post_excerpt
  • import_id
  • post_content
  • post_title
  • ID
  • post_date
  • post_date_gmt
  • comment_status
  • post_name
  • post_modified
  • post_modified_gmt
  • post_mime_type
  • comment_count
  • ancestors
  • post_category
  • tags_input
  • filter

関連記事