• お世話になります。

    今回イベント情報ページを作成していて、イベントの開催日をカスタムフィールドに入力し、その日付順にイベント情報カテゴリの一覧をソートしたいと考えています。

    下記のページを参考に作っていたのですが、どうしてもカテゴリ一覧と組み合わせる方法がわかりません。
    どなたかご教授いただけないでしょうか?

    よろしくお願い致します。

    参考ページ:
    【イベントの日付をカスタムフィールドで入力し、ソートしたい】
    http://ja.forums.wordpress.org/topic/3570

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック投稿者 midorit54

    (@midorit54)

    すいません、追記です。
    下記までたどり着けましたが、同じ投稿が繰り返し表示されてしまいます。

    例)※日付はカスタムフィールドに入力した値です。
    2012年4月17日 イベントタイトル
    2012年4月17日 イベントタイトル
    2012年4月17日 イベントタイトル
    2012年4月17日 イベントタイトル

    あと少しで理想の形にたどり着けるのですが、どこが間違っているのかがわかりません。
    単純なミスかもしれませんが、どなたか教えていただけますでしょうか?

    <?php
    /*
    Template Name: テストフォーム
    */
    get_header(); ?>
    
        <div id="main_content">
            <div class="breadcrumbs"><?php get_breadcrumbs(); ?></div>
            <br clear="all">
            <section class="page">
                                  <h1 id="page_title"><?php the_title(); ?></h1>
                                         <?php the_content(); ?>
    <ul>
    <?php $posts = get_posts('cat=8&numberposts=10'); global $post; ?>
    <?php foreach($posts as $post): ?>
    
    <?php
      $timesorts = array();
        while (have_posts()) : the_post();
          //カスタムフィールドの年・月・日を1つにまとめる。
          $eyear = get_post_meta($post->ID, 'event_year', true);
          $emonth = get_post_meta($post->ID, 'event_month', true);
          $eday = get_post_meta($post->ID, 'event_day', true);
          $eventday = date("Y/m/d", mktime( 0, 0, 0, $emonth, $eday, $eyear));
    
          //日本語曜日を作る。
          $week_array = array( "日", "月", "火", "水", "木", "金", "土" );
          $ptimestamp = mktime(0, 0, 0, $emonth, $eday, $eyear);
          $weekno = date('w', $ptimestamp);
          $weekjp = $week_array[$weekno];
    
          $timesorts[$ptimestamp] =
            "<li>$eventday($weekjp) <a href=\"" . get_permalink($post->ID) . '">' .
            get_the_title($post->ID) . '</a></li>';
        endwhile;
    
      //ソート
      krsort($timesorts);
      echo implode("\n", $timesorts);
      //ソート終了
      ?>
      <?php endforeach; ?>
      </ul>
            </section>
        </div>
        </div>
    
    <?php get_footer(); ?>

    foreachでループさせている中で、さらにwhileでループさせているのが原因です。
    foreachは残して、while (have_posts()) : the_post();を削除しましょう。
    現状では、$timesorts = array();で、ループされる度にソート用に作成した配列が初期化されてしまうので、これをループの外側に出します。
    ソートと出力もループの外側で1回だけ行います。

    $week_array = array( “日”, “月”, “火”, “水”, “木”, “金”, “土” );もループの外側で1回作成すれば十分ですので、これもついでにループから出します。
    global $post;を何の為に記述したのか分かりませんが、たぶん不要です。

    全体的に次のような流れになりますので、細かい所は適宜修正してください。

    <?php
    $posts = get_posts('cat=8&numberposts=10');
    $timesorts = array();
    $week_array = array( "日", "月", "火", "水", "木", "金", "土" );
    foreach($posts as $post):
    	//カスタムフィールドの年・月・日を1つにまとめる。
    	$eyear = get_post_meta($post->ID, 'event_year', true);
    	$emonth = get_post_meta($post->ID, 'event_month', true);
    
            /* 中略 ... */
    
    	$timesorts[$ptimestamp] = "<li>$eventday($weekjp) <a href=\"" . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a></li>';
    endforeach;
    //ソート
    krsort($timesorts);
    echo implode("\n", $timesorts);
    //ソート終了
    ?>
    </ul>

    一応注意点ですが、年月日を配列のキーにしていますので、同じ日付のイベントがある場合、一つしか表示されません。

2件の返信を表示中 - 1 - 2件目 (全2件中)

トピック「カスタムフィールドを使ってイベントの日付順にソートする方法」には新たに返信することはできません。