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

  • イベント掲載方法の参考に過去記事を拝見して勉強しました。
    本も購入して勉強したのですが、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 を表示 

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

9件の返信を表示中 - 31 - 39件目 (全39件中)
  • get_events($setfrom,$setto);

    $array_post_id = get_events($setfrom,$setto);
    で◎

    モデレーター Takuro Hishikawa

    (@hissy)

    Undefined variable: array_post_id in home.php
    array_post_idという変数が定義されていません、というエラーです。

    こうすれば直ります。
    $array_post_id = get_events($setfrom,$setto);

    変数のスコープという概念について勉強してください。
    http://php.net/manual/ja/language.variables.scope.php

    と、この回答を書いているうちにCodexのWP_Queryのページを見ていて、今のバージョンだとSQLを発行する必要はないっぽいですね…。当時苦労したのになぁ…。
    関数リファレンス/WP Query

    query_posts(
    	array(
    		'meta_query' => array(
    			array(
    				'key' => 'endDate',
    				'value' => '2012-03-01',
    				'compare' => '<'
    			),
    			array(
    				'key' => 'startDate',
    				'value' => '2012-02-01',
    				'compare' => '>='
    			)
    		)
    	)
    )

    WordPressの進化はすごいです。

    kzさん ありがとうございます。
    修正したら、期待通りの動きとなりました。

    この場をお借りして恐縮ですが、
    http://ja.forums.wordpress.org/topic/3700?replies=7
    このスレッドで提供されたスクリプトで生成された 年月リストからの
    リンク先には、カスタムフィールドの値でアーカイブページに表示されるのではなく
    記事の投稿年月で表示されるのでしょうか?

    生成されたリスト(カスタムフィールドのstarDateで生成)
    2012年3月 (0)
    2012年2月 (3)
    2011年12月 (0)
    2011年11月 (0)

    実際の登録記事は以下です。
    イベントA startDate:2011-11-01 endDate: 2012-05-01(投稿日 2010/2/1)
    イベントB startDate:2011-12-01 endDate: 2012-01-01(投稿日 2012/2/1)
    イベントC startDate:2012-02-01 endDate: 2012-05-01(投稿日 2012/2/1)
    イベントD startDate:2012-03-01 endDate: 2012-06-01(投稿日 2012/2/1)

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

    変数のスコープという概念について勉強してください。
    http://php.net/manual/ja/language.variables.scope.php

    読みました。概念は理解しましたが、今回みたいに
    home.php から functions.php を指定するなどファイルをまたがると
    混乱してしまうようです。。。

    SQLを発行する必要はないっぽい

    こちらについても 関数リファレンス/WP Query 拝見しました。

    まだ完全に理解できていませんが、勉強したいと思います。
    まずは、頂いたソースで動作を確認してみます。

    hissy さん。

    頂いたソースを少し調整し、以下のとおりhome.phpに実装したら
    条件にマッチしたイベントを抽出できました。
    楽ですね。
    これで、functions.phpに記載したソースは不要になるのですよね?

    <?php
    
    	$setfrom = strtotime("now");
        $setto = strtotime("+1 month");
    
    	$setfrom = date( 'Y-m-1', $setfrom );
        $setto = date( 'Y-m-1', $setto );
    
        query_posts(
    	array(
    		'meta_query' => array(
    			array(
    				'key' => 'endDate',
    				'value' => $setto,
    				'compare' => '>='
    			),
    			array(
    				'key' => 'startDate',
    				'value' => $setfrom,
    				'compare' => '<='
    			)
    		)
    	)
    );
    ?>
    モデレーター Takuro Hishikawa

    (@hissy)

    これで、functions.phpに記載したソースは不要になるのですよね?

    そうですね。3.2からの機能だと思います。びっくりしました。

    ありがとうございます。とてもシンプルで感動しました。

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

    さて、あと残された宿題は上記未の記載ですが、これを独自で開発スキルがまだございません。また、怒られてしまうかもしれませんが、今出来るのは皆様のソースをお借りするしかないかと、、、

    具体的な記述がまだまだもやもやしておりますが、整理しながら考えてみたいと思います。(本日はこれにて失礼します)

    現在 アーカイブリストのメニュー用に
    starDate から年月日リストを作成するプログラムを書いています。
    starDate が重複する可能性があったので、重複を削除して表示したく
    削除までは関数がわかったのですが、表示が思うようにいきません。

     

    function my_get_archives(){
    
    	global $wpdb, $wp_locale ,$cktext;
    	$ymds = get_post_meta(get_the_ID(), 'startDate');
    	foreach((array)$ymds as $ymd){
    		$ym = explode('-', $ymd);
    		$year = $ym[0];
    		$month = $ym[1];
    		$text = "{$year}年{$month}月<br>";
    		$cktext[]=$text;
    		$uniqtext=array_unique($cktext);
    	}
    	print_r($uniqtext);
    }

    呼び出し元には以下を記載

    <?php
    query_posts('');
    if(have_posts()) :
      while(have_posts()) :
        the_post();
        echo my_get_archives();
      endwhile;
    endif;
    wp_reset_query();
    ?>

    表示はこのようになります。

    Array ( [0] => 2011年11月
    ) Array ( [0] => 2011年11月
    [2] => 2012年03月
    ) Array ( [0] => 2011年11月
    [2] => 2012年03月
    ) Array ( [0] => 2011年11月
    [2] => 2012年03月
    [4] => 2012年02月
    ) Array ( [0] => 2011年11月
    [2] => 2012年03月
    [4] => 2012年02月
    [5] => 2011年12月
    ) Array ( [0] => 2011年11月
    [2] => 2012年03月
    [4] => 2012年02月
    [5] => 2011年12月
    )

    繰り返さずに 一度で表示する方法がわからなく、お教え頂けないでしょうか。

    モデレーター Takuro Hishikawa

    (@hissy)

    コードを見ても何をなさろうとしているのかよくわからないのですが、get_post_metaは第3引数でtrueを指定すると、配列ではなく文字列として取得できます。
    あと、折角ISO8601形式で日付を保存しているのですから、strtotime関数を使ってタイムスタンプにしてから、date関数で任意の書式に変換する方がスムーズかなと思います。

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