get_events($setfrom,$setto);
を
$array_post_id = get_events($setfrom,$setto);
で◎
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の進化はすごいです。
トピック投稿者
kura
(@kura)
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)
トピック投稿者
kura
(@kura)
hissyさん。ありがとうございます!
変数のスコープという概念について勉強してください。
http://php.net/manual/ja/language.variables.scope.php
読みました。概念は理解しましたが、今回みたいに
home.php から functions.php を指定するなどファイルをまたがると
混乱してしまうようです。。。
SQLを発行する必要はないっぽい
こちらについても 関数リファレンス/WP Query 拝見しました。
まだ完全に理解できていませんが、勉強したいと思います。
まずは、頂いたソースで動作を確認してみます。
トピック投稿者
kura
(@kura)
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' => '<='
)
)
)
);
?>
これで、functions.phpに記載したソースは不要になるのですよね?
そうですね。3.2からの機能だと思います。びっくりしました。
トピック投稿者
kura
(@kura)
ありがとうございます。とてもシンプルで感動しました。
functions.phpに用意すべき関数は
未 1. すべてのイベントの中から最も古い終了日を調べる関数
未 2. すべてのイベントの中から最も新しい開始日を調べる関数
未 3. 開始月と終了月を引数として渡し、その間のイベントのある月の一覧を出力する関数
● 4. 月を引数として渡し、終了日がその月の1日以降で、開始日が翌月の1日未満のイベントのIDを配列で返す引数
さて、あと残された宿題は上記未の記載ですが、これを独自で開発スキルがまだございません。また、怒られてしまうかもしれませんが、今出来るのは皆様のソースをお借りするしかないかと、、、
具体的な記述がまだまだもやもやしておりますが、整理しながら考えてみたいと思います。(本日はこれにて失礼します)
トピック投稿者
kura
(@kura)
現在 アーカイブリストのメニュー用に
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月
)
繰り返さずに 一度で表示する方法がわからなく、お教え頂けないでしょうか。
コードを見ても何をなさろうとしているのかよくわからないのですが、get_post_metaは第3引数でtrueを指定すると、配列ではなく文字列として取得できます。
あと、折角ISO8601形式で日付を保存しているのですから、strtotime関数を使ってタイムスタンプにしてから、date関数で任意の書式に変換する方がスムーズかなと思います。