在帖子元字段中按日期排序和分组的自定义帖子类型档案

时间:2019-02-17 作者:Ole Kristian Losvik

我正在尝试构建一个自定义的帖子类型,用于显示有关事件的信息。自定义帖子类型的名称为“Event”,包含以下元字段:

事件开始日期(格式为YYYY-MM-DD的日期)

  • 事件结束日期(格式为YYYY-MM-DD的日期)
    • 这对于单个事件列表很好,但是在存档列表中我希望看到如下分组:

      2019年3月开始的活动名称3月开始的另一个活动名称3月开始的另一个活动名称5月开始的2020年视觉活动名称我发现了一些问题和答案在使用wp\\u get\\u archives()时,然而,这似乎是根据发布日期对帖子进行分组,而不是根据事件的实际日期(event.startdate)。我还发现了一些关于按元值排序的帖子,但没有分组。提前感谢您提供有关如何完成此任务的任何建议或提示!

  • 2 个回复
    最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

    好的,这个问题有两部分:

    使用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\\u 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; ?>
    

    SO网友:Ole Kristian Losvik

    基于@krzysiek dródżmy的代码archive-eventi.php 现在如下所示。把它贴在这里,以防其他人也在试图实现同样的目标。请注意,事件自定义post类型的名称为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();
    

    相关推荐

    How to display CPT archives?

    我有一个网站,我们合并了两个博客,一个在普通博客中,另一个在自定义帖子类型中。一切都很好,只是我们无法为CPT显示月度档案。我们尝试了各种各样的插件,无论我们得到什么样的常规博客帖子列表,我们都会被重定向到那里。我们启用了has\\u存档,那么我们缺少什么呢?我从未尝试合并两个博客,所以这有点困难。但在普通博客上,第一个归档文件也显示了26篇文章,但当你访问它时,什么都没有显示。其他月份可以吗?Problem BlogRegular Blog