PHP:变量/值仅在循环内可用 - 在外面使用它?

时间:2012-10-05 07:02:07

标签: php wordpress loops while-loop

我已经在wordpress.stackexchange.com上问了这个问题,但他们告诉我这是一个简单的PHP问题,可能与wordpress无关。

我写的函数有一个相当大的问题......

该功能会列出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循环中可用。

目前上面的函数输出了这个......

<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_meta“event_date”仅在循环内可用。如何将“event_date”与当前年份进行比较,并将查询结果包装成新的ul

像这样...

<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中并不是那么好,也不知道如何处理它。

如果有人有想法,请告诉我!提前谢谢!

1 个答案:

答案 0 :(得分: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>';