サポート » 使い方全般 » 直近のイベント情報を指定件数表示したい

  • 解決済 kiw

    (@kiw)


    WP2.7.1でイベント情報を掲載するページを製作中なのですが、以下の点でつまづいています。

    タイトル ⇒ イベント名
    本文 ⇒ 説明
    カスタムフィールド
     start : 開始日(ex,5月15日)
     end : 開始日(ex,6月15日
    投稿スラッグ ⇒ 開始日(ex,0515)
    カテゴリー ⇒ 月(ex,5月)

    という風に投稿しています。
    年の概念はなく、毎年同じ期間に開催されるイベントを1年分投稿しています。

    トップページに、今月のカテゴリーの記事を10件というようなことはできたのですが、
    現在の日付以降に開始(開催中も含む)のイベントを10件表示
    というように表示したい場合、そのようなことは可能でしょうか?

    何か良い方法がありましたらご教授いただけると助かります。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • モデレーター jim912

    (@jim912)

    kiwさん、こんにちは。

    開催中も含むという条件が、ネックになっています。
    「開催中も含む」ということは、自動的に「end : 開始日」(終了日の間違い?)が本日以降という条件指定が必要となります。
    しかしながら、ここの入力データは、月日の桁数が2桁に統一されていないようなので、データベースの順列決定が正しくなされません。(2月よりも10月が早いと判断されてしまう。)

    最低限05月08日の様な入力形式としていただく必要があると思われます。また、同様に順列決定に影響するものとして、日付部分の入力を全角・半角のどちらかに必ず統一していただく必要があります。

    jim912様 どうもありがとうございます!
    ご指摘のとおり、end:開始日⇒end:終了日の間違いでした。失礼致しました。。

    仰るように終了月日の入力形式を2桁に統一するか、別途カスタムフィールドで0515のような4桁の形式で入力するようにしたいと思います。

    開始日が本日以降(1日だけのイベントは終了日欄が空白のため) or 終了日が本日以降
     のイベントを、 開始日の順に 指定件数抽出する。(12月の次は1月に戻る)
    という処理で、条件指定はなんとなくわかるのですが、条件に合ったデータの「抽出」の方法がわかりません。。
    いろいろ検索してみましたが、検索の仕方が悪いのか、考え方が悪いのか、ヒントさえも見つかりませんでした。

    よろしければアドバイスをいただけるとありがたいです

    モデレーター jim912

    (@jim912)

    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; ?>

    みたいな感じで記述いただけると表示できると思います。
    表示はリスト形式として、開始日、終了日の出力もしてみましたが、適宜変更してみてください。

    jim912様 どうもありがとうございます!
    おかげさまで完璧に実現しました!
    いや、完璧どころでなく、4桁で入力した日付を0抜きの書式に変換する処理までわざわざご親切に書いていただいて!
    お手数をお掛けして申し訳ありませんでした!本当に助かりました。ありがとうございました!

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「直近のイベント情報を指定件数表示したい」には新たに返信することはできません。