web-dev-qa-db-ja.com

ほとんどの人が過去24時間、週、月、年、およびすべての時間にわたってコメントしました - posts_where

Posts_whereメソッドが古くなっているので、ここで私の古い投稿を削除しました。

Kaiserのおかげで、これは特定の期間内に最もコメントされた投稿をリストするのがとても簡単になりました。

<?php
$popular = new WP_Query( array(
    'post_type'             => array( 'post' ),
    'showposts'             => 6,
    'cat'                   => 'MyCategory',
    'ignore_sticky_posts'   => true,
    'orderby'               => 'comment_count',
    'order'                 => 'dsc',
    'date_query' => array(
        array(
            'after' => '1 week ago',
        ),
    ),
) );
?>
<?php while ( $popular->have_posts() ): $popular->the_post(); ?>
    <?php the_title(); ?>
<?php endwhile; ?>

注:これは、ほとんどのコメント付きのX dateに投稿された記事でソートします。すべての記事をチェックせずに、すべての記事の中でその期間内にコメントを探します。 2番目の方法を実行する方法、またはそれがどのくらい重くなるかわかりません。

1
Alx

どこ?

WP_Comment_Queryクラスには、その句に対する次のフィルタがあります。

$pieces = array( 'fields', 'join', 'where', 'orderby', 'order', 'limits', 'groupby' );
$clauses = apply_filters_ref_array( 'comments_clauses', array( compact( $pieces ), &$this ) );

つまり、comments_clausesにフックして$clauses['where']部分をフィルタリングできます。

どうやって?

WP 3.7以降、私たちはWP_Date_Queryクラスを手に入れました。これは次のように動作します(簡単な例)。

WP_Query中に使用されるデフォルト値 - query varsを介して取得されます。

array(
    'year'     => '',
    'monthnum' => '',
    'week'     => '',
    'day'      => '',
    'hour'     => '',
    'minute'   => '',
    'second'   => '',
)

date_queryの使い方: ここからコード例をコピーしたもの

$dateQuery = new WP_Query( array(
    'date_query' => array(
        'column'   => 'optional, column to query against, default is post_date',
        'compare'  => 'optional, see WP_Date_Query::get_compare()',
        'relation' => 'optional, OR or AND, how the sub-arrays should be compared, default is AND',
        array(
            'column'    => 'see above',
            'compare'   => 'see above',
            'after'     => 'string or array, see WP_Date_Query::build_mysql_datetime()',
            'before'    => 'string or array, see WP_Date_Query::build_mysql_datetime()',
            'inclusive' => 'boolean, for after/before, whether exact value should be matched or not',
            'year'      => '4 digit int',
            'month'     => 'int, 1-12',
            'week'      => 'int, 0-53',
            'day'       => 'int, 1-31',
            'hour'      => 'int, 0-23',
            'minute'    => 'int, 0-60',
            'second'    => 'int, 0-60',
        ),
    ),
    // ... other query args
) );

普通のWP_Date_Query()を実行して、後に句フィルタで使用するために結果のSQL文字列を取得することもできます。

$dateQuery = WP_Date_Query( array( /* your query */ ) );
$whereDate = $dateQuery->get_sql();

// Inspect result
var_dump( $whereDate );

今 同じ出典 投稿の日付クエリとそのコメント:

// All comments that are within the past week
$some_comments = get_comments( array(
    'post_ID'    => get_the_ID(), // Can be omited as well
    'date_query' => array(
        array(
            'after' => '1 week ago',
        ),
    ),
    'count' => true // return only the comment count
) );

嘲笑した

未検証 ...

global $wp_query;
$daysQuery = new WP_Query( array(
    'post_type'           => array( 'post' ),
    'showposts'           => 6,
    'cat'                 => 'mycat',
    'ignore_sticky_posts' => true,
    'orderby'             => 'comment_count date',
    'date_query' => array(
        array(
            'after'  => array(
                'year'  => date( "Y" ),
                'month' => date( "m" ),
                'day'   => "01",
            ),
            'before' => array(
                'year'  => date( "Y" ),
                'month' => date( "m", strtotime( "-1 Months" ) ),
                'day'   => date( "t", strtotime( "-1 Months" ) ),
            ),
            // 'inclusive' => true,
            'month'     => date( "m" ),
        ),
    ),
) );
1
kaiser