サポート » 使い方全般 » 期間のあるイベントの表示方法

  • イベント掲載方法の参考に過去記事を拝見して勉強しました。
    本も購入して勉強したのですが、2ヶ月ほど悩んだのですが、
    まだまだスキルが不足して解決できません。

    イメージ的にはほぼ、以下で解決されている内容なのですが、
    私の場合、イベントに期間があるためもう少しだけ工夫が必要に
    なりました。

    http://ja.forums.wordpress.org/topic/6081
    ついては、お教えいただきたく宜しくお願いします。

    【登録イベント】

    イベントA
     start 2011-10-01
     end 2011-12-01

    イベントB
     start 2012-11-01
     end 2012-02-01

    イベントC
     start 2012-02-01
     end 2012-03-01

    【表示方法】

    ・TOPページやカテゴリページ
    今日の日付 2012-01-15 だとします。

    その場合
    Aは表示されない。
    BCは表示されて、end 日が今日に近いもの順で表示したいと思います。

    ・年月ページ
    また、過去のイベントも含め月ごとで管理したいので、
    http://ja.forums.wordpress.org/topic/8389?replies=7
    で紹介されているように月別ページを作りたいと考えています。

    2011年10月 A、を表示
    2011年11月 A、B を表示 
    2011年12月 A、B を表示 
    2012年1月 B、 を表示
    2012年2月 B、C を表示  
    2012年3月 C を表示 

    このような機能を実現したくお教え頂ければ幸いです。

