Mostrar todos los valores de un campo personalizado creado con ACF en una página
Estoy usando Advanced Custom Fields / ACF para crear campos personalizados. Uno de ellos es una lista de casillas de verificación que muestra algunas opciones (opción1, opción2, opción3...).
Ahora quiero mostrar todas las opciones de este campo en una página separada en el frontend de esta manera:
Opciones:
- opción 1
- opción 2
- opción 3
- ...
¿Cómo puedo recuperar todas las opciones con sus claves desde ACF?
La función get_field_object
de ACF se puede utilizar para obtener información y opciones de un campo específico.
Primero necesitas la clave del campo específico que deseas mostrar. Al editar un grupo de campos, haz clic en la pestaña de opciones de pantalla en la parte superior de la página. Deberías ver una opción para mostrar la clave del campo (está oculta por defecto para ahorrar espacio):
Una vez que tengas la clave, puedes cargar el objeto del campo y mostrar sus valores:
$field_key = "field_5039a99716d1d";
$field = get_field_object($field_key);
if( $field )
{
echo '<select name="' . $field['key'] . '">';
foreach( $field['choices'] as $k => $v )
{
echo '<option value="' . $k . '">' . $v . '</option>';
}
echo '</select>';
}

Sería bueno si pudiéramos referenciar el nombre, tan fácil como es usar la clave. De esta manera, si tienes esto en un plugin y alguna vez necesitas probarlo en otra instancia de WordPress con ACF habilitado, no tendrás que buscar la clave y cambiarla nuevamente solo porque estás en el entorno B.

Si estás intentando mostrar algo si una casilla de verificación fue marcada, usa:
<?php if(in_array('news', get_field('checkbox') )): ?>
<h1>¡La opción News fue marcada!</h1>
<?php endif; ?>
Si solo quieres mostrar una lista de las opciones marcadas, usa esto:
<p>Categorías: <?php get_field('checkbox'); ?></p>
Esto te dará un array de valores que puedes manejar con una declaración foreach
. Usar the_field('checkbox')
te dará una cadena separada por comas de las opciones que también puedes dividir.
También te sugiero que visites el sitio de ACF y revises la documentación. La mayoría de preguntas de este tipo están respondidas allí con bastante detalle, y el desarrollador está activo en los foros de soporte.
EDIT: Si quieres mostrar la lista de opciones disponibles en una página para generar una consulta dinámica, tengo justo lo que necesitas. Este es un fragmento que construí ayer para obtener una lista de valores meta de un campo personalizado dado (usando ACF). Lo he hecho bastante genérico para ti. Hay otro trozo de JS para manejar la solicitud ajax, y una parte de PHP algo enredada que muestra los posts resultantes. No puedo reescribir eso - el JS es una llamada/respuesta ajax estándar de WP, y el PHP es un lío de comprobaciones condicionales para los 12 campos ACF que mostramos (2 de los cuales son repetidores). Lo básico es este código aquí, el botón onClick
llama a la función ajax en un archivo JS separado, y el PHP para la función ajax en sí esencialmente configura un array de argumentos para la consulta, uno de los cuales es $selectedOption
o $_POST['option']
como meta_value. Eso se pasa a un new WP_Query( $args );
, que luego se usa en un bucle, cuya salida se devuelve al js mediante add_action('wp_ajax_the_ajax_hook', 'fetch_option_list');
y add_action( 'wp_ajax_nopriv_the_ajax_hook', 'fetch_option_list' ); //para usuarios no logueados
.
// Obtener lista de meta_values para un meta_key y post_type dados (page, post, custom post type)
function meta_list($key = '', $type = '', $status = 'publish'){
global $wpdb;
$r = $wpdb->get_col($wpdb->prepare( "
SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'
ORDER BY pm.meta_value ASC", $key, $status, $type));
return $r;
}
// AÑADIR EJ. UN FORMULARIO A LA PÁGINA
function meta_ajax_frontend(){
$formlist = meta_list('metakey', 'posttype');
echo '<form id="optionSelect">';
echo '<select id="optionList" name="optionList">';
foreach($formlist as $fl => $val) {
echo '<option>' . $val . '</option>';
}
echo '</select>';
echo '<input name="action" type="hidden" value="the_ajax_hook" />
<input id="submit_button" value = "Buscar" type="button" onClick="fetch_meta();" />
</form>
<div id="meta_list">
Por favor selecciona una opción de la lista
</div>';
}

Mm, si hago esto, mostraré las opciones asignadas al "post", lo que necesito es mostrar todas las opciones en una "página" como una lista completa de opciones.

Me pregunto por qué necesitas mostrar la lista de opciones del backend en el frontend. ¿Quieres simplemente mostrar la lista de opciones con los elementos seleccionados en el administrador? Si estás intentando usar esto como parte de un formulario (permitiendo que el usuario altere los datos marcados), este no es el plugin o método correcto para hacerlo. Sin embargo, si quieres la lista de opciones para usarla como prefiltro para reescribir la consulta, puede que tenga justo lo que necesitas. Editaré mi publicación anterior con ese código en breve.

Hola, soy Bob con otra cuenta. Necesito las opciones del backend para crear una especie de "menú" con ellas. Creo que tu código recupera posts y las opciones asignadas a ellos. Solo necesito la lista de opciones como la que aparece en el backend cuando creas un post. Seguiré trabajando con tu código para ver si puedo descubrir algo. Gracias @SickHippie

No, extrae la lista de opciones que se han seleccionado en ese checkbox - es decir, dice "aquí está el checkbox, hay posts a los que se les han asignado los valores 'opción 1', 'opción 2', 'opción 4' y así sucesivamente. Literalmente solo extrae la lista de meta_value basada en ese meta_key. Lo necesitaba para una lista dinámica, pero si creas un post borrador con todos los checkboxes seleccionados, extraerá todas las opciones en un array para ti. Ese es el array que estoy usando en el foreach
para iterar. Las funciones posteriores traen la lista de posts via ajax, pero esa parte la dejé fuera.
