私は CMB2 を組み込んだCPTです。私はすべてのカテゴリをループし、そのカテゴリ内の各投稿を表示します。私の問題は、各カテゴリの最初の投稿に2つのメタボックスからの特定の情報が表示されないことです:ラベル名($ label)とリリース日:($ date)が、各カテゴリの他の投稿はこの情報を表示します。これまでのところ、私は約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
?>
get_the_ID()
はループ内で誤ったIDを返しているので、すべての投稿について間違った情報を取得しています。最初の投稿で、get_the_ID()
はアーカイブページの場合はfalse、ページの場合はページIDを返します。投稿2では、get_the_ID()
は投稿1のIDを返すので、投稿2の投稿1から投稿メタを取得します。
これらすべての理由は、$post
グローバルがループ内の現在の投稿に設定される前に、投稿情報と投稿IDを取得しようとしていることです。非常に単純で素早い、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();
また、endwhile
ステートメントの後にwp_reset_postdata();
を追加することで、ループ後にpostdataをリセットすることを忘れないでください。