Afișarea conținutului post_object folosind plugin-ul Advanced Custom Fields
Am dificultăți în a înțelege ce este greșit în acest cod.
Ce încerc să fac: să configurez un câmp personalizat în admin folosind plugin-ul ACF pentru a lista într-o meta-box pe toate paginile o listă de testimoniale (custom-post-type). Din meniul drop-down clientul poate selecta un testimonial care va apărea pe pagina respectivă.
Folosesc o versiune ușor modificată a temei twentytwelve și acesta este codul pe care îl folosesc în template-ul front_page.
Codul:
<?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; ?>
Problema: acest cod nu afișează nimic pe front-page. Am făcut un print_r( $post_object )
și mi-a arătat toate informațiile din testimonialul meu (titlu, dată, conținut etc).
Soluția: În ultimele 2/3 zile am încercat să obțin un răspuns pe forumurile de suport ACF și acesta este răspunsul primit:
Câmpul post object va returna un obiect post, nu HTML. Folosirea the_field pe un câmp post_object va rezulta în neafișarea niciunui conținut.
Trebuie să îl stochezi ca variabilă, apoi să folosești ID-ul sau variabila post_title pentru a afișa HTML-ul dorit
Nu am înțeles soluția sau fac exact ce spune mesajul și problema este în altă parte?
Editare ulterioară: Aceasta este configurația mea curentă în ACF pentru câmpul testimonial:
Rules: Post Types - Page. Field Name - Testimonial. Field Type: Post Object. Post type: Testimonial. Filter from taxonomy: All.
'Rules' înseamnă că câmpul personalizat va apărea doar pe pagini și va lista doar 'post objects' din tipul de postare personalizată 'testimonial'. În admin totul pare să funcționeze bine, doar că nu pot afișa nimic pe front-end.
Editare finală: Urmând sugestia lui @s1lv3r am schimbat tipul câmpului din 'post-object' în 'relationship'. Am modificat și codul astfel:
<?php $posts = get_field('testimonial'); ?>
<?php if( $posts ): ?>
<?php foreach( $posts as $post): // variabila trebuie să se numească $post (IMPORTANT) ?>
<?php setup_postdata($post); ?>
<?php echo get_the_excerpt(); ?>... <a href="<?php the_permalink(); ?>">+Mai mult</a>
<?php the_title(); ?>
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>
<?php endif; ?>
Acum totul funcționează OK pe front-end. Mulțumesc tuturor pentru ajutor.

Codul nu pare să aibă probleme sintactice la prima vedere. Ce tip de câmp folosești? Relationship?
De asemenea, de suprascrii $post_object
și de unde provine acesta inițial? Acea parte din cod lipsește.
Pentru a obține câmpul atașat postului curent (în interiorul buclei curente / obiectul global $post pe care îl vizualizezi), trebuie pur și simplu să folosești get_field('testimonial')
fără parametrul ID.
Dacă vrei să obții câmpul atașat unui alt post_object, ai verificat dacă $post_object->ID
conține un ID de post valid chiar înainte de prima linie pe care ai postat-o?
Editat conform noilor informații:
Este acesta un câmp de tip post object cu opțiunea 'multiple' activată? Documentația (http://www.advancedcustomfields.com/resources/field-types/post-object/) menționează că aceste câmpuri returnează un array de obiecte post doar dacă opțiunea multiple este activată, altfel va returna un singur obiect post. Aceasta înseamnă că nu ai nevoie de bucla foreach în codul tău. În acest caz, ar trebui să-l folosești astfel:
<?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>

Am făcut o modificare în postarea originală, explicând mai multe despre configurația mea. Am încercat cu get_field('testimonial')
și obțin același rezultat (nu se afișează nimic).
Codul de mai sus se află în bucla principală (dar am încercat și în afara buclei). Rezultatul este același.
Ar trebui să folosesc 'relationship' în loc de 'post_object'?

De asemenea, am editat răspunsul meu.
În general, ambele tipuri de câmpuri fac același lucru. Relația are doar o interfață mai 'fancy' în frontend. Aruncă o privire aici: http://www.advancedcustomfields.com/resources/field-types/relationship/

@GeorgeGrigorita, toate observațiile lui s1lv3r sunt corecte. 1) Suprascrierea lui $post_object
. 2) Folosirea get_field
în interiorul sau în afara buclei. 3) foreach
inutil pentru un câmp cu o singură valoare, nu este un array.

Mulțumesc tuturor pentru ajutor! Chiar nu știu de ce, dar se pare că funcționează cu 'relationship' ca tip de câmp în loc de 'post-object'. Voi actualiza primul post.

În primul rând. Ai selectat o valoare din meniul drop-down în administrare? Dacă nu ai făcut asta, nu vei obține niciun rezultat din get_field
pentru acea pagină.
De asemenea, dacă ai acces la baza de date, verifică să existe o valoare setată pentru acea pagină în tabela _postmeta
.
SELECT * FROM `wp_postmeta` WHERE `post_id` = XX
Unde XX este ID-ul paginii tale, iar YY (vezi mai jos) este ID-ul recomandării pe care ai selectat-o din meniul drop-down în administrare.
Printre rezultate ar trebui să ai câteva rânduri similare cu acestea:
meta_id post_id meta_key meta_value
1607 XX testimonial YY
1608 XX _testimonial field_5177d30141f17
Dacă toate acestea sunt setate corect în baza de date, atunci problema este în codul tău.
