web-dev-qa-db-fra.com

Afficher le message le plus populaire des 12 derniers mois

J'utilise le thème Ruban qui comporte un widget à onglets de Nice présentant les messages les plus populaires et les plus récents. J'aimerais limiter les publications les plus populaires aux 12 derniers mois. Je préférerais ne pas utiliser de plugin pour cela, mais changer le code dans le fichier de thème. La requête ressemble à ceci:

function mts_popular_tabs( $posts = 5 ) {
    $popular = new WP_Query('showposts='. $posts .'&orderby=comment_count&order=desc');
    $popular_post_num = 1;
    while ($popular->have_posts()) : $popular->the_post();

J'ai essayé cet extrait:

function filter_where($where = '') {
        $where .= " AND post_date > '" . date('Y-m-d', strtotime('-365 days')) . "'";
        return $where;
}
add_filter('posts_where', 'filter_where');

Cela fonctionne pour le widget mais affecte également d'autres requêtes. J'ai essayé de retirer le filtre, mais cela n'a pas fonctionné:

wp_reset_query();
remove_filter('posts_where', 'filter_where');

J'ai essayé de réécrire la requête comme si de rien n'était:

$today = date('Y-m-d');
$todayminusone = date('Y-m-d', strtotime('-1 year'));
$args = array(  
    'date_query' => array(  
        array(  
            'after' => $today,  
            'before' => $todayminusone,  
        ),  
    ),  
    'showposts' => 5,
    'orderby' => 'comment_count',
    'order' => 'desc'  
); 

function mts_popular_tabs() {
    $popular = new WP_Query($args);
    $popular_post_num = 1;
    while ($popular->have_posts()) : $popular->the_post();

Je suis coincé ici. Toute aide serait appréciée.

Merci pour l'aide. C'est le code que j'utilise maintenant:

function mts_popular_tabs( $nr = 5 )
{
    $args = array(  
        'date_query'     => array( array( 'after' => '-1 year' ) ),  
        'posts_per_page' => (int) $nr,
        'orderby'        => 'comment_count',
        'order'          => 'DESC'  
    ); 
    $popular = new WP_Query( $args );
    $popular_post_num = 1;
while ($popular->have_posts()) : $popular->the_post();
    ...
2
user2516117

Comme @Rarst l’a suggéré, vous devez définir votre $args dans votre fonction. Vous pouvez le résoudre en utilisant les variables globales , mais nous ne voulons pas trop de variables de ce type survolant!

Découvrez les PHP docs sur la portée d'une variable ou écrivez votre code dans un classe .

Vous pouvez également simplifier votre requête. Voici un exemple à quoi votre fonction pourrait ressembler:

function mts_popular_tabs( $nr = 5 )
{
    $args = array(  
        'date_query'     => array( array( 'after' => '-1 year' ) ),  
        'posts_per_page' => (int) $nr,
        'orderby'        => 'comment_count',
        'order'          => 'DESC'  
    ); 
    $popular = new WP_Query( $args );
    // ... your loop ...
    wp_reset_postdata();
}

Cela générera la requête SQL suivante:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
    FROM wp_posts 
    WHERE 1=1 
          AND ( ( post_date > '2013-04-06 11:30:26' ) ) 
          AND wp_posts.post_type = 'post' 
          AND (wp_posts.post_status = 'publish') 
    ORDER BY wp_posts.comment_count DESC 
    LIMIT 0, 5 

si la date actuelle est '2014-04-06 11:30:26'.

ps: Si vous souhaitez que le filtre posts_where n'affecte que votre instance de WP_Query, vous devez également le déplacer dans la fonction:

function mts_popular_tabs( $nr = 5 )
{
    add_filter( 'posts_where', 'filter_where' );
    $popular = new WP_Query( $args );
    remove_filter( 'posts_where', 'filter_where' );
    // ... your loop ...
    wp_reset_postdata();
}

mais vous n'en avez pas besoin dans ce cas.

J'espère que cela t'aides.

1
birgire