WordPress : Archive de type de publication personnalisée triée et regroupée par date dans le champ méta de la publication
J’essaie de créer un type de message personnalisé pour afficher des informations sur les événements. Le type de message personnalisé porte le nom « Événement », avec les champs méta suivants :
- event_startdate (date au format AAAA-MM-JJ)
- event_enddate (date au format AAAA-MM-JJ)
Cela fonctionne bien pour la liste des événements uniques, mais dans la liste des archives, j’aimerais voir un regroupement comme :
2019
Mars
- Titre de l’événement commençant en mars
- Titre d’un autre événement commençant en mars
Peut
- Titre de l’événement de mai
Décembre
- Titre de l’événement de Noël
2020
Janvier
- Titre de l’événement vision 2020
J’ai trouvé quelques questions et réponses sur l’utilisation de wp_get_archives(), mais cela semble regrouper les messages par date de publication, plutôt que sur la date réelle de l’événement (event.startdate). J’ai également trouvé des articles sur le tri par métavaleur, mais pas sur le regroupement. Merci d’avance pour tout conseil ou astuce pour y parvenir !
Solution n°1 trouvée
Basé sur le code de @krzysiek-dró?d? mon archive-eventi.php
est maintenant comme ci-dessous. Publiez-le ici au cas où quelqu’un d’autre essaierait de réaliser la même chose. Notez que le type de publication personnalisé de l’événement est nommé eventi
.
<?php
/**
* The template for displaying event archive
*
* @package Eventi
* @since 1.0.0
*/
get_header();
?>
<section id="primary" class="content-area">
<main id="main" class="site-main">
<?php
if ( have_posts() ) :
?>
<header class="page-header">
<?php
the_archive_title( '<h1 class="page-title">', '</h1>' );
?>
</header><!-- .page-header -->
<?php
// Start the Loop.
$args = [
'post_status' => 'publish',
'post_type' => 'eventi',
'posts_per_page' => 100,
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_type' => 'DATE',
'meta_key' => 'eventi_startdate',
];
$posts = new WP_Query( $args );
$current_year = '';
$current_month = '';
while ( $posts->have_posts() ) {
?>
<article id="event-<?php the_ID(); ?>" <?php post_class(); ?>>
<div class="entry-content">
<?php
$posts->the_post();
$post_id = get_the_id();
$startdate = strtotime( get_post_meta( $post_id, 'eventi_startdate', true ) );
$enddate = strtotime( get_post_meta( $post_id, 'eventi_enddate', true ) );
$dateformat = get_option( 'date_format' );
$last_year = $current_year;
$last_month = $current_month;
$current_year = date_i18n( 'Y', $startdate );
if ( $last_year != $current_year ) {
$last_month = '';
}
$current_month = date_i18n( 'F', $startdate );
if ( $last_year != $current_year ) {
echo '<h2>' . $current_year . '</h2>';
}
if ( $last_month != $current_month ) {
echo '<h3>' . $current_month . '</h3>';
}
$post_id = get_the_ID();
if ( is_sticky() && is_home() && ! is_paged() ) {
printf( '<span class="sticky-post">%s</span>', _x( 'Featured', 'post', 'eventi' ) );
}
echo '<a href="' . esc_url( get_permalink() ) . '" class="event-details-link">' . get_the_title() . '</a>';
echo ' — ' . get_the_excerpt();
// Date and times
echo ' — ' . date_i18n( $dateformat, $startdate );
if ( $startdate !== $enddate ) {
echo ' - ' . date_i18n( $dateformat, $enddate );
}
?>
</div>
</article>
<?php
}
wp_reset_postdata();
// If no content, include the "No posts found" template.
else :
?>
<section class="no-results not-found">
<header class="page-header">
<h1 class="page-title"><?php _e( 'No events yet!', 'eventi' ); ?></h1>
</header><!-- .page-header -->
<div class="page-content">
<?php
if ( current_user_can( 'publish_posts' ) ) :
printf(
'<p>' . wp_kses(
/* translators: 1: link to WP admin new post page. */
__( 'Ready to publish your first event? <a href="%1$s">Get started here</a>.', 'eventi' ),
array(
'a' => array(
'href' => array(),
),
)
) . '</p>',
esc_url( admin_url( 'post-new.php?post_type=eventi' ) )
);
else :
?>
<p><?php _e( 'It seems we can’t find any events.', 'eventi' ); ?></p>
<?php
endif;
?>
</div><!-- .page-content -->
</section><!-- .no-results -->
<?php
endif;
?>
</main><!-- #main -->
</section><!-- #primary -->
<?php
get_footer();
Solution n°2 trouvée
OK, donc ce problème a deux parties:
- Faites en sorte que WordPress trie correctement ces messages.
- Créez WordPress pour les afficher avec tout ce regroupement.
1. Tri CPT par méta-valeur dans l’archive
Vous pouvez utiliser pre_get_posts
pour y parvenir.
add_action( 'pre_get_posts', function ( $query ) {
if ( is_post_type_archive( 'event' ) && $query->is_main_query() ) {
$query->set( 'orderby', 'meta_value' );
$query->set( 'order', 'ASC' );
$query->set( 'meta_key', 'event_startdate' );
}
} );
Désormais, les événements seront triés par ordre croissant de start_date.
2. Affichage et regroupement
Vous devrez modifier le archive-event.php
fichier pour que ces événements soient regroupés.
<?php
$current_year = $current_month = '';
while ( have_posts() ) :
the_post();
$last_year = $current_year;
$last_month = $current_month;
$current_year = date( 'Y', strtotime( get_post_meta( get_the_ID(), 'event_startdate', true ) ) );
if ( $last_year != $current_year ) {
$last_month = '';
}
$current_month = date( 'F', strtotime( get_post_meta( get_the_ID(), 'event_startdate', true ) ) );
?>
<?php if ( $last_year != $current_year ) : ?><h2><?php echo $current_year; ?></h2><?php endif; ?>
<?php if ( $last_month != $current_month ) : ?><h3><?php echo $current_month; ?></h3><?php endif; ?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php endwhile; ?>
0 commentaire