ACF: get_field() returnează false
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?

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.

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

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 ( )

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.

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?

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.

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.

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

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

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;
}
