web-dev-qa-db-fra.com

CPT + CMB2: les données ne s'affichent pas uniquement pour la première publication en boucle

J'ai un CPT incorporant CMB2 . Je passe en revue chaque catégorie et affiche chaque message dans cette catégorie. Mon problème est que le premier article de chaque catégorie n'affiche pas certaines informations de deux métaboxes: Nom de l'étiquette ($ étiquette) et Date de parution: ($ date), mais les autres articles de chaque catégorie affichent cette information. Jusqu'à présent, j'ai environ 8 catégories et cela se produit dans toutes.

Lorsque je var_dump($label);, le premier message de chaque catégorie affiche string(0) "", même s'il y a quelque chose là du côté de l'administrateur. Tous les autres messages sont bons. Des idées?

Voici les metaboxes:

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',
) );

}

et cela provient du modèle pour afficher toutes les informations:

<?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() renvoie le mauvais identifiant dans la boucle, vous obtenez donc des informations erronées à chaque post. Sur le premier message, get_the_ID() renverra soit false s’il s’agit d’une page d’archive, soit l’ID de la page s’il s’agit d’une page. Sur post deux, get_the_ID() renverra l'ID de post un, vous obtiendrez donc la méta de post de post one sur post deux et ainsi de suite.

La raison en est que vous essayez d’obtenir des informations sur la publication et que l’ID de publication avant la $post global est défini sur la publication actuelle dans la boucle. Très simple et rapide, the_post() définit le $post global sur la publication en cours dans la boucle. Par conséquent, tout ce qui est fait avant l'appel the_post() aura les informations erronées et non les informations attendues.

Donc, pour résoudre votre problème, les lignes suivantes

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

devrait être déplacé après la ligne suivante

$query->the_post();

Pensez également à réinitialiser les données postérieures à la fin de la boucle en ajoutant wp_reset_postdata(); après votre instruction endwhile.

1
Pieter Goosen