ACF: get_field() restituisce false

6 giu 2015, 23:13:40
Visualizzazioni: 27.1K
Voti: 5

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?

1
Commenti

Ho notato che i campi True/False non sembrano rispettare un valore predefinito true al di fuori dell'inizializzazione dell'interfaccia utente: la casella risulterà selezionata per i post che non hanno ancora un valore, ma finché non salvi effettivamente il post, il valore true non viene salvato nel database. Se esegui get_field() su un post per cui non è stato salvato nulla nel database, restituirà false (indipendentemente dal valore predefinito del campo). Lo definirei un bug ma non l'ho ancora segnalato, in attesa di ulteriori approfondimenti.

Mark Mark
23 ott 2015 20:37:22
Tutte le risposte alla domanda 2
9

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.
6 giu 2015 23:28:06
Commenti

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

user3574603 user3574603
7 giu 2015 00:47:04

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

user3574603 user3574603
7 giu 2015 01:11:36

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.

Hybrid Web Dev Hybrid Web Dev
7 giu 2015 01:44:33

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?

user3574603 user3574603
7 giu 2015 02:04:35

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.

Hybrid Web Dev Hybrid Web Dev
7 giu 2015 08:53:46

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.

user3574603 user3574603
7 giu 2015 23:06:19

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

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

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

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

Ho avuto questo problema poi ho capito che stavo passando ->ID che corrispondeva all'ID del menu della pagina e non all'ID della pagina. Invece dovevo usare ->object_ID. Questo utilizzando wp_get_nav_menu_object()

Jack Jack
22 nov 2016 12:37:35
Mostra i restanti 4 commenti
0
-1

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;
}
7 nov 2015 06:15:06