web-dev-qa-db-ja.com

複数の投稿へのコメントを取得

1つの投稿だけでなく、投稿のグループに対するすべてのコメントを取得したいです。

私は試した

$comment_args = array('number' => '14', 'post_id' => '10,20,30,40'  );
    $comments = get_comments($comment_args);
    foreach($comments as $comment) ...

しかし、うまくいきません。何か案は?

4
Francesco

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

残念ながら、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かそこらのコメントにそれを制限することができる…それはあなた次第です。

5
EAMann