web-dev-qa-db-fra.com

Impossible d'obtenir du contenu de publication à partir d'une boucle de type de publication personnalisée

Pour une raison quelconque, je ne parviens pas à afficher le contenu de type publication personnalisé à l'aide du code suivant. Qu'est-ce que j'oublie ici? Cela fonctionne bien pour get_the_title, mais utiliser get_the_content avec les mêmes paramètres ne donne rien.

<?php
            $query = new WP_Query( ['post_type' => 'testimonials', 'posts_per_page' => -1 ] );
            foreach($query->get_posts() as $testimonial):
            $meta = get_post_meta($testimonial->ID);
            foreach($meta as &$m){
                if(is_array($m)){
                    $m = $m[0];
                }
            } ?>

            <div class="content"><?=get_the_content($testimonial->ID); ?></div>
            <div class="author">- <?=get_the_title($testimonial->ID); ?> / <span class="company_name"><?=$meta['_testimonial_company_name'] ?></span></div>
            <div class="link"><a href="<?=home_url('/testimonials'); ?>" title="View All Testimonials">View More</a></div>
            <?php endforeach; ?>
3
Zach Smith

Comme indiqué dans les autres réponses, vous n'êtes pas dans la boucle et les fonctions get_the_*() ne fonctionnent pas correctement. Puisque vous êtes en boucle sur $query->get_posts(), vous pouvez simplement utiliser l'objet WP_Post.

Quelque chose comme ça va marcher.

foreach($query->get_posts() as $testimonial):
    $meta = get_post_meta($testimonial->ID);
    foreach($meta as &$m){
            if(is_array($m)){
                $m = $m[0];
            }
        }

    <div class="content"><?= do_shortcode($testimonial->post_content); ?></div>
    <div class="author">- <?=$testimonial->post_title; ?> / <span class="company_name"><?=$meta['_testimonial_company_name'] ?></span></div>
    <div class="link"><a href="<?=home_url('/testimonials'); ?>" title="View All Testimonials">View More</a></div>            

<?php endforeach;?>

En fonction de votre situation spécifique, vous pouvez également vouloir wpautop() le contenu. Par exemple. do_shortcode(wpautop($testimonial->post_content))

Si vous souhaitez configurer une boucle secondaire, vous pouvez: Cependant, vous ne devez PAS utiliser setup_postdata() à moins d'être sûr de ne pas travailler dans une boucle imbriquée, car cela modifie l'objet de publication global.

0
TheGentleman

get_the_content() doit être utilisé dans une boucle et vous oblige à configurer les données de la publication.

Vous devez d'abord utiliser setup_postdata( $post );, puis vous pouvez utiliser get_the_content().

Cependant, je vois quelques problèmes ici:

  • Tout d’abord, vous pouvez utiliser une boucle, au lieu de foreach.
  • Vous ne devez jamais utiliser de balises PHP courtes. Je suis surpris de voir comment votre code fonctionne à la première place.
  • Il est préférable de stocker vos paramètres de requête dans un tableau pour en améliorer la lisibilité et de les transmettre à WP_Query();.
  • Utilisez the_content() au lieu de get_the_content() pour vous assurer que les filtres sont également appliqués.

Voici une version optimisée de votre code:

<?php
$args = array( 
    'post_type' => 'testimonials', 
    'posts_per_page' => 100
);
$q = new WP_Query( $args );
if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
        $q->the_post();
        $company_name = get_post_meta( get_the_ID(), '_testimonial_company_name', true );
        ?>
        <div class="content"><?php the_content(); ?></div>
        <div class="author">- <?php the_title(); ?> / <span class="company_name"><?php echo $company_name; ?></span></div>
        <div class="link"><a href="<?php echo home_url( '/testimonials' ); ?>" title="View All Testimonials">View More</a></div><?php
    }
}
?>
0
Jack Johansson