CPT+CMB2:仅在循环中第一次开机自检时不显示数据

时间:2015-10-28 作者:alexwc_

我有一个CPT合并CMB2. 我循环浏览每个类别,并显示该类别中的每个帖子。我的问题是,每个类别中的第一篇文章不会显示两个元数据库中的某些信息:标签名称($标签)和发布日期($日期),但每个类别中的其他文章都会显示这些信息。到目前为止,我有大约8个类别,这在所有类别中都会发生。

当我var_dump($label);, 显示每个类别的第一个帖子string(0) "", 尽管在管理方面有一些东西。所有其他帖子都可以。有什么想法吗?

以下是元数据库:

add_action( \'cmb2_init\', \'awc_discog_details\' );
function awc_discog_details() {

$prefix = \'_awc_\';

$cmb = new_cmb2_box( array(
    \'id\'           => $prefix . \'details_metabox\',
    \'title\'        => __( \'Label / Release Date\', \'cmb2\' ),
    \'object_types\' => array( \'awc_discography\' ),
    \'context\'      => \'normal\',
    \'priority\'     => \'high\',
) );

$cmb->add_field( array(
    \'name\' => __( \'Label Name\', \'cmb2\' ),
    \'id\' => $prefix . \'label_name\',
    \'type\' => \'text_medium\',
) );

$cmb->add_field( array(
    \'name\' => __( \'Release Date\', \'cmb2\' ),
    \'id\' => $prefix . \'release_date\',
    \'type\' => \'text_date\',
) );

}
这是显示所有信息的模板:

<?php
$tax_terms = get_terms( \'category\', array( \'orderby\' => \'id\' ) );

foreach ($tax_terms as $tax_term) {

    $args = array(
        \'cat\'               => $tax_term->term_id,
        \'post_type\'         => \'awc_discography\',
        \'posts_per_page\'    => \'-1\',
        \'orderby\'           => \'ID\',
    );

    $query = new WP_Query( $args );
    $nice_class = strtolower($tax_term->name);
    $nice_class = preg_replace("/[\\s_]/", "-", $nice_class);

if ( $query->have_posts() ) { ?>

<section class="<?php echo $nice_class; ?> listing">
    <h3><?php echo $tax_term->name; ?>:</h3>

    <?php while ( $query->have_posts() ) {

        $label = get_post_meta( get_the_ID(), \'_awc_label_name\', true ); 
        $date = get_post_meta( get_the_ID(), \'_awc_release_date\', true ); 

        $query->the_post();
    ?>

        <article id="post-<?php the_ID(); ?>" <?php post_class( \'discog large-6 medium-6 small-12 columns\' ); ?>>
            <?php if ( has_post_thumbnail() ) { ?>
                <div class="large-4 medium-4 small-12 columns album-cover">
                    <a href="<?php the_permalink(); ?>">
                        <?php the_post_thumbnail( \'thumbnail\' ); ?>
                    </a>
                </div>
            <?php } ?>

            <div class="large-8 medium-8 small-12 columns album-content">
              <h4><?php the_title(); ?></h4>
              <?php if ($label) {
                echo \'<p><strong>Label: \' . $label . \'</strong></p>\';
                } ?>
              <?php if ($date) {
                echo \'<p><strong>Release Date: \' . $date . \'</strong></p>\';
                } ?>

              <?php
              echo \'<div class="entry-content">\';

              the_content(); 
?>

            </div>

        </article>

    <?php } // end while ?>

</section>

<?php } // end if

// Use reset to restore original query.
wp_reset_postdata();

} // foreach
?>

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

get_the_ID() 在循环中返回了错误的ID,因此您在每篇帖子上都得到了错误的信息。在第一个岗位上,get_the_ID() 如果是存档页,则返回false;如果是页,则返回页ID。在第二柱上,get_the_ID() 将返回post 1的ID,因此您将从post 2上的post 1获取post meta,依此类推。

这一切的原因是,您试图在$post 全局设置为循环中的当前帖子。非常简单快速,the_post() 设置$post 全局到循环中的当前帖子,所以在the_post() 通话中会出现错误信息,而不是您期望的信息。

因此,为了解决您的问题,以下几行

$label = get_post_meta( get_the_ID(), \'_awc_label_name\', true );
$date = get_post_meta( get_the_ID(), \'_awc_release_date\', true ); 
应移到以下行之后

$query->the_post();
另外,记住在循环后通过添加wp_reset_postdata(); 在您的endwhile 陈述

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请