サポート » 使い方全般 » query_postsで期間を指定しての記事の表示

  • 解決済 haha taduko

    (@shimodar)


    こんにちは。
    いつも勉強させていただいております。

    query_postsを利用して、
    ・あるカテゴリー内の記事で、
    ・特定の期間内のものに限定して(例:今日以降~2011/12/31まで)
    記事のリストを表示させる方法をさがしています。

    Post Expiratorというプラグインを使えば、その記事の公開終了日(非公開か削除)を設定できるのですが、この場合は、当該記事が非公開になり、アーカイブ全体を表示させた場合に記事リストからもれてしまいます。

    他の手法をつうじて、なんとか乗り越えられないか探しております。

    いつも質問ばかりですみません。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • テーマフォルダの functions.php に以下を追加:

    <?php
    global $my_where;
    function my_posts_where( $where ) {
      global $my_where;
    
      return $where . $my_where;
    }
    function my_query_posts( $query ) {
      global $wpdb, $my_where;
    
      $q = wp_parse_args( $query );
      $my_where = '';
    
      if ( $q['date_from'] ) {
        if ( $q['date_to'] )
          $my_where = " AND ( DATE($wpdb->posts.post_date) BETWEEN '" . $q['date_from'] . "' AND '" . $q['date_to'] . "' )";
        else
          $my_where = " AND DATE($wpdb->posts.post_date) >= '" . $q['date_from'] . "'";
      } elseif ( $q['date_to'] ) {
          $my_where = " AND DATE($wpdb->posts.post_date) <= '" . $q['date_to'] . "'";
      }
    
      add_filter( 'posts_where', 'my_posts_where' );
      query_posts( $query );
      remove_filter( 'posts_where', 'my_posts_where' );
    }
    ?>

    で、query_posts()の代わりにmy_query_posts() を使います。

    // 期間指定
    my_query_posts( 'date_from=2010-07-01&date_to=2011-01-10' );
    
    // 参考:いつから、のみ指定
    //my_query_posts( 'date_from=2010-07-01' );
    
    // 参考:いつまで、のみ指定
    //my_query_posts( 'date_to=2011-01-10' );

    他のパラメータ(カテゴリーなど)も query_posts() と同様に指定できます。
    例:
    my_query_posts( 'cat=123&posts_per_page=10&date_from=2010-07-01&date_to=2011-01-10' );

    my_query_posts() のループ処理が終わったところで必ず wp_reset_query() してください。
    ※日付の文字列(例:2010-07-01)をどう作るか不明な場合は、また質問してください◎

    kzさま

    いつも教えてくださって本当に感謝しております。(^^ゞ

    実現したいことがご教授いただけたコードで無事実現できました!!

    <?php my_query_posts("posts_per_page=3&cat=69&order=DESC&date_from=2011-01-21&date_to=2011-01-29"); ?>
    ここに出力したい内容を記述
    <?php endwhile; endif; wp_reset_query(); ?>

    ただ一点、
    「本日(today)から2011/12/31まで」といったように、
    「今日から」をdate_fromでどのように記述すればよいかわからないでおります。(__)

    さらにネット上でしらべてみたのですが、
    http://futoko.co.jp/zzwp/?p=179
    http://ja.forums.wordpress.org/topic/5497?replies=15

    上記の内容をあまり理解できておらず、どうにか
    日々変化する「本日の指定」を手作業で書き換えることなく、
    システムで自動で本日の日付を認識し、date_fromに充てられる手法がないものか
    模索しております。

    引き続き、お付き合いいただけますと幸いでございます。

    通常のphpの日付関数でダメですか?

    date_from=2011-01-21
    この部分
    date_from=<?php date('Y-m-d'); ?>

    ご教授くださいましてありがとうございました。

    すみません!

    目標とする設計に大きな見落としがありました。。m(_ _)m

    「今日から」という指定に変だと思われた方がいらっしゃったかと思います。

    これは最終的に実現したいことが以下のようなものであったことからでした

    ・カテゴリー「サッカー 日本代表戦」に将来予定されている試合の記事を投稿
    ・各記事のカテゴリーフィールドで日付を設定 2011年1月29日、2011年3月11日など
    ・query_postsで上記の記事を出力。
     ・カテゴリー「サッカー 日本代表選」
     ・カテゴリーフィールドの日付を見て、今日以後、特定の日までのものを表示
     ・日付のフォーマットは ****年**月**日

    カスタムフィールドの日付情報を基準に並べ替えられるといった情報を
    みつけました。

    http://soft.fpso.jp/develop/wordpress/customize/entry_2267.html
    http://blog.honeylab.jp/20100609/customfield.html
    http://ja.forums.wordpress.org/topic/3570?replies=3

    ここから日付順での並び替えだけでなく、期間を限定していく方法を探しています。

    わかりにくくて本当にすみません。

    ご教授いただけますと幸いでございます。

    なんか、スケジュール系のプラグイン使ってしまったほうが便利なような。

    それと、ちょっと、最終的な目標が最初と違う気がするのでもうちょっと整理してほうがよろしいかと。

    kzさんのように、コードを考えてくださっている場合に、やりなおしになっちゃうのがもったいないです。

    #日付のフォーマットが「2011年1月29日」だと諸々アレなので
    #内部の meta_value の値は「yyyy-mm-dd」な感じで設計しておくと幸せになれます。
    #表示は 2011年1月29日 でも 二千十一年睦月二十九日 でも何でも良いです。

    ■日付のカスタムフィールドを
    key:date
    value:yyyy-mm-dd の形式
    とした場合。

    functions.php に以下を追加:

    global $my_where;
    
    function my_posts_where( $where ) {
      global $my_where;
      return $where . $my_where;
    }
    
    function my_query_posts( $query ) {
      global $wpdb, $my_where;
    
      $q = wp_parse_args( $query );
      $my_where = '';
    
      if ( ! empty( $q['meta_key'] ) && ! empty( $q['meta_between'] ) ) {
        $dates = explode( ',', $q['meta_between'] );
        if ( 2 == count( $dates ) ) {
          foreach( $dates as &$date )
    	if ( 'TODAY' == strtoupper( $date ) )
    	  $date = date( 'Y-m-d' );
    
          $my_where = $wpdb->prepare( " AND $wpdb->postmeta.meta_value BETWEEN %s AND %s ", $dates[0], $dates[1] );
        }
      }
    
      add_filter( 'posts_where', 'my_posts_where' );
      query_posts( $query );
      remove_filter( 'posts_where', 'my_posts_where' );
    }

    表示したいところで:

    my_query_posts( 'meta_key=date&meta_between=today,2011-12-31' );
      // ここでループ処理
    wp_reset_query();

    kvexさま kzさま

    ありがとうございました!
    ご教授いただいたコードで動作確認がとれました!!

    日付による期間指定もできるようコードもご配慮たまわりまして
    ありがとうございました。(例:meta_key=date&meta_between=2011-01-25,2011-12-31)

    本日以前の投稿日時をもつ記事たちをチェックボックスによる
    条件分岐で手作業で外していくしか方法がないかと思っていたので
    本当に大きな飛躍でした。

    ありがとうございました。m(__)m

    お二方のサイトを拝見しました。
    またいろいろご相談にのっていただければと思います。

    感謝を込めて。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「query_postsで期間を指定しての記事の表示」には新たに返信することはできません。