WordPress : Archive de type de publication personnalisée triée et regroupée par date dans le champ méta de la publication

Publié par Jean-Michel le

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.phpest 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 '&nbsp;&nbsp;&mdash;&nbsp;&nbsp;' . get_the_excerpt();

                // Date and times


                echo '&nbsp;&nbsp;&mdash;&nbsp;&nbsp;' . 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&rsquo;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:

  1. Faites en sorte que WordPress trie correctement ces messages.
  2. 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_postspour 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.phpfichier 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; ?>

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *