get_comments で複数の投稿タイプを取得する

複数のカスタム投稿タイプのコメントをまとめて取得したい での回答した内容の備忘録(と、若干のコードリファクタリング)

get_comments で指定できるパラメーターは、文字列形式のみで、配列やカンマ区切りによる複数指定はできません。
これは、内部でSQL文を構成する際に、prepare メソッドを用いて文字列や数字にはめ込んでいるためです。
ただし、comments_clauses というフィルターフックが用意されていて、SQL文のほぼ全ての句を変更することができるようになっています。

function multi_post_type_comments_where( $clauses, $comment_query ) {
	global $wpdb;
	if ( is_array( $comment_query->query_vars['post_type'] ) ) {
		$post_types = $wpdb->_escape( $comment_query->query_vars['post_type'] );
		$search = $wpdb->prepare( " AND {$wpdb->posts}.post_type = %s", $comment_query->query_vars['post_type'] );
		$replace = " AND {$wpdb->posts}.post_type IN ( '" . implode( "','", $post_types ) . "' )";
		$clauses['where'] = str_replace( $search, $replace, $clauses['where'] );
	}
	return $clauses;
}
add_filter( 'comments_clauses', 'multi_post_type_comments_where', 10, 2 );

回答は、投稿タイプのパラメーター固定ですが、パラメーターを foreach などでループ処理させることで、他のパラメーターについても、配列での複数指定に対応させることは可能なはずです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です