ACF: get_field() returnează false

6 iun. 2015, 23:13:40
Vizualizări: 27.1K
Voturi: 5

Am creat un câmp personalizat de tip true/false cu valoarea implicită true. Am setat diferite articole cu valori diferite. Cu toate acestea, get_field() returnează întotdeauna false:

<?php if( have_posts() ): while( have_posts() ): the_post(); ?>
            <?php global var_dump(get_field('display_featured_image'));?>
<?php endwhile; endif ?>

Rezultatul afișat este: (bool)false

Am verificat și reverificat numele câmpului. De ce ar returna false dacă valoarea este setată pe true?

1
Comentarii

Am observat că câmpurile True/False nu par să respecte o valoare implicită true în afara inițializării UI: caseta va fi bifată pentru postările care nu au încă o valoare setată, dar până când nu salvezi efectiv postarea, valoarea true nu este salvată în baza de date. Dacă folosești get_field() pe o postare care nu are nimic salvat în baza de date, va returna false (indiferent de valoarea implicită a câmpului). Aș numi aceasta o eroare, dar nu am raportat-o încă, în așteptarea unei investigații mai amănunțite.

Mark Mark
23 oct. 2015 20:37:22
Toate răspunsurile la întrebare 2
9

Trebuie să transmiți ID-ul articolului din care încerci să obții câmpul: De exemplu

get_field('display_featured_image', $post_id). 

Într-o buclă ai putea folosi

get_field('display_featured_image', get_the_id());

ACF stochează datele câmpurilor în meta_fields-urile WordPress, așa că ai putea folosi chiar și handler-ul de meta integrat în WP pentru a extrage datele manual. De exemplu:

get_post_meta( $post_id, 'acf_field_name', true); // Folosește true în majoritatea cazurilor, deoarece WP va returna un array în caz contrar.
6 iun. 2015 23:28:06
Comentarii

Am încercat get_field (cu și fără ID) și get_post_meta -- ambele în interiorul loop-ului -- dar tot nu funcționează.

user3574603 user3574603
7 iun. 2015 00:47:04

Am încercat să debughez cu: print_r(get_post_meta(get_the_id(),'display_featured_image')); ...și acum nu sunt deloc sigur ce se întâmplă. Când testez un articol care are câmpul setat pe false, rezultatul este Array ( [0] => 0 ) dar când încărc un articol care are câmpul setat pe true, rezultatul este doar: Array ( )

user3574603 user3574603
7 iun. 2015 01:11:36

Poate că ai setat câmpul invers? De exemplu, când selectezi "display_featured_image" în editorul de articol, îl setezi pe "true" când este selectat și "false" când nu este? Pentru că se pare că câmpul PRIMEȘTE date, doar că poate le faci invers.

Încearcă să setezi câmpul select în editorul ACF la

Da : Da Nu : Nu

Și vezi ce rezultate obții când extragi din nou datele din câmp.

Hybrid Web Dev Hybrid Web Dev
7 iun. 2015 01:44:33

Am o idee despre ce se întâmplă. Am schimbat tipul câmpului în select, dar tot obțineam aceleași rezultate. Cu toate acestea, chiar dacă câmpul are o valoare implicită, trebuie să o setez explicit în postările existente pentru ca orice valoare să fie salvată. Arghh! Se pare că nu există nicio soluție pentru asta, decât dacă știi tu altceva?

user3574603 user3574603
7 iun. 2015 02:04:35

Nu, conform întrebării tale, ar trebui să funcționeze. Se păstrează starea câmpului în editorul de postări? De exemplu: dacă îl setezi la 1 sau la altceva, setarea persistă la reîncărcare? Dacă da, atunci nu există niciun motiv pentru care să nu funcționeze.

Hybrid Web Dev Hybrid Web Dev
7 iun. 2015 08:53:46

Da, starea se păstrează, dar am descoperit că dacă adaug un câmp la postările existente, starea nu va fi salvată, indiferent dacă câmpul are o valoare implicită sau nu, până când nu setez explicit acea valoare. De aici și array-ul gol.

user3574603 user3574603
7 iun. 2015 23:06:19

Este important de menționat că, din motive necunoscute, utilizarea funcției update_field programatic NU va actualiza efectiv câmpul până când formularul nu este salvat pentru prima dată. Aceasta se întâmplă din cauza modului în care datele câmpului sunt inițial populate de ACF. Puteți utiliza funcția nativă WP update_post_meta( $post_id, $key, $value ); pentru a ocoli această problemă. Acest lucru este menționat în documentația ACF. Am întâlnit această problemă într-un proiect și mi-am smuls părul ore în șir înainte să descopăr această soluție prin studierea documentației ACF :P

Hybrid Web Dev Hybrid Web Dev
20 feb. 2016 07:06:52

Există de asemenea un "bug" atunci când apelezi get_field() cu numele câmpului și apoi cu cheia câmpului - returnează valori diferite

Anatol Bivol Anatol Bivol
12 mar. 2016 21:40:57

Am avut această problemă și am realizat că trimiteam ->ID care se potrivea cu ID-ul meniului paginii și nu cu ID-ul paginii. În schimb, trebuia să folosesc ->object_ID. Acest lucru se întâmpla folosind wp_get_nav_menu_object()

Jack Jack
22 nov. 2016 12:37:35
Arată celelalte 4 comentarii
0
-1

Aveți câteva opțiuni. Cea mai ușoară ar fi să folosiți get_field( $field_key ) (folosiți ID-ul câmpului ACF în loc de meta_key). Acest lucru va alege câmpul corect indiferent de regulile de localizare, permițându-i să acceseze valoarea implicită.

Dacă trebuie să utilizați cheia meta, puteți face acest lucru în mare parte cu filtre. Nu sunt sigur cât de eficient este (ar putea fi ameliorat prin utilizarea cache-ului acf-json). Acest lucru presupune, de asemenea, că cheile câmpurilor dvs. sunt unice (altfel trebuie să filtrați pe baza regulilor de localizare, care pot fi sau nu disponibile).

add_filter( 'acf/load_value', function( $value, $post_id, $field ){
    // obțineți grupurile de câmpuri
    $groups = acf_get_field_groups();
    if ( !empty( $groups ) ){
        // parcurgeți fiecare grup
        foreach ($groups as $group) {
            // încărcați câmpurile pentru această cheie de grup
            $fields = acf_get_fields( $group['key'] );
            if ( !empty( $fields ) ){
                // parcurgeți câmpurile returnate
                foreach ( $fields as $this_field ){
                    // dacă numele se potrivește, setați valoarea implicită
                    if ( $this_field['name'] == $field['name'] ){
                        return $this_field['default_value'];
                    }
                }
            }
        }
    }
    return $value;
}
7 nov. 2015 06:15:06