web-dev-qa-db-ja.com

CPT + CMB2:ループ内の最初の投稿に対してのみデータが表示されない

私は 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
?>
1
alexwc_

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をリセットすることを忘れないでください。

1
Pieter Goosen