1つの投稿だけでなく、投稿のグループに対するすべてのコメントを取得したいです。
私は試した
$comment_args = array('number' => '14', 'post_id' => '10,20,30,40' );
$comments = get_comments($comment_args);
foreach($comments as $comment) ...
しかし、うまくいきません。何か案は?
'post_id'
はWP_Comment_Query
内で正の整数に変換されるので、get_comments()
に他のものをうまく渡すことはできません。
'comments_clauses'
をフィルタリングする必要があります。ここでWHERE
節を変更してcomment_post_ID = $id
の代わりにcomment_post_ID IN ( $ids )
を使用することができます。
get_comments()
のラッパーとして静的クラスを使います。
/**
* Query comments for multiple post IDs.
*/
class T5_Multipost_Comments
{
/**
* Post IDs, eg. array ( 1, 2, 40 )
* @var array
*/
protected static $post_ids = array ();
/**
* Called like get_comments.
*
* @param array $args
* @param array $post_ids
* @return array
*/
public static function get( $args = array (), $post_ids = array () )
{
if ( array () !== $post_ids )
{
self::$post_ids = $post_ids;
add_filter( 'comments_clauses', array ( __CLASS__, 'filter_where_clause' ) );
}
return get_comments( $args );
}
/**
* Filter the comment query
*
* @param array $q Query parts, see WP_Comment_Query::query()
*
* @return array
*/
public static function filter_where_clause( $q )
{
$ids = implode( ', ', self::$post_ids );
$_where_in = " AND comment_post_ID IN ( $ids )";
if ( FALSE !== strpos( $q['where'], ' AND comment_post_ID =' ) )
{
$q['where'] = preg_replace(
'~ AND comment_post_ID = \d+~',
$_where_in,
$q['where']
);
}
else
{
$q['where'] .= $_where_in;
}
remove_filter( 'comments_clauses', array ( __CLASS__, 'filter_where_clause' ) );
return $q;
}
}
$multi_comments = T5_Multipost_Comments::get(
array ( 'number' => '14' ), // comment args
array ( 149, 564, 151 ) // post IDs
);
print '<pre>' . htmlspecialchars( print_r( $multi_comments, TRUE ) ) . '</pre>';
残念ながら、get_comments()
はそのようにはうまくいきません。投稿IDを指定した場合、関数はのみその投稿に対するコメントを返します。 post IDパラメータは複数のIDを受け付けません。
ただし、投稿の配列からコメントを再帰的に取得する関数を作成して、代わりにそれを使用することもできます。
get_comments_from_range( $post_ids ) {
foreach( $post_ids as $post_id ) {
$comment_collection[] = get_comments( array( 'post_id' => $post_id ) );
}
return $comment_collection;
}
$comments = get_comments_from_range( array( '10', '20', '30', '40' ) );
あなたがあなたの関数の中にいったん配列を持っているならば、あなたはそれをあなたが必要とするけれどもそれをわずか14かそこらのコメントにそれを制限することができる…それはあなた次第です。