Afișarea conținutului post_object folosind plugin-ul Advanced Custom Fields

24 apr. 2013, 14:34:18
Vizualizări: 21.3K
Voturi: 4

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.

0
Toate răspunsurile la întrebare 3
5

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

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

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

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/

s1lv3r s1lv3r
24 apr. 2013 15:35:23

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

brasofilo brasofilo
24 apr. 2013 16:53:04

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.

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

Cred că motivul pentru care acum funcționează este că câmpurile de tip relationship întotdeauna returnează un array de obiecte post.

s1lv3r s1lv3r
24 apr. 2013 17:52:25
0

Acest cod va fi de ajutor

<?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 sept. 2016 08:15:50
0

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

24 apr. 2013 15:51:14