Campos de salida de todo el grupo Campos personalizados avanzados

6 minutos de lectura

avatar de usuario
Tomás

Estoy tratando de encontrar una manera (usando el complemento ACF de wordpress) para generar un grupo completo de campos.

Tengo dos “Grupos de campo” y quiero decir si alguno de ellos está “Activo” (con una casilla de verificación) para repetirlos en mi plantilla.

La pregunta es, ¿cómo obtengo una matriz de todos los datos de los campos de un “Grupo de campos”?

En este momento estoy intentando algo como lo siguiente:

<?php

$group_ID = 37;

$fields = array();
$fields = apply_filters('acf/field_group/get_fields', $fields, $group_ID);

echo "<pre>";
print_r($fields);
echo "</pre>";

?>

Genera una serie de campos pero, por lo que puedo decir, no contiene datos reales:

Array
(
    [0] => Array
        (
            [key] => field_537b79d92081f
            [label] => Active-1
            [name] => active-1
            [_name] => active-1
            [type] => true_false
            [order_no] => 0
            [instructions] => 
            [required] => 0
            [id] => acf-field-active-1
            [class] => true_false
            [conditional_logic] => Array
                (
                    [status] => 0
                    [rules] => Array
                        (
                            [0] => Array
                                (
                                    [field] => null
                                    [operator] => ==
                                )

                        )

                    [allorany] => all
                )

            [message] => 
            [default_value] => 0
            [field_group] => 37
        )

    [1] => Array
        (
            [key] => field_537b78a4c743e
            [label] => Title-1
            [name] => title-1
            [_name] => title-1
            [type] => text
            [order_no] => 1
            [instructions] => 
            [required] => 0
            [id] => acf-field-title-1
            [class] => text
            [conditional_logic] => Array
                (
                    [status] => 0
                    [rules] => Array
                        (
                            [0] => Array
                                (
                                    [field] => field_537b79d92081f
                                    [operator] => ==
                                    [value] => 1
                                )

                        )

                    [allorany] => all
                )

            [default_value] => 
            [placeholder] => 
            [prepend] => 
            [append] => 
            [formatting] => html
            [maxlength] => 
            [field_group] => 37
        )

    [2] => Array
        (
            [key] => field_537b78c6c743f
            [label] => Info-1
            [name] => info-1
            [_name] => info-1
            [type] => textarea
            [order_no] => 2
            [instructions] => 
            [required] => 0
            [id] => acf-field-info-1
            [class] => textarea
            [conditional_logic] => Array
                (
                    [status] => 0
                    [rules] => Array
                        (
                            [0] => Array
                                (
                                    [field] => field_537b79d92081f
                                    [operator] => ==
                                    [value] => 1
                                )

                        )

                    [allorany] => all
                )

            [default_value] => 
            [placeholder] => 
            [maxlength] => 
            [rows] => 
            [formatting] => br
            [field_group] => 37
        )

)

Básicamente, me gustaría hacer lo siguiente (disculpe el código sudo/roto, PHP no es mi idioma):

<?php

    $group_ID1 = 37;

    $fields = array($group_ID1);

    if ($fields1['active'] !== null) {
        echo "<h1>";
        echo $fields1['active']['text'];
        echo $fields1['title']['text'];
        echo $fields1['content']['text'];
        echo "<h1>";
    }

    $group_ID2 = 38;

    $fields2 = array($group_ID2);

    if ($fields2['active'] !== null) {
        echo "<h1>";
        echo $fields2['active']['text'];
        echo $fields2['title']['text'];
        echo $fields2['content']['text'];
        echo "<h1>";
    }

?>

También puedo obtener datos de campos específicos como los siguientes:

<?php

    $field_key = "field_537b78c6c743f";
    $field = get_field_object($field_key);

    if($field) {
        echo "<pre>";
        print_r($field);
        echo "</pre>";
    }

?>

Lo que genera lo siguiente:

Array
(
    [key] => field_537b78c6c743f
    [label] => Info-1
    [name] => info-1
    [_name] => info-1
    [type] => textarea
    [order_no] => 2
    [instructions] => 
    [required] => 0
    [id] => acf-field-info-1
    [class] => textarea
    [conditional_logic] => Array
        (
            [status] => 0
            [rules] => Array
                (
                    [0] => Array
                        (
                            [field] => field_537b79d92081f
                            [operator] => ==
                            [value] => 1
                        )

                )

            [allorany] => all
        )

    [default_value] => 
    [placeholder] => 
    [maxlength] => 
    [rows] => 
    [formatting] => br
    [field_group] => 37
    [value] => testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
)

Pero, ¿realmente necesito llamar a cada tecla de campo para cada “Grupo de campo”? ¿No hay una matriz de todos los campos en un “Grupo de campo”?

