web-dev-qa-db-ja.com

投稿メタフィールドの日付でソートおよびグループ化されたカスタム投稿タイプアーカイブ

イベントに関する情報を表示するためのカスタム投稿タイプを作成しようとしています。カスタム投稿タイプの名前は「Event」で、次のメタフィールドがあります。

  • event_startdate (形式YYYY-MM-DDの日付)
  • event_enddate (YYYY-MM-DD形式の日付)

これは単一イベントのリストでは問題なく機能しますが、アーカイブリストでは、次のようなグループを作成したいと考えています。

2019年

行進

  • 3月に始まるイベントのタイトル
  • 3月に始まる別のイベントのタイトル

五月

  • 5月のイベントのタイトル

12月

  • クリスマスイベントのタイトル

2020

1月

  • 2020年ビジョンイベントのタイトル

Wp_get_archives()の使用に関していくつかの質問と回答を見つけましたが、これは投稿をイベントの実際の日付(event.startdate)ではなく、公開された日付でグループ化しているようです。また、メタ値による並べ替えに関する投稿もいくつか見つかりましたが、グループ化はしていません。これを達成するためのアドバイスやヒントを事前にありがとう!

1

OK、この問題には2つの部分があります。

  1. WordPressを作成して、これらの投稿を適切にソートします。
  2. WordPressを作成して、それらすべてをグループ化して表示します。

1.アーカイブのCPTをメタ値でソート

これを実現するには、pre_get_postsを使用できます。

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' );
    }
} );

したがって、イベントはstart_dateで昇順にソートされます。

2.表示とグループ化

これらのイベントがグループに入るように、archive-event.phpファイルを変更する必要があります。

<?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żのコードに基づいて、私のarchive-eventi.phpは次のようになります。他の誰かが同じことを達成しようとしている場合に備えて、ここに投稿してください。イベントのカスタム投稿タイプの名前は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