kiwさん、こんにちは。
開催中も含むという条件が、ネックになっています。
「開催中も含む」ということは、自動的に「end : 開始日」(終了日の間違い?)が本日以降という条件指定が必要となります。
しかしながら、ここの入力データは、月日の桁数が2桁に統一されていないようなので、データベースの順列決定が正しくなされません。(2月よりも10月が早いと判断されてしまう。)
最低限05月08日の様な入力形式としていただく必要があると思われます。また、同様に順列決定に影響するものとして、日付部分の入力を全角・半角のどちらかに必ず統一していただく必要があります。
トピック投稿者
kiw
(@kiw)
jim912様 どうもありがとうございます!
ご指摘のとおり、end:開始日⇒end:終了日の間違いでした。失礼致しました。。
仰るように終了月日の入力形式を2桁に統一するか、別途カスタムフィールドで0515のような4桁の形式で入力するようにしたいと思います。
開始日が本日以降(1日だけのイベントは終了日欄が空白のため) or 終了日が本日以降
のイベントを、 開始日の順に 指定件数抽出する。(12月の次は1月に戻る)
という処理で、条件指定はなんとなくわかるのですが、条件に合ったデータの「抽出」の方法がわかりません。。
いろいろ検索してみましたが、検索の仕方が悪いのか、考え方が悪いのか、ヒントさえも見つかりませんでした。
よろしければアドバイスをいただけるとありがたいです
kiwさん、こんにちは。
カスタムフィールドの名前を開始日が「start」、終了日が「end」とし、入力形式を投稿スラッグと同じ4桁の半角数字としていただくとして、
テーマのfunctions.phpに
function get_latest_events( $limit = 10 ) {
global $wpdb;
$today = date( 'md' );
$limit = (int)$limit;
$time_point = "
AND ( ( b.meta_key = 'start'
AND b.meta_value >= '$today'
)
OR ( b.meta_key = 'end'
AND b.meta_value >= '$today'
)
)";
$sql_head = "
SELECT DISTINCT a.*
FROM $wpdb->posts as a,
$wpdb->postmeta as b
WHERE a.ID = b.post_id
AND a.post_type = 'post'
AND a.post_status = 'publish'
";
$sql_foot_base = "
ORDER BY a.post_name
LIMIT %d";
$sql_foot = $wpdb->prepare( $sql_foot_base, $limit );
$events = $wpdb->get_results( $sql_head . $time_point . $sql_foot );
if ( $limit > count( $events ) ) {
$short = $limit - count( $events );
$sql_foot = $wpdb->prepare( $sql_foot_base, $short );
$has_start_meta = "
AND b.meta_key = 'start'
";
$next_year_events = $wpdb->get_results( $sql_head . $has_start_meta . $sql_foot );
if ( $events && $next_year_events ) {
$event_ids = array();
foreach ( $events as $event ) {
$event_ids[] = $event->ID;
}
foreach ( $next_year_events as $key => $next_year_event ) {
if ( in_array( $next_year_event->ID, $event_ids ) ) {
unset( $next_year_events[$key] );
}
}
}
$events = array_merge( $events, $next_year_events );
}
return $events;
}
function convert_event_day( $md ) {
if ( ! preg_match( '/^[\d]{4}$/', $md ) ) {
echo wp_specialchars( $md );
return;
}
$month = ltrim( substr( $md, 0, 2 ), '0' );
$day = ltrim( substr( $md, 2, 2 ), '0' );
echo $month . '月' . $day . '日';
}
を追加いただき、トップページのテンプレートに
<?php $latest_events = get_latest_events(); if ( $latest_events ) : ?>
<ul>
<?php foreach ( $latest_events as $latest_event ) :
$start_day = get_post_meta( $latest_event->ID, 'start', true );
$end_day = get_post_meta( $latest_event->ID, 'end', true );
$end_day = $end_day ? $end_day : $start_day;
?>
<li><a href="<?php echo get_permalink( $latest_event->ID ); ?>" title="<?php echo attribute_escape( strip_tags( $latest_event->post_title ) ); ?>"><?php echo wp_specialchars( strip_tags( apply_filters( 'the_title', $latest_event->post_title ) ) ); ?></a><span class="event_start">開始日:<?php convert_event_day( $start_day ); ?></span><span class="event_end">終了日:<?php convert_event_day( $end_day ); ?></span></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
みたいな感じで記述いただけると表示できると思います。
表示はリスト形式として、開始日、終了日の出力もしてみましたが、適宜変更してみてください。
トピック投稿者
kiw
(@kiw)
jim912様 どうもありがとうございます!
おかげさまで完璧に実現しました!
いや、完璧どころでなく、4桁で入力した日付を0抜きの書式に変換する処理までわざわざご親切に書いていただいて!
お手数をお掛けして申し訳ありませんでした!本当に助かりました。ありがとうございました!