Je voudrais obtenir tous les commentaires pour un groupe de post (pas un seul post.
J'ai essayé
$comment_args = array('number' => '14', 'post_id' => '10,20,30,40' );
$comments = get_comments($comment_args);
foreach($comments as $comment) ...
Mais ça ne marche pas. Des idées?
Le 'post_id'
est converti en un entier positif dans WP_Comment_Query
, vous ne pouvez donc pas transmettre quoi que ce soit avec succès à get_comments()
.
Vous devez filtrer 'comments_clauses'
. Ici, vous pouvez modifier la clause WHERE
pour utiliser comment_post_ID IN ( $ids )
au lieu de comment_post_ID = $id
.
J'utiliserais une classe statique comme wrapper pour 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>';
Malheureusement, get_comments()
ne fonctionne pas vraiment de cette façon. Si vous spécifiez un identifiant de publication, la fonction ne renverra que des commentaires . Le paramètre post ID n'accepte pas plusieurs ID.
Cependant, vous pourriez écrire une fonction pour extraire récursivement les commentaires d'un tableau de publications et l'utiliser à la place:
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' ) );
Une fois que vous avez le tableau dans votre fonction, vous pouvez le commander comme vous le souhaitez et le limiter à seulement 14 commentaires environ… à vous de choisir.