Пользовательский тип Post 'Event': хронологический список повторяющихся событий от meta_values ​​в массиве

wordpress.stackexchange https://wordpress.stackexchange.com/questions/11842

Вопрос

У меня есть пользовательские события типа «Пост». Каждое событие (пост) может иметь несколько дат. Даты (дата, время, местоположение) хранятся как массив. мне нужен запрос, который создает хронологический список всех событий Из метаданных (события могут происходить несколько раз).

Комплексная мета-яблока выглядит следующим образом:

Add Dates

Полученная запись базы данных в WP_Postmeta имеет meta_key '_events_termine' со следующим meta_value (Используя wpalchemy):

a:1:{s:12:"termin_group";a:2:{i:0;a:3:{s:11:"termin_date";s:10:"2011/03/14";s:11:"termin_time";s:5:"19.30";s:15:"termin_location";s:15:"Max-Reger-Halle";}i:1;a:3:{s:11:"termin_date";s:10:"2011/03/15";s:11:"termin_time";s:5:"20.00";s:15:"termin_location";s:15:"Max-Reger-Halle";}}}

Я отображаю даты для одного события со следующим кодом:

<table>
    <?php global $events_meta_termine;
    $meta = get_post_meta(get_the_ID(), $events_meta_termine->get_the_id(), TRUE);
    foreach ($meta['termin_group'] as $termin)
    { ?>
    <tr>
      <td><?php echo mysql2date('D', $termin['termin_date'], true); ?></td>
      <td><?php echo mysql2date('j. F Y', $termin['termin_date'], true); ?></td>
      <td><?php echo $termin['termin_time']; ?> Uhr</td>
      <td><?php echo $termin['termin_location']; ?></td>
    </tr>
    <?php } ?>
</table>

Вывод выглядит так:

Output

Таким образом, все работает нормально, за исключением того, что я понятия не имею, как создать страницу, на которой перечислены все события (название, дата, местоположение) в хронологическом порядке, где одно событие может произойти несколько раз.

Любая помощь высоко ценится!

(Извините, я задавал аналогичный вопрос раньше, но я пришел в тупик и должен был начать все сначала.)

Это было полезно?

Решение

Вот код, который наконец сработал для меня:

<?php 
global $events_meta_termine;
$today = getdate();
$my_query = new WP_Query('post_type=events&posts_per_page=-1&monthnum='.$today["mon"]);
$events=array();
while ($my_query->have_posts()) : $my_query->the_post();
    $do_not_duplicate = $post->ID;
    $meta = get_post_meta(get_the_ID(), $events_meta_termine->get_the_id(), TRUE);
    foreach ($meta['termin_group'] as $termin)
    { 
        $event=array();
        $event['title']=get_the_title();
        $event['date']=$termin['termin_date'];
        $event['time']=$termin['termin_time'];
        $event['location']=$termin['termin_location'];
        $events[]=$event;
    } 
endwhile; 
wp_reset_query();

$i=0;
usort($events, "cmp"); 
function cmp($a, $b){ 
return strcmp($a['date'],$b['date']); 
} ?>

<table>
<?php $current_month='';
 foreach ($events as $event){   
     if ($current_month!=mysql2date('F Y', $event['date'], true))
     {
         $current_month=mysql2date('F Y', $event['date'], true);
         echo '<tr><td colspan="5">'.$current_month.'</td></tr>';
     } ?>
    <tr>
      <td><?php echo $event['title']; ?></td>
      <td><?php echo mysql2date('D', $event['date'], true); ?></td>
      <td><?php echo mysql2date('j. F Y', $event['date'], true); ?></td>
      <td><?php echo $event['time']; ?> Uhr</td>
      <td><?php echo $event['location']; ?></td>
    </tr>
<?php } ?>
</table>

Другие советы

Кристоф,

Чтобы создать основную страницу, которая перечисляет все (страница> События) ... Вам нужно создать свой собственный «цикл» ... см. Кодекс для Петля ...

После того, как вы это сделаете, тогда код, который у вас есть выше, можно изменить на что -то вроде следующего:

global $events_meta_termine;

$my_query = new WP_Query([GET-ONLY-THE-PAGES-THAT-USE-THE-META-BOX]);

while ($my_query->have_posts())
{
    $my_query->the_post();

    // echo page stuff

    $meta = $events_meta_termine->the_meta(get_the_ID());

    foreach ($meta['termin_group'] as $termin) 
    {
        // echo event stuff (for the current page)
    }
}

Ревизия

Несмотря на то, что приведенный выше пример позволит вам перечислить все события на одной странице, он не был бы хронологическим ... вам может потребоваться профильтировать данные перед перечислением их на странице, например, создание пользовательского массива который учитывает страницы и каждое из событий на страницу и их даты. Вам нужно будет поднять дату и сделать некоторую сортировку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top