Visualizzare il contenuto post_object utilizzando il plugin Advanced Custom Fields
Ho difficoltà a capire cosa c'è di sbagliato in questo codice.
Cosa sto cercando di fare: configurare un campo personalizzato nell'admin usando il plugin ACF per elencare in una meta-box su tutte le pagine una lista di testimonianze (custom-post-type). Dal menu a tendina il cliente può selezionare una testimonianza che apparirà su quella specifica pagina.
Sto utilizzando una versione leggermente modificata del tema twentytwelve e questo è il codice che sto usando nel mio template front_page.
Il codice:
<?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; ?>
Il problema: questo codice non mostra nulla nella front-page. Ho fatto un print_r( $post_object )
e ha mostrato tutte le informazioni della mia testimonianza (titolo, data, contenuto ecc).
La soluzione: Negli ultimi 2/3 giorni ho cercato di ottenere una risposta nei forum di supporto ACF e questa è la risposta che ho ricevuto:
Il campo post object restituirà un oggetto post, non HTML. Usando the_field su un campo post_object risulterà in nessuna visualizzazione.
È necessario memorizzarlo come variabile, quindi utilizzare l'ID o la variabile post_title per generare l'HTML desiderato
Non ho capito la soluzione o sto facendo esattamente quello che dice il messaggio e il problema è altrove?
Modifica successiva: Questa è la mia configurazione attuale in ACF per il campo testimonial:
Regole: Post Types - Page. Nome Campo - Testimonial. Tipo Campo: Post Object. Tipo Post: Testimonial. Filtro da tassonomia: Tutti.
Le 'regole' significano che il campo personalizzato apparirà solo sulle pagine e elencherà solo 'post objects' dal custom post type 'testimonial'. Nell'admin tutto sembra funzionare correttamente, è solo che non riesco a far apparire nulla nel front-end.
Modifica finale: Seguendo il suggerimento di @s1lv3r ho cambiato il tipo di campo da 'post-object' a 'relationship'. Ho anche modificato il codice in questo modo:
<?php $posts = get_field('testimonial'); ?>
<?php if( $posts ): ?>
<?php foreach( $posts as $post): // la variabile deve essere chiamata $post (IMPORTANTE) ?>
<?php setup_postdata($post); ?>
<?php echo get_the_excerpt(); ?>... <a href="<?php the_permalink(); ?>">+Altro</a>
<?php the_title(); ?>
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>
<?php endif; ?>
Ora tutto funziona correttamente nel front-end. Grazie a tutti per l'aiuto.

Il codice non sembra sintatticamente errato in prima battuta. Che tipo di campo stai utilizzando? Un campo di relazione?
Inoltre, perché stai sovrascrivendo $post_object
e da dove proviene inizialmente? Questa parte del codice manca.
Per ottenere il campo associato al post corrente (all'interno del loop corrente / oggetto globale $post che stai visualizzando) devi semplicemente usare get_field('testimonial')
senza il parametro ID.
Se vuoi ottenere il campo associato a un altro post_object, hai verificato che $post_object->ID
contenga un ID post valido immediatamente prima della prima riga che hai postato?
Modificato secondo le nuove informazioni:
Si tratta di un campo post object con l'opzione 'multiple' abilitata? La documentazione (http://www.advancedcustomfields.com/resources/field-types/post-object/) indica che questo campo restituisce un array di oggetti post solo quando l'opzione multiple è abilitata, altrimenti restituirà un singolo oggetto post. Questo significherebbe che non avrai bisogno del foreach-loop nel tuo codice. In quel caso dovresti usarlo così:
<?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>

Ho apportato una modifica al post originale, spiegando meglio la mia configurazione. Ho provato con get_field('testimonial')
e ottengo lo stesso risultato (non viene visualizzato nulla).
Il codice sopra è nel main loop (ma ho anche provato a metterlo fuori dal loop). È lo stesso.
Dovrei usare 'relationship' invece di 'post_object'?

Ho anche modificato la mia risposta.
In generale entrambi i tipi di campo fanno la stessa cosa. Il relationship ha solo un'interfaccia più 'accattivante' nel frontend. Dai un'occhiata qui: http://www.advancedcustomfields.com/resources/field-types/relationship/

@GeorgeGrigorita, tutte le osservazioni di s1lv3r sono corrette. 1) Sovrascrittura di $post_object
. 2) Uso di get_field
dentro o fuori dal loop. 3) foreach
non necessario per un campo con valore singolo, non è un array.

Grazie a tutti per l'aiuto! Non so davvero perché, ma sembra funzionare con 'relationship' come tipo di campo invece di 'post-object'. Aggiornerò il primo post.

Prima di tutto. Hai selezionato un valore dal menu a discesa nella parte di amministrazione? Se non l'hai fatto, non otterrai alcun risultato da get_field
per quella pagina.
Inoltre, se hai accesso al tuo database, assicurati che ci sia un valore impostato per quella pagina nella tabella _postmeta
.
SELECT * FROM `wp_postmeta` WHERE `post_id` = XX
Dove XX è l'ID della tua pagina e YY (vedi sotto) è l'ID della testimonianza che hai selezionato dal menu a discesa nella parte di amministrazione.
Tra i risultati dovresti avere un paio di righe come queste:
meta_id post_id meta_key meta_value
1607 XX testimonial YY
1608 XX _testimonial field_5177d30141f17
Se hai tutti questi valori correttamente impostati nel database, allora il problema è nel tuo codice.
