ACF: get_field() devuelve false

6 jun 2015, 23:13:40
Vistas: 27.1K
Votos: 5

He creado un campo personalizado true/false con el valor predeterminado de true. He configurado diferentes posts con diferentes valores. Sin embargo, get_field() siempre devuelve false:

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

La salida mostrada es: (bool)false

He revisado y vuelto a revisar el nombre del campo. ¿Por qué devolvería false si el valor está configurado como true?

1
Comentarios

He notado que los campos True/False no parecen respetar un valor predeterminado true fuera de la inicialización de la UI: la casilla estará marcada para posts que aún no tienen valor, pero hasta que no guardes el post, el valor true no se guarda en la base de datos. Si haces get_field() en un post sin nada guardado en la DB, devolverá false (independientemente del valor predeterminado del campo). Yo lo llamaría un bug pero no lo he reportado aún, pendiente de más investigación.

Mark Mark
23 oct 2015 20:37:22
Todas las respuestas a la pregunta 2
9

Necesitas pasar el ID de la publicación de la que intentas obtener el campo: Ej.

get_field('display_featured_image', $post_id). 

En un bucle podrías hacer

get_field('display_featured_image', get_the_id());

ACF almacena los datos de los campos en los meta_campos de WP, por lo que incluso podrías usar el manejador de metadatos integrado de WP para extraer los datos tú mismo Ej:

get_post_meta( $post_id, 'acf_field_name', true); // Usa true para casi todos los casos, ya que WP devolverá un array de lo contrario. 
6 jun 2015 23:28:06
Comentarios

He probado get_field (con y sin ID) y get_post_meta -- ambos dentro del loop -- pero aún así no obtengo nada.

user3574603 user3574603
7 jun 2015 00:47:04

He intentado depurar con: print_r(get_post_meta(get_the_id(),'display_featured_image')); ...y ahora no estoy seguro de lo que está pasando. Cuando pruebo con un post que tiene el campo establecido en false, la salida es Array ( [0] => 0 ) pero cuando cargo un post que tiene el campo establecido en true, la salida es simplemente: Array ( )

user3574603 user3574603
7 jun 2015 01:11:36

¿Quizás estás configurando el campo al revés? Por ejemplo, cuando seleccionas "display_featured_image" en el editor de posts, ¿lo estás estableciendo como "true" cuando está seleccionado y "false" cuando no? Porque parece que el campo SÍ está recibiendo datos, solo que quizás lo estás haciendo al revés.

Prueba configurando el campo de selección en el editor de ACF como:

Sí : Sí No : No

Y mira qué obtienes cuando vuelvas a consultar los datos del campo.

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

Tengo una idea de lo que está pasando. Cambié el tipo de campo a select pero seguía obteniendo los mismos resultados. Sin embargo, aunque el campo tiene un valor por defecto, tengo que establecerlo explícitamente en las entradas existentes para que se almacene cualquier valor. ¡Argh! Parece que no hay solución para eso tampoco, ¿a menos que conozcas alguna diferente?

user3574603 user3574603
7 jun 2015 02:04:35

No, según lo que decía tu pregunta, debería estar funcionando. ¿Se conserva el estado del campo en el editor de entradas? Por ejemplo: si lo configuras en 1 o en el otro, ¿la configuración persiste al recargar? Si es así, entonces no hay razón para que no funcione.

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

Sí, el estado se conserva pero he descubierto que si añado un campo a entradas existentes, el estado no se almacenará, sin importar si el campo tiene un valor por defecto, hasta que haya establecido explícitamente ese valor. De ahí el array vacío.

user3574603 user3574603
7 jun 2015 23:06:19

Vale la pena mencionar que, por alguna razón, usar update_field de manera programática NO actualizará realmente el campo hasta que el formulario se guarde por primera vez. Esto tiene que ver con cómo ACF inicialmente llena los datos del campo. Puedes usar la función nativa de WP update_post_meta( $post_id, $key, $value ); para evitar este problema. Esto se menciona en la documentación de ACF. Yo mismo me encontré con este problema durante un proyecto y me arranqué el cabello durante horas antes de descubrirlo al revisar minuciosamente la documentación de ACF :P

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

También hay un "error" cuando llamas a get_field() con el nombre del campo y luego con la clave del campo - devuelve valores diferentes

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

Tuve este problema y luego me di cuenta de que estaba pasando ->ID que coincidía con el ID del menú de la página y no con el ID de la página. En su lugar, necesitaba usar ->object_ID. Esto fue usando wp_get_nav_menu_object()

Jack Jack
22 nov 2016 12:37:35
Mostrar los 4 comentarios restantes
0
-1

Tienes algunas opciones. La más fácil sería usar get_field( $field_key ) (utiliza el ID del campo ACF en lugar del meta_key). Esto seleccionará el campo correcto independientemente de las reglas de ubicación, lo que permitirá acceder al valor por defecto.

Si debes usar la meta clave, puedes hacerlo principalmente con filtros. No estoy seguro de cuán eficiente sea (podría mitigarse usando caché acf-json). Esto también asume que tus claves de campo son únicas (de lo contrario, tendrías que filtrar basado en las reglas de ubicación, que pueden o no estar disponibles).

add_filter( 'acf/load_value', function( $value, $post_id, $field ){
    // obtener tus grupos de campos
    $groups = acf_get_field_groups();
    if ( !empty( $groups ) ){
        // iterar sobre cada grupo
        foreach ($groups as $group) {
            // cargar los campos para esta clave de grupo
            $fields = acf_get_fields( $group['key'] );
            if ( !empty( $fields ) ){
                // iterar sobre los campos devueltos
                foreach ( $fields as $this_field ){
                    // si el nombre coincide, establecer el valor por defecto
                    if ( $this_field['name'] == $field['name'] ){
                        return $this_field['default_value'];
                    }
                }
            }
        }
    }
    return $value;
}
7 nov 2015 06:15:06