web-dev-qa-db-fra.com

Afficher le contenu post_object en utilisant le plugin Advanced Custom Fields

J'ai du mal à comprendre ce qui ne va pas avec ce code.

Ce que j'essaie de faire: configurer un champ personnalisé dans admin à l'aide du plug-in ACF pour répertorier dans une méta-boîte de toutes les pages une liste de témoignages (type de message personnalisé). Dans le menu déroulant, le client peut sélectionner un témoignage qui apparaîtra sur cette page spécifique.

J'utilise une version légèrement modifiée du thème vingt-douze et c'est le code que j'utilise dans mon modèle front_page.

Le code:

<?php $featured_testimonial = get_field('testimonial', $post_object->ID); ?>
    <?php foreach ($featured_testimonial as $post_object): ?>
            <a href="<?php echo get_permalink($post_object->ID); ?>">
                <p class="descr"><?php echo get_the_title($post_object->ID) ?></p>
            </a>
    <?php endforeach; ?> 

Le problème: ce code ne montre rien sur la première page. J'ai fait un print_r( $post_object ) et il a montré toutes les informations dans mon témoignage (titre, date, contenu, etc.).

La solution: Depuis 2 ou 3 jours, j'essaie d'obtenir une réponse sur les forums d'assistance d'ACF et voici la réponse que j'ai reçue:

Le champ objet post retournera un objet post, pas HTML. L'utilisation de the_field sur un champ post_object n'affichera rien.

Vous devez le stocker en tant que variable, puis utiliser l'ID ou la variable post_title pour générer le code HTML souhaité.

Est-ce que je n'ai pas compris la solution ou je fais exactement ce que le message dit et le problème est ailleurs?

Éditer plus tard: Ceci est ma configuration actuelle dans ACF pour le champ testimonial:

Rules: Post Types - Page.
Field Name - Testimonial.
Field Type: Post Object.
Post type: Testimonial.
Filter from taxonomy: All.

Les "règles" signifient que le champ personnalisé n'apparaîtra que sur les pages et qu'il ne répertoriera que les "objets de publication" du type de publication personnalisé "témoignage". Dans l’administration, tout semble bien fonctionner, c’est juste que je ne peux rien obtenir au début.

Edition finale: Suivant la suggestion de @ s1lv3r, j'ai changé le type de champ de 'post-objet' à 'relation'. J'ai aussi modifié le code comme ceci:

<?php $posts = get_field('testimonial'); ?>
    <?php if( $posts ): ?>
    <?php foreach( $posts as $post): // variable must be called $post (IMPORTANT) ?>
        <?php setup_postdata($post); ?>
        <?php echo get_the_excerpt(); ?>... <a href="<?php the_permalink(); ?>">+More</a>
        <?php the_title(); ?>
    <?php endforeach; ?>
    <?php wp_reset_postdata(); ?>
    <?php endif; ?>

Maintenant, tout fonctionne bien sur le front-end. Merci à tous pour votre aide.

3
George Grigorita

Le code ne semble pas mal syntaxique en premier lieu. Quel type de champ utilisez-vous? Relation?

Aussi, pourquoi substituez-vous $post_object et d'où provient-il en premier lieu? Cette partie du code est manquante.

Pour obtenir le champ qui est attaché à la publication actuelle (à l'intérieur de la boucle actuelle/de l'objet global $ post que vous visualisez), vous devez simplement utiliser get_field('testimonial') sans le paramètre ID.

Si vous souhaitez que le champ soit associé à un autre post_object, avez-vous vérifié que $post_object->ID contient un post_id valide juste avant la première ligne que vous avez postée?

Edité selon les nouvelles informations:

S'agit-il d'un champ d'objet postal avec l'option "multiple" activée? Les docs ( http://www.advancedcustomfields.com/resources/field-types/post-object/ ) indiquent que ce champ ne renvoie qu'un tableau d'objets postaux lorsque l'option multiple est activée, sinon elle ne retournera que un seul objet post. Cela signifie que vous n'aurez pas besoin de la boucle foreach dans votre code. Dans ce cas, vous devriez l'utiliser comme ceci:

<?php $featured_testimonial = get_field('testimonial', $post_object->ID); ?>
            <a href="<?php echo get_permalink($featured_testimonial->ID); ?>">
                <p class="descr"><?php echo get_the_title($featured_testimonial->ID) ?></p>
            </a> 
3
s1lv3r

Premières choses d'abord. Avez-vous sélectionné une valeur dans votre liste déroulante côté administrateur? Sinon, vous n'obtiendrez aucun résultat de get_field pour cette page.

De même, si vous avez accès à votre base de données, assurez-vous de disposer d'une valeur pour cette page définie dans la table _postmeta.

SELECT * FROM `wp_postmeta` WHERE `post_id` = XX

XXest votre ID de page, etYY(voir ci-dessous) est l'ID du témoignage que vous avez sélectionné dans la liste déroulante du côté de l'administrateur.

Parmi les résultats, vous devriez avoir quelques lignes comme ceci:

meta_id    post_id    meta_key        meta_value
1607       XX         testimonial     YY 
1608       XX         _testimonial    field_5177d30141f17

Si vous avez tous ceux correctement définis dans la base de données, c'est votre code qui pose problème.

0
montrealist

Ce code sera une aide

<?php
$featured_testimonial = get_field('testimonial', $post_object->ID); 
?>
<a href="<?php echo get_the_permalink( $featured_testimonial->ID ); ?>"><?php echo $featured_testimonial->post_title; ?></a>
0
Prashant Baldha