我有一个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
?>
最合适的回答,由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
陈述