0

私はすでにこの質問をしましwordpress.stackexchange.comたが、これは単純なPHPの質問であり、ワードプレスとは何の関係もないかもしれないと彼らは私に言いました。

自分が書いた関数にかなり大きな問題があります…</p>

この関数は、「イベント」のすべてpostsを一覧表示します。custom-post-type

function get_event_list( $latest = true, $order = 'ASC' ) {
    echo '<ul class="event-items">';

    $yesterday = time() - 24*60*60;
    $compare = $latest ? '>' : '<';
    $current_year = '';

    $args = array(
        'post_type' => 'wr_event',
        'posts_per_page' => -1, // show all posts
        'meta_key' => 'event_date',
        'orderby' => 'meta_value_num',
        'order' => $order,
        'meta_value' => $yesterday,
        'meta_compare' => $compare
    );

    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post();
        global $post;
        $this_year = get_post_meta( $post->ID, 'event_date', true );
        $this_year = date('Y', $this_year);

        if ( !$latest && ( $this_year != $current_year ) ) :
            // new year, output the year header
            // and reset current year to this new value
            echo '<li class="wrapper year"><h2>' . $this_year . '</h2></li>';
            $current_year = $this_year;
        endif;

        get_template_part( 'inc/event', 'item' ); // creates the actual li-item
    endwhile;
    wp_reset_postdata();
    echo '</ul>';
}

ご覧のとおり、「イベントの日付」を現在の年と比較しているので、リストを異なる年に分割できます。私が抱えている問題は、これはループget_post_meta( $post->ID, 'event_date', true );内でのみ利用可能であるということです。while

現在、上記の関数はこれを出力します…</ p>

<ul class="event-items">
   <li class="year">2012</li>
   <li>Event 05</li>
   <li>Event 04</li>
   <li>Event 03</li>
   <li>Event 02</li>
   <li>Event 01</li>
   <li class="year">2011</li>
   <li>Event 03</li>
   <li>Event 02</li>
   <li>Event 01</li>
   <li class="year">2010</li>
   <li>Event 04</li>
   <li>Event 03</li>
   <li>Event 02</li>
   <li>Event 01</li>
</ul>

ただし、この構造は使用がかなり複雑であり、意味的には実際には正しくなく、有用ではありません。

毎年新しいものにまとめたいと思い<ul>ます。

そうする方法はありますか?「post_metaevent_date」はループ内でのみ使用できます。「event_date」を現在の年と比較して、クエリされた結果を新しいものにラップするにはどうすればよいですか。ul

そのように…</p>

<ul class="event-items">
    <li class="year"><div>2012</div>
        <ul>
            <li>Event 05</li>
            <li>Event 04</li>
            <li>Event 03</li>
            <li>Event 02</li>
            <li>Event 01</li>
        </ul>
    </li>
    …
</ul>

たぶん、これに対する良い論理的な解決策を知っている人がいるでしょう。get_posts()代わりに使用する必要があるかもしれませnew WP_Queryんが、PHPはそれほど得意ではなく、これをどのように処理できるかわかりません。

誰かアイデアがあれば教えてください!前もって感謝します!

4

1 に答える 1

2

これを試して

while ( $loop->have_posts() ) : $loop->the_post();
  global $post;
  $this_year = get_post_meta( $post->ID, 'event_date', true );
  $this_year = date('Y', $this_year);

  if ( !$latest && ( $this_year != $current_year ) ) :
    // new year, output the year header
    // and reset current year to this new value
    if ($current_year != '') echo '</ul></li>';
    echo '<li class="wrapper year"><div>' . $this_year . '</div><ul>';
    $current_year = $this_year;
  endif;
  echo '<li>';
  get_template_part( 'inc/event', 'item' ); // creates the actual li-item
  echo '</li>';
endwhile;
if ($current_year != '') echo '</ul></li>';
于 2012-10-05T07:08:50.197 に答える