サポート » テーマ » 1ページに表示する件数を日数で指定したい

  • fun826

    (@fun826)


    はじめまして。
    WordPress テーマを自作しています。

    WordPress の表示設定では1ページに表示する最大投稿数を件数で指定する事ができますが、これを1ページあたり7日分,30日分といったように日数で指定できる方法はないでしょうか?

    件数で指定した場合と同様に日数で指定した場合でもページ送りができるような方法を探しています。

    Custom Query String というプラグインも試したのですがうまく行きませんでした。

    回答よろしくお願いします。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • slyman

    (@slyman)

    デフォルトのquery_postsを使えば普通に出来ますよ

    ページ送りは自分で計算して日付範囲を代入してください

    以下、公式codexより転載

    最近30日間の投稿を表示

    <pre>
    // Create a new filtering function that will add our where clause to the query
    function filter_where( $where = '' ) {
    	// posts in the last 30 days
    	$where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";
    	return $where;
    }
    add_filter( 'posts_where', 'filter_where' );
    
    query_posts( $query_string );

    トピック投稿者 fun826

    (@fun826)

    回答ありがとうございます

    ページ送りがまだ実装できていませんが、なんとかやってみたいと思います。

    トピック投稿者 fun826

    (@fun826)

    度々すみません。ページ送りができずに詰まっています。

    $paged を使って現在のページ番号を取得してページ送りを実装しようと思ったのですが、うまく行きません。

    手元の表示サンプルが少ないのでとりあえず1ページ1日分表示を目標にしています。1ページ目は期待した通りの結果が出てきますが、2ページ以降は記事を読み込んでくれません。

    next_posts_link も出力されません。

    function filter_where( $where = '' ) {
    	if(!$paged) {$paged = 1;}
    	$from = $paged - 1;
    	$where .= " AND post_date >= '" . date('Y-m-d', strtotime('-'.$paged.' days')) . "'" . " AND post_date <= '" . date('Y-m-d', strtotime('-'.$from.' days')) . "'";
    	return $where;
    }
    add_filter( 'posts_where', 'filter_where' );
    
    query_posts( $query_string );

    回答よろしくお願いします

    slyman

    (@slyman)

    こちらの環境で確認した限りはこれで動きます

    global $paged;
    						$paged = $_GET['paged'];
    						if(!$paged)$paged=1;
    						function filter_where( $where = '') {
    							global $paged;
    							if(!$paged) {$paged = 1;}
    							$from = $paged - 1;
    							$where .= " AND post_date >= '" . date('Y-m-d', strtotime('-'.($paged).' days')) . "'" . " AND post_date <= '" . date('Y-m-d', strtotime('-'.$from.' days')) . "'";
    							return $where;
    						}
    						add_filter( 'posts_where', 'filter_where' );
    						$query_array = array(
    						'orderby' => 'date',
    						'order' => DESC,
    						'post_status' => 'publish'
    						);
    					if ( have_posts() ) : query_posts($query_array); ?>
    					<?php
    						for($i=$paged;$i<=$paged+10;$i++){
    							echo "<a href=\"".get_permalink()."&paged={$i}\">$i</a>";
    						}
    					?>

    ページネーションはposts_per_pageが使えないので、
    このサンプルでは手作業でforしてますので、
    ご希望の形に合うように自力で実装してください。

    トピック投稿者 fun826

    (@fun826)

    素早い回答ありがとうございます。

    早速、コードを拝見し試してみました。var_dump の結果をみるとページ送りすれば where の値は期待する結果がかえってきています。

    しかし実際に出力される投稿の数は WordPress 管理画面の表示設定に影響を受けているようです。

    管理画面の表示設定を1件と設定すると where の範囲の中から1件しか出力されません、2ページ目以降も同じです。

    逆に 999 件のように大きな値を設定すると where の範囲はすべて出力するのですが、2ページ目以降は一切記事が出力されなくなります。おそらく内部では1ページ目で999件分の投稿を出力した事になっているのでしょう。

    日数指定は表示件数が可変になるのでループをどうにか制御できないでしょうか?

    slyman

    (@slyman)

    こちらの環境では再現できないので何とも言えませんが、
    何らかのグローバル変数に表示件数が入っているか、
    have_postsのループ内でbreakしてないですか?

    トピック投稿者 fun826

    (@fun826)

    返信送れてすみません。

    posts_per_page=-1 を指定する事でできました。

    丁寧な回答をしていただきありがとうございます。助かりました。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「1ページに表示する件数を日数で指定したい」には新たに返信することはできません。