Puede obtener una matriz de todos los campos, pertenecientes a un grupo. La función es:

$acf_fields = acf_get_fields_by_id( $group_ID );

Necesitamos saber el ID del grupo de campo ACF. Puede encontrarlo en la URL en la página de edición del grupo, por ejemplo:

http://site.ru/wp-admin/post.php?post=340&action=edit

En este caso, la identificación del grupo es 340. Si no desea usar una identificación codificada (si sus grupos cambian de vez en cuando), puede obtenerla usando el nombre del grupo (en este ejemplo, la identificación del nombre del grupo es Technic CPT):

global $wpdb;
$group_ID = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE post_title="Technic CPT"" );

La salida se verá así:

array(1) {
  [0] => array(29) {
    ["ID"] => int(366)
    ["key"] => string(19) "field_55f05295a59ca"
    ["label"] => string(29) "Gallery of technic"
    ["name"] => string(15) "technic_gallery"
    ["prefix"] => string(0) ""
    ["type"] => string(7) "gallery"
    ["value"] => NULL
    ["menu_order"] => int(6)
    ["instructions"] => string(155) "Field instructions"
    ["required"] => int(0)
    ["id"] => string(0) ""
    ["class"] => string(0) ""
    ["conditional_logic"] => int(0)
    ["parent"] => int(340)
    ["wrapper"] => array(3) {
      ["width"] => int(50)
      ["class"] => string(0) ""
      ["id"] => string(0) ""
    }
    ["_name"] => string(15) "technic_gallery"
    ["_input"] => string(0) ""
    ["_valid"] => int(1)
    ["min"] => string(0) ""
    ["max"] => int(10)
    ["preview_size"] => string(9) "thumbnail"
    ["library"] => string(3) "all"
    ["min_width"] => int(475)
    ["min_height"] => int(365)
    ["min_size"] => string(0) ""
    ["max_width"] => string(0) ""
    ["max_height"] => string(0) ""
    ["max_size"] => int(2)
    ["mime_types"] => string(0) ""
  }
}

  • Esta función ya no está disponible (¿todavía?) en ACF 4.4.7 (versión gratuita actual)

    – jave.web

    18 de junio de 2016 a las 10:18

  • Sí, necesito mencionar: estoy usando pro versión de acf. Revisaré el código de alternativa, ¡gracias por señalar esto!

    – Alhana

    19 de junio de 2016 a las 11:53

Utilicé el siguiente enfoque para obtener lo que quería:

<?php
    // Get wordpress page all fields
    $post_id = get_the_ID();
    $fields = get_field_objects($post_id);
?>

<?php
    // Remember Widget
    $status = $fields['remember-status']['value'];
    $text = $fields['remember-text']['value'];
    if ($status == TRUE) {
        echo "<div class=\"info-container\">";
            echo "<p>" . $text . "</p>";
        echo "</div>";
    };
?>

Filtrar acf/field_group/get_fields no parece cargar los campos.

Debe cargarlos después de obtenerlos, pero es una buena idea verificar si el valor está establecido o no antes de intentar cargarlos, en caso de que algo haya cambiado 🙂

Puedes usar acf/load_value y posiblemente acf/format_value filtros para obtener la salida deseada.

He creado esta pequeña función de cargador que obtiene referencia a la matriz de campos ACF conseguidos acf/field_group/get_fields filtro, los recorre y carga (y formatea) sus valores si es necesario:

function my_load_ACF_fields_values( &$ACF_FIELDS, $post_id = null ){
  if( empty($ACF_FIELDS) ) return false;
  if( empty($post_id) ) $post_id = get_the_ID();

  foreach( $ACF_FIELDS as &$acf_field ){
    if( !isset($acf_field['value']) ){
       $acf_field['value'] = apply_filters('acf/load_value', false, $post_id, $acf_field);
       $acf_field['formatted_value'] = apply_filters(
          'acf/format_value', $acf_field['value'], $post_id, $acf_field
       );
    }
  } 
  return true;
}

Entonces el uso es el siguiente:

//1. GET FIELDS BY GROUP ID
$my_acf_fields = apply_filters('acf/field_group/get_fields', [], $my_acf_GROUP_ID);

//2. LOAD/INJECT THEIR VALUES
my_load_ACF_fields_values( $my_acf_fields /*, $possiblyCustomPostID */ );

//3. Display/Process fields...

NOTA: Tenga en cuenta que sé que cargar valores uno por uno no es una gran idea, lamentablemente, la API de ACF no parece tener una mejor manera y, además de todo, parece que el complemento hace esto por sí mismo para la pantalla nativa de ACF…

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad