WP_Queryの「post_status=any」は「trash」と「auto-draft」を含まないようです。

 

株式会社オンラインの金沢です。

 

今回の記事は、WordPressのサブクエリを取得できる「WP_Query」の使用に関するメモになります。

「WP_Query」は引数に配列でパラメータを指定することで、自由にクエリを取得することができます。次のような形でよく使います。

 

$query = new WP_Query( array(
	'post_type'      => 'custom-post',
	'post_status'    => 'publish',
	'posts_per_page' => 10,
) );
while( $query->have_posts() ) {
	$query->the_post();

	// ループ内処理

}
wp_reset_postdata();

 

今回注目したいのは、パラメータの「post_status」です。表のページでは公開済みの投稿だけを取得したい場合が多いですので、「publish」と指定することがほとんどです。しかし、管理画面で用いるときは、非公開のものなど、他のステータスでも取得したい場合があります。

そこで、「WP_Query」のパラメータをCodexで調べてみましたところ、「any」と指定することで、あらゆるステータスの投稿を取得できるとわかりました。ただし、投稿タイプの設定で「exclude_from_search」が「true」になっている場合は効かないそうです。

「any」はゴミ箱に入れた投稿も取得されてしまうのではと思い、使用を避けていましたが、実はそうでもないようです。「post_status」を「any」に指定して、生成されたSQL文を確認してみましたところ、「post_status」のが反映されたのは下記の部分になります。


AND (wp_posts.post_status <> 'trash' AND wp_posts.post_status <> 'auto-draft')

 

SQLで「<>」は不等号を意味します。従って、「trash」と「auto-draft」つまりはゴミ箱にある投稿と自動下書き保存された投稿は除外されていると言うことです。

 

プラグイン開発でカスタム投稿を用いた場合は、アンインストールファイルで生成したカスタム投稿の記事を全て削除する必要があります。そのような場合は、上記に説明したとおり「post_status」を「any」で指定するだけでは削除しきれないところがあります。下記のように全投稿を取得して削除すれば、上手くいきました。

 

$posts = get_posts( array(
	'post_type'      => 'pulugin-custom-post',
	'post_status'    => array(
		'any',
		'trash',
		'auto-draft',
	),
	'posts_per_page' => -1,
) );
foreach ( $posts as $post ) {
	wp_delete_post( $post->ID, true );
}

 

「post_status」は配列でも指定できますので、除外されたステータスを補えばよいわけですね。

 

ご指摘・ご質問などがありましたら、コメントをお願いします。

金沢

著者プロフィール

金沢大樹

2年間のアルバイトを経て、平成27年度より社員として株式会社オンラインでWeb制作をしております。
WordPressを得意としており、プラグイン開発の経験もございます。
また、Monacaを使用したスマートフォンアプリ開発や、Visual BasicによるWindowsアプリケーション開発もできます。

コメントを残す

コメントは管理者による承認後に公開されます。

CAPTCHA