サポート » プラグイン » 今日の日付に該当する記事を表示したい

  • 下記プラグインを使用し、イベントカレンダーを作成中です。
    Event Calendar バージョン 3.1.4
    http://wpcal.firetree.net/

    ”開催中のイベント”として、今日の日付に該当する記事のみをランダムに5件
    表示したいと思っています。

    ーーーー
    開始日:0000年00月00日〜終了日:0000年00月00日
    もしくは、cccc年cc月cc日(1日のみのイベント)と設定されているので、
    この日付の中に今日の日付があれば表示する
    ーーーー

    フォーラムの記事を参考に下記のコードでデータ取得をしてみましたが、
    今日の日付で投稿された記事も表示されてしまいます。

    <?php $current_month = date('m'); ?>
    <?php $current_year = date('Y'); ?>
    <?php $current_day = date('d'); ?>
    <?php query_posts("day=$current_day&year=$current_year&monthnum=$current_month&order=ASC"); ?>

    このようなことを実現されている方、ご存知の方がいらっしゃいましたら教えて頂きたいです。

15件の返信を表示中 - 1 - 15件目 (全17件中)
  • (未検証)Event Calendar は未考慮なので雰囲気のみ。
    functions.php に以下を追加:

    function my_posts_where($where = ''){
      global $wpdb;
      $today = date('Y/m/d', $target_time);
      $where .= "
      AND $wpdb->posts.ID IN(
        SELECT id_start FROM
          (SELECT post_id AS id_start FROM $wpdb->postmeta WHERE meta_key = 'date_start' AND meta_value <= '$today') AS t1
          INNER JOIN
          (SELECT post_id AS id_end   FROM $wpdb->postmeta WHERE meta_key = 'date_end'   AND meta_value >= '$today') AS t2
    	  ON (t1.id_start = t2.id_end)
      )";
      return $where;
    }

    posts を取得:

    add_filter('posts_where', 'my_posts_where');
    query_posts('posts_per_page=5&orderby=rand');
    remove_filter('posts_where', 'my_posts_where');
    if(have_posts()) :
      while(have_posts()) :
        the_post();
         /* do stuff */
      endwhile;
    endif;
    wp_reset_query();

    以下を Event Calendar に合わせれば OK。 
    ・開始日/終了日の「メタキー名」と「日付フォーマット」
    ・1日のみイベントの終了日のフォーマットが空欄なら
     (meta_value >= '$today' OR meta_value = '')
     に変更。

    kzさん、いつもありがとうございます。

    メタキー=カスタムフィールドのことでよかったでしょうか?
    もし、そうであれば教えて頂いたのに今更なのですが、既にデータが50件以上
    入ってしまっているので、今からカスタムフィールドを足して行く作業が難しい
    状態なのです。
    投稿した記事にこれから追加しなくてもよいようにしたいのです。

    以前、教えて頂いた日付取得方法をもとに実現できないかと考え中です。
    http://ja.forums.wordpress.org/topic/3628?replies=16

    kzさん、先日はありがとうございました。
    自分の力不足で、良い方法が出来上がらないので、kzさんに教えて頂いたメタキーを
    使う方法を使わせて頂くことにしました。
    長い間、放置したままになってしまい、申し訳ありませんでした。

    さっそく、組み込んでみたのですが、データが何も表示されません。
    自分で行った作業を書き出してみたのですが、もしお時間ございましたら
    引き続きアドバイスいただけますでしょうか。よろしくお願いいたします。

    (1)function から return $where;}までをfunction.phpに貼り付け
      Y/m/dをY-m-dに変更
    (2)add_filterからwp_reset_query();までを表示したいところに貼り付け
     /* do stuff */の部分は、the_title();と追加
    (3)投稿データ→カスタムフィールドにデータを追加
     名前:date_start 値:0000-00-00
     名前:date_end 値:0000-00-00
     ※テスト用として今日の日付である2010-05-07を入れています

    色々試してみたところ、
    $today = date(‘Y-m-d’, $target_time);を
    $today = date(‘Y-m-d’);に変更すると表示されるようです。

    あ、残骸コードが残ってましたねごめんなさい。
    「今日の日付」がご希望なので$today = date('Y-m-d');で OK です。

    その後、色々なケースで試してみたところ、1つのイベント(投稿)に複数の日付設定が
    ある場合、「今日の日付」に該当しないイベントも表示されてしまうことに気がつき
    ました。
    何か良い解決策がありましたら、知恵を貸して頂けないでしょうか。

    例1)
    1回目のイベント
    開始日:2010年1月1日〜終了日:2010年1月2日
    date_start:2010-01-01
    date_end:2010-01-02

    2回目のイベント
    開始日:2010年2月1日〜終了日:2010年2月2日
    date_start:2010-02-01
    date_end:2010-02-02

    ーーーー

    例2)
    1回目のイベント
    2010年1月1日(1日のみ)
    date_start:2010-01-01
    date_end:2010-01-01

    2回目のイベント
    2010年2月1日(1日のみ)
    date_start:2010-02-01
    date_end:2010-02-01

    例1・例2の結果)
    今日の日付:2010年1月3日と仮定
    →本当だったらこの日はイベントをやっていないことになるが、表示されてしまう。

    Event Calendar 3.1.4 で本日開催されているイベントの記事を取得する方法:

    <?php
    global $ec3, $wpdb;
    
    $entries = $wpdb->get_results(
      "SELECT DISTINCT
        p.id AS id,
        start, end,
        post_title
       FROM $ec3->schedule s
       LEFT JOIN $wpdb->posts p ON s.post_id=p.id
       WHERE p.post_status='publish'
         AND DATE(s.start)<='$ec3->today'
         AND DATE(s.end)>='$ec3->today'
       ORDER BY RAND() ASC LIMIT 5"
    );
    ?>
    <ul>
    <?php
    foreach ( $entries as $entry ) {
      ?><li><a href="<?php echo get_permalink( $entry->id ); ?>"><?php esc_html_e( $entry->post_title ) ?></a></li><?php
    }
    ?>
    </ul>

    tontoro

    (@tontoro)

    よろしければ教えてください。

    終了日が設定されていない場合
    正確には、終了日のカスタムフィールドがない場合に、どのように抽出するのか
    教えてください。

    上記にありましたように、カスタムフィールドが存在して、終了日が空欄ならば
    以下のような条件文で抽出できると思うのですが、
    ——————————————————
    1日のみイベントの終了日のフォーマットが空欄なら
     (meta_value >= ‘$today’ OR meta_value = ”)
    ——————————————————
    開始日のカスタムフィールドが存在して、終了日のカスタムフィールドが存在しない
    場合は、どのように条件文を書けばよいのでしょうか。

    SQLを勉強中ですが、
    (meta_key = ‘イベント終了日’ AND meta_value IS NULL)
    などではうまく抽出できません。

    すいませんが、よろしくお願いいたします。

    kz

    (@kz)

    #未検証

    終了日のカスタムフィールド自体が「無い」なら
    関連する記述を「ナシ」にすれば OK です。

    <?php
    global $ec3, $wpdb;
    
    $entries = $wpdb->get_results(
      "SELECT DISTINCT
        p.id AS id,
        start,
        post_title
       FROM $ec3->schedule s
       LEFT JOIN $wpdb->posts p ON s.post_id=p.id
       WHERE p.post_status='publish'
         AND DATE(s.start)<='$ec3->today'
       ORDER BY RAND() ASC LIMIT 5"
    );
    ?>
    <ul>
    <?php
    foreach ( $entries as $entry ) {
      ?><li><a href="<?php echo get_permalink( $entry->id ); ?>"><?php esc_html_e( $entry->post_title ) ?></a></li><?php
    }
    ?>
    </ul>

    tontoro

    (@tontoro)

    kz様 
    さっそくの返信ありがとうございます。
    そしてすいません。私の説明不足です。
    ポストごとに、カスタムフィールドが設定されており、
    それぞれのポストは、イベントの開始日だけのもの、終了日もあるものが混在している状態です。

    その中で、具体的には、「すでに終了しているイベント一覧」を表示させようと思いっています。
    このページの先頭のほうで、kz様が書かれておられたソースを参考に以下のような関数で抽出しようと試みているのですが、「終了日がセットされていない」という条件がうまく抽出できてないようです。
    ソースで抽出しようとしているのは、以下の2つです。
    〇イベントの開始日が今日より古く、かつ終了日がセットされていない記事
    〇イベントの終了日が今日より古い記事

    お手数おかけしますが、よろしくお願いいたします。

    function my_posts_where($where = ''){
      global $wpdb;
      $today =  date('Y/m/d');
      $where .= // (開始日 < today) and (終了日がセットされていない)
      "AND $wpdb->posts.ID IN(
    	SELECT id_start FROM
    	  (SELECT post_id AS id_start FROM $wpdb->postmeta WHERE meta_key='イベント日' AND meta_value <= '$today') AS t1
    	  INNER JOIN
    	  (SELECT post_id AS id_end   FROM $wpdb->postmeta WHERE meta_key='イベント終了日' AND meta_value = '') AS t2
    	  ON (t1.id_start = t2.id_end)
      )";
      $where .= // (終了日 < today)
      "OR $wpdb->posts.ID IN(
    	SELECT id_start FROM
    	  (SELECT post_id AS id_start FROM $wpdb->postmeta WHERE meta_key='イベント終了日' AND meta_value < '$today') AS t1
      )";
      return $where;
    }

    フィールドが無い、のをヒトコトでヤルのは色々とアレなので
    以下のようにすると良いかもです:

    //イベントの終了日が今日より古い記事
    query_posts( array(
      'meta_query' => array(
        array(
          'key' => 'end',
          'value' => date( 'Y-m-d' ),
          'compare' => '<',
        ),
      ),
    ) );
    while ( have_posts() ) :
      the_post();
      echo '<p>' . get_the_title() . '</p>';
    endwhile;
    wp_reset_query();
    
    //イベントの開始日が今日より古く、かつ終了日がセットされていない記事
    query_posts( array(
      'meta_query' => array(
        array(
          'key' => 'start',
          'value' => date( 'Y-m-d' ),
          'compare' => '<',
        ),
      ),
    ) );
    while ( have_posts() ) :
      the_post();
      if ( ! get_post_meta( get_the_id(), 'end' ) )
        echo '<p>' . get_the_title() . '</p>';
    endwhile;
    wp_reset_query();

    細かいところは適宜お好みに合わせてください。

    kz様

    丁寧な返信ありがとうございます。
    フィールドが無い、のをヒトコトでヤルのは色々とアレなんですね。

    教えていただいたように、それぞれの条件で取り出して表示してみます。

    ありがとうございました。

    kz様

    なんども質問すいません。
    ちなみにですが、上記の方法だと、クエリ変数を表示する段階で、

    if ( ! get_post_meta( get_the_id(), ‘end’ ) )

    上記の条件で表示、非表示を行っていますが、これだと抽出した記事には、不要な記事もふくまれていることになります。

    ページネーションなど「何ページ中の何ページを表示しています」というところで、1ページあたりの記事の表示数が変わったりしてしまいます。
    具体的には、1ページ中10記事表示のページもあれば、8ページしかないページもあったりという具合です。もちろん、抽出した記事数は正しく10件で表示時に上記の条件で非表示にしているので正しい動きといえばそうなのですが、、、

    なので、クエリ変数には、抽出したい条件の記事だけをセットしたいと試行錯誤しておりました。
    array_mergeでそれぞれ読み出したクエリ変数を結合させることはできたのですが、ここから上記の’end’のカスタムフィールドがない場合を除くのは、どのようにすれよいのでしょうか。

    そもそも考え方が間違っているような気もしますが、アドバイスいただければ幸いです。

    フィールドが無いのをクエリで拾ってくるのはツライことなので、
    それよりはカスタムフィールド保存時に end が未入力なら start の値を保存する、
    ようにすると苦労しなくて幸せになれますがそういう仕様ではダメな雰囲気ですか?

    kz様

    返信ありがとうございます。
    まさに、イベント日が一日でも、endにstartと同じ値を手動で入れる使用に変えようとしていました。

    ちなみに、どのようにすれば保存時、end が未入力なら start の値を自動で保存できるのでしょうか。
    自分のスキルでは、難しすぎるので、教えていただければ幸いです。

15件の返信を表示中 - 1 - 15件目 (全17件中)
  • トピック「今日の日付に該当する記事を表示したい」には新たに返信することはできません。