Mostrar contenido post_object usando el plugin Advanced Custom Fields
Tengo dificultades para encontrar qué está mal en este código.
Lo que intento hacer: configurar un campo personalizado en el admin usando el plugin ACF para listar en un meta-box en todas las páginas una lista de testimonios (custom-post-type). Desde el menú desplegable el cliente puede seleccionar un testimonio que se mostrará en esa página específica.
Estoy usando una versión ligeramente modificada del tema twentytwelve y este es el código que uso en mi plantilla front_page.
El código:
<?php $featured_testimonial = get_field('testimonial', $post_object->ID); ?>
<?php foreach ($featured_testimonial as $post_object): ?>
<a href="<?php echo get_permalink($post_object->ID); ?>">
<p class="descr"><?php echo get_the_title($post_object->ID) ?></p>
</a>
<?php endforeach; ?>
El problema: este código no muestra nada en la front-page. Hice un print_r( $post_object )
y mostró toda la información de mi testimonio (título, fecha, contenido, etc).
La solución: Durante los últimos 2/3 días he estado tratando de obtener una respuesta en los foros de soporte de ACF y esta es la respuesta que obtuve:
El campo post object devolverá un objeto de post, no HTML. Usar the_field en un campo post_object resultará en que no se muestre nada.
Necesitas almacenarlo como una variable, luego usar el ID o la variable post_title para mostrar el HTML deseado
¿No entendí la solución o estoy haciendo exactamente lo que dice el mensaje y el problema está en otro lugar?
Edición posterior: Esta es mi configuración actual en ACF para el campo de testimonio:
Reglas: Post Types - Page. Nombre del Campo - Testimonial. Tipo de Campo: Post Object. Tipo de Post: Testimonial. Filtrar por taxonomía: Todos.
Las 'reglas' significan que el campo personalizado solo aparecerá en páginas, y solo listará 'objetos de post' del tipo de post personalizado 'testimonial'. En el admin todo parece funcionar bien, es solo que no puedo hacer que se muestre nada en el front-end.
Edición final: Siguiendo la sugerencia de @s1lv3r cambié el tipo de campo de 'post-object' a 'relationship'. También modifiqué el código así:
<?php $posts = get_field('testimonial'); ?>
<?php if( $posts ): ?>
<?php foreach( $posts as $post): // la variable debe llamarse $post (IMPORTANTE) ?>
<?php setup_postdata($post); ?>
<?php echo get_the_excerpt(); ?>... <a href="<?php the_permalink(); ?>">+Más</a>
<?php the_title(); ?>
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>
<?php endif; ?>
Ahora todo funciona correctamente en el front-end. Gracias a todos por la ayuda.

El código no parece estar sintácticamente incorrecto en principio. ¿Qué tipo de campo estás usando? ¿Relación?
Además, ¿por qué estás sobrescribiendo $post_object
y de dónde viene originalmente? Esa parte del código falta.
Para obtener el campo asociado al post actual (dentro del loop actual / objeto global $post que estás viendo), simplemente debes usar get_field('testimonial')
sin el parámetro de ID.
Si quieres obtener el campo asociado a otro post_object, ¿verificaste que $post_object->ID
contiene un post_id válido justo antes de la primera línea que compartiste?
Editado según nueva información:
¿Es este un campo de tipo post object con la opción 'multiple' habilitada? La documentación (http://www.advancedcustomfields.com/resources/field-types/post-object/) indica que estos campos solo devuelven un array de objetos post cuando la opción múltiple está habilitada, de lo contrario devolverá un único objeto post. Esto significaría que no necesitas el foreach-loop en tu código. En ese caso deberías usarlo así:
<?php $featured_testimonial = get_field('testimonial', $post_object->ID); ?>
<a href="<?php echo get_permalink($featured_testimonial->ID); ?>">
<p class="descr"><?php echo get_the_title($featured_testimonial->ID) ?></p>
</a>

He realizado una edición en la publicación original, explicando más sobre mi configuración. Probé con get_field('testimonial')
y obtengo el mismo resultado (no se muestra nada).
El código de arriba está en el bucle principal (pero también lo probé fuera del bucle). Es lo mismo.
¿Debería usar 'relationship' en lugar de 'post_object'?

También edité mi respuesta.
En general ambos tipos de campos hacen lo mismo. La relación solo tiene una interfaz más 'elegante' en el frontend. Echa un vistazo aquí: http://www.advancedcustomfields.com/resources/field-types/relationship/

@GeorgeGrigorita, todas las observaciones de s1lv3r son correctas. 1) Sobreescritura de $post_object
. 2) Uso de get_field
dentro o fuera del bucle. 3) foreach
innecesario para un campo con valor único, no es un array.

¡Gracias a todos por su ayuda! Realmente no sé por qué, pero parece estar funcionando con 'relationship' como tipo de campo en lugar de 'post-object'. Actualizaré el primer post.

Primero lo primero. ¿Seleccionaste un valor del menú desplegable en el área de administración? Si no lo has hecho, entonces no obtendrás ningún resultado de get_field
para esa página.
Además, si tienes acceso a tu base de datos, asegúrate de que haya un valor establecido para esa página en la tabla _postmeta
.
SELECT * FROM `wp_postmeta` WHERE `post_id` = XX
Donde XX es el ID de tu página, y YY (ver más abajo) es el ID del testimonio que seleccionaste del menú desplegable en el área de administración.
Entre los resultados deberías tener un par de filas como estas:
meta_id post_id meta_key meta_value
1607 XX testimonial YY
1608 XX _testimonial field_5177d30141f17
Si tienes todo esto configurado correctamente en la base de datos, entonces el problema está en tu código.
