web-dev-qa-db-fra.com

Les plus commentés des dernières 24h, semaine, mois, année et tous les temps - posts_where

J'ai supprimé mon ancien message ici, car la méthode posts_where est obsolète.

Grâce à kaiser, c’est maintenant facile de lister la plupart des publications commentées dans un laps de temps donné:

<?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; ?>

Remarque: cette option permet de trier les articles les plus commentés publiés dans les X dates , de ne pas vérifier tous les articles, puis de rechercher le plus grand nombre de commentaires au cours de cette période parmi tous les articles. . Aucune idée de comment faire le second, ni de son poids.

1
Alx

Où?

La classe WP_Comment_Query a le filtre suivant pour ses clauses:

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

Cela signifie que vous pouvez vous connecter à comments_clauses et filtrer la partie $clauses['where'].

Comment?

Depuis WP 3.7, nous avons une classe WP_Date_Query. Cela fonctionne comme suit (exemples simplifiés):

Les valeurs par défaut utilisées lors de WP_Query - récupérées via les vars de requête:

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

Comment faire un date_queryExemple de code copié de ici

$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
) );

Vous pouvez également effectuer un WP_Date_Query() simple et récupérer la chaîne SQL résultante pour une utilisation ultérieure dans les filtres de clauses:

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

// Inspect result
var_dump( $whereDate );

À présent Même source une requête de date pour un article et ses commentaires:

// 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
) );

Moqué

Pas testé ...

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