ACF: get_field() restituisce false
Ho creato un campo personalizzato true/false con valore predefinito true. Ho impostato diversi post con valori differenti. Tuttavia, get_field() restituisce sempre false:
<?php if( have_posts() ): while( have_posts() ): the_post(); ?>
<?php global var_dump(get_field('display_featured_image'));?>
<?php endwhile; endif ?>
L'output visualizzato è: (bool)false
Ho controllato e ricontrollato il nome del campo. Perché dovrebbe restituire false se il valore è impostato su true?

Devi passare l'ID del post da cui stai cercando di ottenere il campo: Ad esempio
get_field('display_featured_image', $post_id);
In un loop potresti fare
get_field('display_featured_image', get_the_id());
ACF memorizza i dati dei campi nei meta_fields di WordPress, quindi potresti anche utilizzare il gestore di meta integrato di WP per recuperare i dati manualmente. Ad esempio:
get_post_meta( $post_id, 'acf_field_name', true); // Usa true per quasi tutti i casi, poiché WP restituirà un array altrimenti.

Ho provato get_field (con e senza ID) e get_post_meta -- entrambi all'interno del loop -- ma ancora nulla.

Ho provato a fare debug con: print_r(get_post_meta(get_the_id(),'display_featured_image'));
...e ora non sono affatto sicuro di cosa stia succedendo. Quando provo su un post che ha il campo impostato su false, l'output è Array ( [0] => 0 )
ma quando carico un post che ha il campo impostato su true, l'output è semplicemente: Array ( )

Forse stai impostando il campo al contrario? Ad esempio, quando selezioni "display_featured_image" nell'editor del post, lo stai impostando su "true" quando è selezionato e "false" quando non lo è? Perché sembra che il campo STIA ricevendo dati, potresti semplicemente averlo impostato al contrario.
Prova a impostare il campo select nell'editor ACF su
Sì : Sì No : No
E vedi cosa viene quando ottieni nuovamente i dati del campo.

Ho un'idea di cosa sta succedendo. Ho cambiato il tipo del campo in select ma continuavo a ottenere gli stessi risultati. Tuttavia, anche se il campo ha un valore predefinito, devo impostarlo esplicitamente nei post esistenti affinché qualsiasi valore venga memorizzato. Arghh! Sembra che non ci sia alcuna soluzione alternativa neanche per questo, a meno che tu non ne conosca una diversa?

No, in base a ciò che dice la tua domanda, dovrebbe funzionare. Lo stato del campo nell'editor dei post viene mantenuto? Ad esempio: se lo imposti su 1 o sull'altro, l'impostazione persiste al ricaricamento? Se è così, allora non c'è motivo per cui non funzioni.

Sì, lo stato viene mantenuto ma ho scoperto che se aggiungo un campo a post esistenti, lo stato non verrà memorizzato, indipendentemente dal fatto che il campo abbia un valore predefinito, finché non ho impostato esplicitamente quel valore. Da qui l'array vuoto.

Vale la pena notare che, per qualche motivo, l'uso di update_field a livello di codice NON aggiornerà effettivamente il campo finché il modulo non viene salvato per la prima volta. Questo ha a che fare con il modo in cui i dati del campo vengono inizialmente popolati da ACF. Puoi utilizzare la funzione nativa di WP update_post_meta( $post_id, $key, $value ); per aggirare questo problema. Questo è menzionato nella documentazione di ACF. Io stesso mi sono imbattuto in questo problema durante un progetto e mi sono strappato i capelli per ore prima di scoprirlo esaminando la documentazione di ACF :P

C'è anche un "bug" quando chiami get_field() con il nome del campo e poi con la chiave del campo - restituisce valori diversi

Hai diverse opzioni. La più semplice sarebbe usare get_field( $field_key )
(utilizza l'ID del campo ACF anziché il meta_key). Questo selezionerà il campo corretto indipendentemente dalle regole di posizionamento, permettendoti di accedere al valore predefinito.
Se devi assolutamente usare il meta key, puoi farlo principalmente con i filtri. Non sono sicuro di quanto sia efficiente (si potrebbe mitigare usando la cache acf-json). Questo presuppone anche che le tue chiavi dei campi siano univoche (altrimenti devi filtrare in base alle regole di posizionamento, che potrebbero essere disponibili o meno).
add_filter( 'acf/load_value', function( $value, $post_id, $field ){
// ottieni i tuoi gruppi di campi
$groups = acf_get_field_groups();
if ( !empty( $groups ) ){
// scorri ogni gruppo
foreach ($groups as $group) {
// carica i campi per questa chiave di gruppo
$fields = acf_get_fields( $group['key'] );
if ( !empty( $fields ) ){
// scorri i campi restituiti
foreach ( $fields as $this_field ){
// se il nome corrisponde, imposta il valore predefinito
if ( $this_field['name'] == $field['name'] ){
return $this_field['default_value'];
}
}
}
}
}
return $value;
}
