web-dev-qa-db-ja.com

過去12ヶ月の最も人気のある記事を表示

私は最も人気のある最新の投稿を表示するNiceタブ付きウィジェットを持つRibbonテーマを使用します。最も人気のある投稿を過去12か月に制限したいと思います。私はむしろそのためにプラグインを使わずにテーマファイルのコードを変更したいと思います。クエリはこんな感じです:

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

私はこのスニペットを試しました:

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

これはウィジェットに対しては機能しますが、他のクエリにも影響します。フィルタを削除しようとしましたが、うまくいきませんでした。

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

幸運なことにそのようにクエリを書き直そうとしました。

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

私はここで立ち往生しています。任意の助けがいただければ幸いです。

お手伝いありがとう。これが私が今使っているコードです:

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

@Rarstが示唆したように、あなたはあなたの$argsをあなたの関数の中で定義させなければなりません。あなたはグローバル変数を使ってそれを解決することができます、しかし私たちはあまり飛ばしたくないあまりにも多くのそのような変数を飛び回ります!

変数のスコープ上のPHP docsをチェックしてください または クラスにコードを書いてください .

クエリを単純化することもできます。これはあなたの関数がどのように見えるかの例です。

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();
}

これにより、次のSQLクエリが生成されます。

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 

現在の日付が'2014-04-06 11:30:26'の場合.

ps:posts_whereフィルタがあなたのWP_Queryのインスタンスにのみ影響を与えるようにしたい場合は、それを関数に移動する必要があります。

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();
}

この場合は必要ありません。

お役に立てれば。

1
birgire