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

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.

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

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

¿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.

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?

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.

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.

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

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

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