« Événement » Type message personnalisé: Liste chronologique des événements récurrents de valeurs méta en tableau
-
16-10-2019 - |
Question
i ont un type de poste personnalisé 'événements'. Chaque événement (post) peut avoir plusieurs dates. Les dates (date, heure, lieu) sont stockés sous forme de tableau. Je besoin d'un requête qui crée une liste chronologique de tous les événements à partir des données méta (événements peuvent se produire plusieurs fois).
Les regards méta-boîte personnalisée comme ceci:
L'entrée de base de données résultant en wp_postmeta a la meta_key
'_events_termine' avec la meta_value
suivante (en utilisant 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";}}}
afficher les dates pour un événement unique avec le code suivant:
<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>
Les regards de sortie comme ceci:
Donc, tout fonctionne bien sauf que je ne sais pas comment créer une page qui répertorie tous les événements (titre, date, lieu) dans l'ordre chronologique où un seul événement peut se produire plusieurs fois.
Toute aide est très appréciée!
(je suis désolé j'ai posé une question similaire avant, mais je suis arrivé à une impasse et a dû recommencer.)
La solution
Voici le code qui a finalement fonctionné pour moi:
<?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>
Autres conseils
Christoph,
Pour créer une page principale qui répertorie tous les (page> événements) ... vous devez créer votre propre "Loop" ... voir le codex pour The Loop ...
Une fois que vous avez fait cela, alors le code que vous avez ci-dessus pourrait être modifié à quelque chose comme ce qui suit:
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)
}
}
Révision
Bien que l'exemple ci-dessus vous permettra de lister tous les événements sur une seule page, il ne serait pas chronologique ... vous devrez peut-faire du filtrage des données avant l'inscription sur la page, par exemple la construction d'un tableau personnalisé qui prend en compte les pages et chacun des événements par page et leurs dates. Vous devez entrer hors de la date et faire un peu de tri.