web-dev-qa-db-fra.com

Obtenir des commentaires pour plus d'un post

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?

4
Francesco

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().

Exemple de code

/**
 * 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;
    }
}

Exemple d'utilisation

$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>';
5
fuxia

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.

5
EAMann