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

  • イベント掲載方法の参考に過去記事を拝見して勉強しました。
    本も購入して勉強したのですが、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件の返信を表示中 - 16 - 30件目 (全39件中)
  • トピック投稿者 kura

    (@kura)

    hissy 様

    ご連絡遅くなり申し訳ありません。
    無事タイムスタンプを引数として渡すことで、home.php については
    動作希望の動きが実現できました。お教え頂きありがとうございます。

    現在アーカイブのつくり方をどうしようか悩んでおります。
    ご指摘されたことについても何となく理解できたと思います。

    解決すべく少し考え方を変えて、

    対象イベントのある年月のみ年月メニューをサイドバーに表示すれば良いのかと
    考えました。
    アーカイブは、ブログ投稿日で自動的に「年月メニュー」が生成されますが、
    今回は、startDate <= 年月 <= endDate の場合に該当する「年月メニュー」
    を表示したいと考えておりますが、考え方として正しいでしょうか?

    その場合 今回のロジックを活用して作れそうなイメージを持っているのですが、
    作り方がわかりませんでした。宜しければお教え頂けると幸いです。

    モデレーター Takuro Hishikawa

    (@hissy)

    私はgetで年月日のパラメータを渡す方法を取りました。具体的には /?event=201102 という様なURLでアクセスした時に、該当するイベントが表示されるようにということです。

    トピック投稿者 kura

    (@kura)

    hissy様 いつも、ご教授ありがとうございます。
    頂戴したコメントにて

    「/?event=201102 という様なURLでアクセスした時に、該当するイベントが表示されるように」

    と記載いただきましたが、その方法ついてお教えください。

    サイドバー に該当年月を表示し、そのこに /?event=201102 という
    パラメータのついたリンクを設定すると理解しました。

    まず、その対象年月のみ表示する方法がわからないでおります。
    本当に申し訳ないのですが、
    サイドバーに 該当するイベントが存在した年月のみ表示するためには
    どのような方法が良いのかご教授頂けると幸いです。

    モデレーター Takuro Hishikawa

    (@hissy)

    > 対象年月のみ表示する方法
    終了日が表示したい月の1日以降、開始日が表示したい月の来月の1日未満、がひとつの絞り込み方だと思いますが。そして、イベントの開始日・終了日がカスタムフィールドに格納されている場合、それは最初に提示したSQL文で取得可能です。ここはWordPressのフォーラムなので、PHPについてはいちいちソースまでご提示いたしません。

    トピック投稿者 kura

    (@kura)

    ありがとうございます。
    内容承知しました。
    勉強不足なため WordPress の 範囲と PHPの 範囲の境目がわからずにPHPの細かなことまでお伺いしてしまいました。
    失礼しました。

    頂いた情報で自分なりにトライしてみたいと思います。何とか実現させたい機能でもあるので、解決の努力をしている間はこの書き込みは未解決のままにしておきたいと思います。解決した暁には、ソースを開示したいと思います。

    またhissy様に限らずアドバイスを頂戴できることがあれば、歓迎しますので、引き続き何卒宜しくお願いいたします。

    モデレーター Takuro Hishikawa

    (@hissy)

    スレッドが未解決のまま放置されるのも…。とりあえずアドバイスということで。
    http://php.net/manual/ja/reserved.variables.get.php
    http://php.net/manual/ja/function.mktime.php

    「サイドバーに 該当するイベントが存在した年月のみ表示する」のは諦めたほうがよろしいかと。かなり重い処理になりますしPHP初心者には無理。第一、必要性が分かりません。過去のイベントはページ送りで見れたらいいんじゃないかなぁ。

    トピック投稿者 kura

    (@kura)

    hissy さんありがとうございます。

    教えていただいたサイト拝見して勉強します。

    サイドバーの難易度やはり高いんですね、理解しました。
    でもユーザビリティー的には実装したい昨日なのでもう少し検討します。
    ありがとうございました。

    トピック投稿者 kura

    (@kura)

    現在サイドバーに登録されている年月リストの表示まで可能になりました。
    ソースはこちらを拝借しています。

    http://ja.forums.wordpress.org/topic/3700?replies=7

    しかし、リストをクリックすると2つのパターンで表示コンテンツが表示されません。
    1.ヘッダ、サイドバー、フッタは表示されますが、コンテンツが表示されません。
    2.ヘッダ、サイドバー、フッタは表示されず真っ白な画面になります。

    リンクのパラメータは  /?m=201202  という形です。

    挙動を見ていると 投稿年月日が存在する場合1の状態となり
    投稿年月日が存在しない年月日だと2の状態になります。

    引き続き検証をしていますが、まだ解決の糸口がみつかりません。
    アドバイスを頂戴できれば幸いです。
    (別スレッドを立てたほうが良いのでしょうか?でも同じ悩みをお持ちの方に役立つべく、このスレッドで解決したソースを残したいのでここに書かせていただきました)

    モデレーター Takuro Hishikawa

    (@hissy)

    とりあえず真っ白になった場合はWP_DEBUGをtrueにしてエラーを見てください。

    デバッグ

    「投稿年月日が存在する場合」とは、何の投稿年月日が存在する場合ですか?

    トピック投稿者 kura

    (@kura)

    hissyさん ありがとうございます。デバックモードでログをチェックすることができました。
    data.phpの一部に不具合が見つかり修正したら登録日があるものは表示されるようになりました。

    サイドバーには現在以下の表示がされています。
    ()内の数字は登録記事です。

    2012年3月 (0)
    2012年2月 (3)
    2011年12月 (0)
    2011年11月 (0)

    2月のリストには当然3件イベントが表示されるのですが
    それ以外は白いページになってしまいます。

    実際の登録記事は以下です。
    イベント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

    エラーログも表示されていませんでした。
    2月はブログの投稿日がチェックされて記事を表示しているようですが
    過去のこちらの記事を読む限り カスタムフィールドの値でリストを作り
    該当する記事のみ表示できると読み取ったのですが、そこが上手くいきません。

    http://ja.forums.wordpress.org/topic/3700?replies=7

    これはhissyさんが作ったプログラムではないので、お伺いするのも
    筋違いですね。
    もう少しなんですが、、、

    モデレーター Takuro Hishikawa

    (@hissy)

    リンクではなく、具体的なコードをお示しください。

    記事が存在しない年月日の場合、404になってしまいます。

    と、以前に申し上げました。これを回避するのは難しいと思います。

    トピック投稿者 kura

    (@kura)

    hissyさん。失礼しました。

    少し長くなりますが本日もろもろ検討したことをご報告します。
    (一日中やっていて、だいぶ疲れてしまい、要点を得ないかもしれませんが、、、)

    当初エラーのため白い画面だったのは、デバックにより修正した結果
    404notfondになりました。

    記載したコードは以下です。

    function my_get_archives(){
    	global $wpdb, $wp_locale;
    	$output ='';
    	$ymds = get_post_meta(get_the_ID(), 'startDate');
    	foreach((array)$ymds as $ymd){
    		$ym = explode('-', $ymd);
    		$year = $ym[0];
    		$month = $ym[1];
    		$count = $wpdb->get_var($wpdb->prepare("
    			SELECT COUNT(ID)
    			FROM $wpdb->posts
    			WHERE post_type = 'post' AND post_status = 'publish'
    			AND YEAR(post_date) = $year AND MONTH(post_date) = $month
    			;"));
    		$url = get_month_link($year, $month);
    		$text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($month), $year);
    		$output .= get_archives_link($url, $text, '', '', '&nbsp;('.$count.')<br>');
    	}

    return $output;

    }

    このソースで

    2012年3月 (0)
    2012年2月 (3)
    2011年12月 (0)
    2011年11月 (0)

    という記述まで出来たので、このテキストに貼るリンクを /?event=201102 といったようなリンクとして、引数 201202を 年月に分解しhissyさんに書いていただいたプログラムの変数 from, to にそれぞれ

    2012 を from
    02 を to

    にセットして行きすうとして渡し 該当記事だけを表示できないものかと検討していました。

    しかし、現在fuctions.phpに from, to を以下のように書いていたため
    引数を渡すことが出来ないと考えました。

    $from = strtotime(“now”);
    $to = strtotime(“+1 month”);

    そこで、この引数を渡せるようにfunctionに記載するのではなく、呼び出し元のページである home.php に記載して渡せるか検討しておりました。
    ソースは以下です。

    home.php

    <?php
    	$setfrom = strtotime("now");
        $setto = strtotime("+1 month");
    
    	$setfrom = date( 'Y-m',	$setfrom );
        $setto = date( 'Y-m',	$setto );
    
    	my_event("setfrom=$setfrom&setto=$setto");
    ?>
    
    <?php query_posts(
    	array(
    		'post__in' => $array_post_id,
    		'meta_key' => 'endDate',		//終了日
    		'orderby'  => 'meta_value',
    		'order'    => 'ASC',
    		'posts_per_page' => '5',		//表示件数設定
    		'category_name' => 'private',	//表示するカテゴリ設定()
    	)
    ); ?>

    そしてfunctions.phpには以下のように記載しました。

    function my_event($fromto) {
    
    global $wpdb;
    $afromto = wp_parse_args($fromto);
    $from = $afromto['setfrom'];
    $to = $afromto['setto'];
    
    		$from = explode('-', $from);
    		$fromyear = $from[0];
    		$frommonth = $from[1];
    		$from = mktime(0, 0, 0, $frommonth, 1, $fromyear);
    
    		$to = explode('-', $to);
    		$toyear = $to[0];
    		$tomonth = $to[1];
    		$to = mktime(0, 0, 0, $tomonth, 1, $toyear);
    
    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) );
    
    global $wpdb;
    $array_post_id = array();
    if ( $results ) {
    	foreach ( $results as $result ) {
    		$array_post_id[] = $result->post_id;
    	}
    }
    }

    この状態で テストしたところ、エラーログに以下が記載されました。

    Undefined variable: array_post_id

    from to への変数の渡し方がわからず、functionとして呼び出し
    その変数に入れ込むことで値は何とか渡せたのですが、
    array_post_id のところでエラーが起きてしまい悩んでいるところです。
    ちょっと行き詰ってしまい、疲れ気味です。。。

    考え方がそもそも間違っているのでしょうか。。。

    モデレーター Takuro Hishikawa

    (@hissy)

    考え方を整理しましょう。他人のコードに頼るからこうなります。
    イベントが存在する月とはいかなる状態か?終了日がその月の1日以降で、開始日が翌月の1日未満のイベントが存在する場合、その月にイベントがあると考えられます。my_get_archives関数は記事の公開日を調べていますね。そもそも間違いです。
    イベントが存在する月の一覧を得ようと思えば、すべてのイベントを調べて、最も古い終了日と最も新しい開始日を割り出し、その間のすべての月において、終了日がその月の1日以降で、開始日が翌月の1日未満のイベントが存在するかどうかを調べる必要があるでしょう。

    functions.phpに用意すべき関数は
    1. すべてのイベントの中から最も古い終了日を調べる関数
    2. すべてのイベントの中から最も新しい開始日を調べる関数
    3. 開始月と終了月を引数として渡し、その間のイベントのある月の一覧を出力する関数
    4. 月を引数として渡し、終了日がその月の1日以降で、開始日が翌月の1日未満のイベントのIDを配列で返す引数

    4. に関しては、私が一番はじめに提示したコードで作れますね。
    また、3. の関数から呼び出すことになるでしょう。

    function get_events($from,$to){
    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;
    	}
    }
    
    return $array_post_id
    }
    トピック投稿者 kura

    (@kura)

    hissyさん。ありがとうございます。
    まずは頂いたコメントしっかり理解できるように読み込みます。
    そしてまたトライしてみて結果をご報告します。

    取り急ぎ御礼まで。

    トピック投稿者 kura

    (@kura)

    出来るところから修正しているのですが、
    まずは、4を呼び出す関数を修正しています。

    呼びさす元の関数は以下です。

    home.php

    <?php
    $setfrom = strtotime("now");
    $setto = strtotime("+1 month");
    
    $setfrom = date( 'Y-m',	$setfrom );
    $setto = date( 'Y-m', $setto );
    
    get_events($setfrom,$setto);
    ?>
    
    <?php query_posts(
    	array(
    		'post__in' => $array_post_id,
    		'meta_key' => 'endDate',		//終了日
    		'orderby'  => 'meta_value',
    		'order'    => 'ASC',
    		'posts_per_page' => '5',		//表示件数設定
    		'category_name' => 'private',	//表示するカテゴリ設定()
    	)
    ); ?>

    呼び出される関数は以下としました。

    functions.php

    function get_events($from,$to){
    
    		$from = explode('-', $from);
    		$fromyear = $from[0];
    		$frommonth = $from[1];
    		$from = mktime(0, 0, 0, $frommonth, 1, $fromyear);
    
    		$to = explode('-', $to);
    		$toyear = $to[0];
    		$tomonth = $to[1];
    		$to = mktime(0, 0, 0, $tomonth, 1, $toyear);
    
    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;
    	}
    }
    return $array_post_id;
    }

    この場合以下のエラーが表示されましたが、
    原因がわかりませんでした。

    Undefined variable: array_post_id in home.php on line **

    初歩的な間違いのような気がするのですが、、、
    わかりません。

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