期間のあるイベントの表示方法
-
イベント掲載方法の参考に過去記事を拝見して勉強しました。
本も購入して勉強したのですが、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 を表示このような機能を実現したくお教え頂ければ幸いです。
-
自分は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; ?>恐れ入りますが お教え頂きたくお願い致します。
だいぶ端折って書いてるので、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)); ?>
このソースで表示したところ、登録されているデータが全て登録順で表示されていました。私の記載方法や不備がありましたら、お教え頂ければ幸いです。
お手数をおかけして申し訳ありません。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 が 本日(もしくは今月)以降のイベント の表示となります。スキルがなく、ご迷惑をおかけして大変申し訳ありません。
何卒宜しくお願い致します。もろもろテストをしたのですが、
表示すると前件表意じされてしまっている状態です。
作者さまは動作確認されているとのことなので、
私に不備があるかと思いますが、特定できず困っています。どなたか上記(御教え頂いた)スクリプトで動く方法をお教え頂ければ幸いです。
現時点でできていないのは
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この表示をするために、最初にお教え頂いたソースで実装可能でしょうか?
恐れ入りますが、宜しくお願い致します。何がなんだか分からず質問されているように思いますので、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 の指定方法が間違っているように思えるのですが、
どのように改善したらよいのか、見出せていません。dateの第二引数に渡すのはタイムスタンプです。PHPマニュアルを見てください。
$to = date('Ymd');
これだと日付文字列になっちゃいます。このコードのまま使いたいなら、mktimeを使うなど、タイムスタンプで渡してください。そして、アーカイブの年月日を取得してというのは、良くないやり方ですね。記事が存在しない年月日の場合、404になってしまいます。私はgetで年月日のパラメータを渡す方法を取りました。
- トピック「期間のあるイベントの表示方法」には新たに返信することはできません。