web-dev-qa-db-fra.com

Archive de type de publication personnalisée triée et groupée par date dans le champ méta post

J'essaie de créer un type de publication personnalisé pour afficher des informations sur les événements. Le type de publication personnalisé a 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, je voudrais voir un regroupement comme:

2019

Mars

  • Titre de l'événement débutant en mars
  • Titre d'un autre événement débutant en mars

Mai

  • 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 articles par date de publication, plutôt par 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 sur la façon d'y parvenir!

1
Ole Kristian Losvik

OK, donc ce problème a deux parties:

  1. Faites WordPress pour trier ces messages correctement.
  2. Faites WordPress pour les afficher avec tout ce regroupement.

1. Tri du 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' );
    }
} );

Alors maintenant, les événements seront triés par ordre croissant de start_date.

2. Affichage et regroupement

Vous devrez modifier le archive-event.php file, afin que ces événements se retrouvent dans leurs groupes.

<?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; ?>
2
Krzysiek Dróżdż

Basé sur le code de @ krzysiek-dróżdż my archive-eventi.php est maintenant comme ci-dessous. L'afficher ici au cas où quelqu'un d'autre essaie 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();
0
Ole Kristian Losvik