15件の返信を表示中 - 1 - 15件目 (全39件中)
  • モデレーター Takuro Hishikawa

    (@hissy)

    自分はSQL発行して実装しちゃいましたが、どなたかもっとスマートな実装方法をご存じないかなぁ。

    global $wpdb;
    
    $sqlstr = "SELECT s.post_id"
    	." FROM " . $wpdb->postmeta . " s, " . $wpdb->postmeta . " e"
    	." WHERE s.post_id = e.post_id"
    	." AND s.meta_key = 'startDate'"
    	." AND s.meta_value < '" . date('Y',$to) . "-" . date('m',$to) . "-01'"
    	." AND e.meta_key = 'endDate'"
    	." AND e.meta_value >= '" . date('Y',$from) . "-" . date('m',$from) . "-01'";
    
    $results = $wpdb->get_results( $wpdb->prepare($sqlstr) );
    
    $array_post_id = array();
    if ( $results ) {
    	foreach ( $results as $result ) {
    		$array_post_id[] = $result->post_id;
    	}
    }
    
    query_posts(
    	array(
    		'post__in'	 => $post_ids
    	)
    );

    hissy さん。 ありがとうございます!
    また、返信遅くなり失礼しました。

    早速実装してみたいと思いますが平日は時間がとれないので、
    週末に行います。

    ただ、私はデザイン系の人間なのでphp恥ずかしながら
    良く分かりません。

    頂いたソースは functions.php に書き込むのでしょうか?

    また、呼び出しは 以下のような通常のループで呼び出せば宜しいでしょうか?
    <?php query_posts(); ?>
    <?php if(have_posts()): while(have_posts()):
    the_post(); ?>
    必要情報
    <?php endwhile; endif; ?>

    恐れ入りますが お教え頂きたくお願い致します。

    モデレーター Takuro Hishikawa

    (@hissy)

    だいぶ端折って書いてるので、PHPちょっと勉強しないと詰まるかもしれない。。
    ソースは月別ページの場合で $to に1カ月後、$fromに今日の日付を入れてください。
    startDateとendDateはカスタムフィールドです。
    最後の$post_idsは$array_post_idの間違いでした…。
    query_postsのあとは普通のループでOKです。get_postsでもいいですよ。

    この辺の処理って結構難しいので(私も無理矢理作ったのですが難しいです)プラグインを探したほうが楽かもしれないです。

    hissy 様。ありがとうございます。
    早速実施してみましたが、カスタムフィールドに入力されているものと いないもの含めて全て投稿日の順番で表示されてしまいました。

    ■functions.phpに以下を記載しました。

    global $wpdb;
    
    $sqlstr = "SELECT s.post_id"
    	." FROM " . $wpdb->postmeta . " s, " . $wpdb->postmeta . " e"
    	." WHERE s.post_id = e.post_id"
    	." AND s.meta_key = 'startDate'"
    	." AND s.meta_value < '" . date('Y',$to) . "-" . date('m',$to) . "-01'"
    	." AND e.meta_key = 'endDate'"
    	." AND e.meta_value >= '" . date('Y',$from) . "-" . date('m',$from) . "-01'";
    
    $results = $wpdb->get_results( $wpdb->prepare($sqlstr) );
    
    $array_post_id = array();
    if ( $results ) {
    	foreach ( $results as $result ) {
    		$array_post_id[] = $result->post_id;
    	}
    }

    呼び出すページで以下を記載しました。

    <?php query_posts(array('post__in' => $array_post_id)); ?>

    このソースで表示したところ、登録されているデータが全て登録順で表示されていました。私の記載方法や不備がありましたら、お教え頂ければ幸いです。
    お手数をおかけして申し訳ありません。

    モデレーター Takuro Hishikawa

    (@hissy)

    query_posts(array('post__in' => $array_post_id));

    このコードは、取得する投稿をIDで指定し、それ以外はデフォルトの設定で取得しています。
    WordPressではデフォルトの設定では投稿日時の降順で表示しますので、正しい挙動です。
    カスタムフィールドの値でソートしたい場合は、パラメータを追加します。

    query_posts (
    	array(
    		'post__in' => $array_post_id,
    		'meta_key' => 'startDate',
    		'orderby'  => 'meta_value',
    		'order'    => 'DESC'
    	)
    );

    Codexのテンプレートタグ/query postsに解説がありますので、詳しくはそちらで。

    まぁこのように2回のクエリを消費しているので、この方法はイマイチなんですよねぇ。どなたかもっとスマートな方法をご存じないかしら。

    hissy 様 ありがとうございます。
    パラメータを加えることでほぼイメージに近い表示になりました。! 感謝です。

    2点ご確認させてください。

    1.
    今日の日付 2012-01-15 だとして

    イベントA
     start 2011-10-01
     end 2011-12-01

    イベントB
     start 2011-11-01 ← 初回の記載が 2012-11-01 でしたが訂正します。
     end 2012-02-01

    イベントAは表示されなくて良いのですが、
    イベントBは表示させたいと考えておりますが、
    今日よりも開始日が古い 場合も表示させたいのですが、可能でしょうか?

    2.抽出したイベントの並び順は、終了日でソートしたいのですが可能でしょうか?

    恐れ入りますがお教え頂ければ幸いです。

    失礼しました。
    終了日順でのソートは以下にて実装できました。
    間違っていたらご指摘ください。

    <?php query_posts (
    	array(
    		'post__in' => $array_post_id,
    		'meta_key' => 'endDate',
    		'orderby'  => 'meta_value',
    		'order'    => 'ASC'
    	)
    ); ?>

    実現できていないのが
    startDate が 今日(もしくは今月)以前であり かつ
    endDate  が 本日(もしくは今月)以降のイベント の表示となります。

    スキルがなく、ご迷惑をおかけして大変申し訳ありません。
    何卒宜しくお願い致します。

    もろもろテストをしたのですが、
    表示すると前件表意じされてしまっている状態です。
    作者さまは動作確認されているとのことなので、
    私に不備があるかと思いますが、特定できず困っています。

    どなたか上記(御教え頂いた)スクリプトで動く方法をお教え頂ければ幸いです。

    モデレーター Takuro Hishikawa

    (@hissy)

    現時点でできていないのは

    startDate が 今日(もしくは今月)以前であり かつ
    endDate  が 本日(もしくは今月)以降のイベント の表示となります。

    の部分ですか?

    hissy様 お手数をおかけして大変申しわけありません。

    私がもう少し理解していれば良いのですが、ご迷惑をおかけしています。
    以下に現状を整理させて頂きますので、ミスや修正点がございましたら、
    ご指摘頂ければ幸いです。

    サイトのTOPページと月別ページそれぞれに反映させたいと考えています。
    月別ページはまだ手付かずで TOPページから実装しているのですが、
    上手くいきませんでした。

    ■登録データ
    イベントA startDate:2011-11-01 endDate: 2012-05-01
    イベントB startDate:2011-12-01 endDate: 2012-01-01
    イベントC startDate:2012-02-01 endDate: 2012-05-01
    イベントD startDate:2012-03-01 endDate: 2012-06-01

    ■プログラム格納場所
    functions.php 以前に投稿したソースを格納
    home.php 呼び出しようにquery_posts を記載

    ■想定していた表示イベント
    本日 2012-02-04 現在で表示させたいのは以下イベント
     イベントA
     イベントC
     イベントD

    ■実際の表示状況
    以下全てのイベントが表示されてしまいます
     イベントA
     イベントB
     イベントC
     イベントD

    ■テスト事項
    1.functions.phpで行っている処理が表示に反映されていないように
     思え、一度functions.phpのソースを削除して実行しましたが
     全てのイベントが表示されました。

    2.同様のテストですが、home.phpの query_posts  パラメータ
     ’post__in’ => $array_post_id, を削除してテストしても
     同様に全てのイベントが表示されてしまいました。

    この結果から何らかしらの要因で functions.php の処理がされていないか
    値が引き継がれていないのではないかと考えました。
    私の記述方法がどこか間違っているように思うのですが、
    特定できません。

    ■月別ページ
    ソースは月別ページの場合で $to に1カ月後、$fromに今日の日付を入れてください。
    と以前アドバイスを頂きましたが、月別ページを動的に生成する場合、
    どのようにパラメータを設定すれば良いのかわかりませんでした。

    以上状況報告となりますが、不足する情報あれば、ご指摘ください。
    また、必要であれば、開発中のサイトURLもご案内いたします。

    以上何卒宜しくお願い致します。 

    hissy様 

    追加報告です。

    ■home.php でのイベント掲載方法については、
    http://ja.forums.wordpress.org/topic/6081?replies=8
    上記内容を参考に何とか実装することができました。

    my_query_posts( ‘meta_key=endDate&meta_between=today,2100-01-01’ );
    // ここでループ処理
    wp_reset_query();

    *meta_key=endDate に変更
    *掲載修了パラメータを 2100-01-01 に変更(むりやりあり得ない未来を指定)
    このことにより、endDate が今日よりも後のイベントを表示可能になりました.

    ついては、月別アーカイブを作成できれば問題は解決しそうですが、
    これについて検証したのですが、やはり、今現在できません。

    ■月別アーカイブ

    登録データ念のため再掲。
    イベントA startDate:2011-11-01 endDate: 2012-05-01
    イベントB startDate:2011-12-01 endDate: 2012-01-01
    イベントC startDate:2012-02-01 endDate: 2012-05-01
    イベントD startDate:2012-03-01 endDate: 2012-06-01

    表示させたい月別データはこのようなものですが、可能でしょうか。
    *ルール

     イベント開催期間の月別アーカイブに該当イベントを表示。

    2011年11月 → イベントA
    2011年12月 → イベントA、B
    2012年1月 → イベントA、B
    2012年2月 → イベントA、C
    2012年3月 → イベントA、C、D
    2012年4月 → イベントA、C、D
    2012年5月 → イベントA、C、D
    2012年6月 → イベントD

    この表示をするために、最初にお教え頂いたソースで実装可能でしょうか?
    恐れ入りますが、宜しくお願い致します。

    モデレーター Takuro Hishikawa

    (@hissy)

    何がなんだか分からず質問されているように思いますので、SQL文の解説をしておきます

    $sqlstr = “SELECT s.post_id”
    ↑投稿のIDのみ取得
    .” FROM ” . $wpdb->postmeta . ” s, ” . $wpdb->postmeta . ” e”
    ↑WordPressのデータベースから、カスタムフィールドのテーブルを s と e にコピー
    .” WHERE s.post_id = e.post_id”
    ↑s の投稿IDと e の投稿IDが一致する
    .” AND s.meta_key = ‘startDate'”
    ↑かつ、s のカスタムフィールドのキーが ‘startDate’ である
    .” AND s.meta_value < ‘” . date(‘Y’,$to) . “-” . date(‘m’,$to) . “-01′”
    ↑かつ、s のカスタムフィールドの値が $to で指定した日付を含む月の1日より前である
    .” AND e.meta_key = ‘endDate'”
    ↑かつ、e のカスタムフィールドのキーが ‘endDate’ である
    .” AND e.meta_value >= ‘” . date(‘Y’,$from) . “-” . date(‘m’,$from) . “-01′”;
    ↑かつ、e のカスタムフィールドの値が $from で指定した日付を含む月の1日以降である

    で、「functions.phpに以下を記載しました。」と書いてらっしゃいますが、ほんとにこのまんまですか?functions.phpには関数にして記述して、テンプレート側からは関数を呼び出すようにしないといけません。

    hissy様

    ご丁寧な解説ありがとうございます。
    wordpress 及び phpの理解が浅く、勉強中のため 的外れなことを申し上げることが多く、ご迷惑をおかけしています。以下質問への回答とサイド質問を書かせて頂きました。

    ・ご質問に対する回答
      functions.php には先に記載した内容のソースを記述いたしました。
      テンプレートからもお教え頂いた関数で呼び出しております。

    ・新たな疑問点です。
      記載頂いた $to と $from  の値指定はどこで どのように行えば宜しいでしょうか。具体的な方法をご教授頂けると幸いです。

    (追記)

    functions.php に以下の記載をしたらhome.php での動作は、期待値どおりになりました!
    $to = date(‘Ymd’);
    $from = date(‘Ymd’);

    ただ、date.php で 今開いている アーカイブの年月日を取得して $to $from に
    どのようにセットするのかわからないので、継続して検討してみます。
    もしご教授頂ければ、幸いです。

    以上宜しくお願い致します。

    hissy様

    すみません。私の確認ミスでした。上述した期待通りの動きは実現できませんでした。
    一つ前の投稿は取り消させてください。

    その上で動作しない原因を探るべくfunctions.phpに書かれている変数
    $sqlstr
    の値を echo $sqlstr ; で表示させました。

    SELECT s.post_id FROM wp1_5_postmeta s, wp1_5_postmeta e WHERE s.post_id = e.post_id AND s.meta_key = ‘startDate’ AND s.meta_value < ‘1970-08-01’ AND e.meta_key = ‘endDate’ AND e.meta_value >= ‘1970-08-01’

    日付が 1970-08-01 と表示されていますが、この日付が
    異なるので正しく日付指定が出来ていないようでした。

    1970-08-01 と表示されるときは $to $ from に date(Ymd)の値を入れた場合です。
    なにも入れないと
    1970-01-01 となりました。

    日付が正しく渡せていないようでしたので 下記ように
    ソースの日付を直接書き直したところ期待の動きになりました。

    $sqlstr = “SELECT s.post_id”
    .” FROM ” . $wpdb->postmeta . ” s, ” . $wpdb->postmeta . ” e”
    .” WHERE s.post_id = e.post_id”
    .” AND s.meta_key = ‘startDate'”
    .” AND s.meta_value < ‘2012-03-05′”
    .” AND e.meta_key = ‘endDate'”
    .” AND e.meta_value >= ‘2012-02-05′”;

    やはり、私の $to $from の指定方法が間違っているように思えるのですが、
    どのように改善したらよいのか、見出せていません。

    モデレーター Takuro Hishikawa

    (@hissy)

    dateの第二引数に渡すのはタイムスタンプです。PHPマニュアルを見てください。
    $to = date('Ymd');
    これだと日付文字列になっちゃいます。このコードのまま使いたいなら、mktimeを使うなど、タイムスタンプで渡してください。

    そして、アーカイブの年月日を取得してというのは、良くないやり方ですね。記事が存在しない年月日の場合、404になってしまいます。私はgetで年月日のパラメータを渡す方法を取りました。

15件の返信を表示中 - 1 - 15件目 (全39件中)
  • トピック「期間のあるイベントの表示方法」には新たに返信することはできません。