Visualizzare il contenuto post_object utilizzando il plugin Advanced Custom Fields

24 apr 2013, 14:34:18
Visualizzazioni: 21.3K
Voti: 4

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.

0
Tutte le risposte alla domanda 3
5

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> 
24 apr 2013 15:02:12
Commenti

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'?

George Grigorita George Grigorita
24 apr 2013 15:23:15

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/

s1lv3r s1lv3r
24 apr 2013 15:35:23

@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.

brasofilo brasofilo
24 apr 2013 16:53:04

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.

George Grigorita George Grigorita
24 apr 2013 17:45:53

Immagino che il motivo per cui ora funziona sia perché i campi relationship restituiscono sempre un array di oggetti post.

s1lv3r s1lv3r
24 apr 2013 17:52:25
0

Questo codice sarà utile

<?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>
26 set 2016 08:15:50
0

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.

24 apr 2013 15:51:14