web-dev-qa-db-fra.com

ACF - récupère les champs du groupe

j'utilise ce code pour obtenir tous les champs d'un groupe spécifique:

<?php
$GroupOrPostSlug = 'acf_specialgroup';
//or insert the ID of your fields Group.
$groupID='';



global $wpdb;
if (empty($groupID))
{$groupID = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name =  '$GroupOrPostSlug' ");}
if (empty($groupID))
{$groupID = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title =  '$GroupOrPostSlug' ");}

$custom_field_keys = get_post_custom_keys($groupID);
foreach ( $custom_field_keys as $key => $fieldkey )
{
    if (stristr($fieldkey,'field_'))
    {
        //echo $key . " => " . $fieldkey . "<br />";
        //echo $field['label'] . ': ' . $field['value'];
        //echo $fieldkey . "<br />";
        $field = get_field_object($fieldkey, $groupID);
        echo $field['label'];

    }
}
?>

mais il n’affiche que les noms de champs. n'existe-t-il pas un simple crochet/fonction, quelque chose comme ceci: get_all_fields_from_group($id)

5
T.Todua

Merci beaucoup pour votre message, j'ai passé une demi-journée à comprendre comment obtenir les noms de champs par leur groupe.

Si vous avez des noms de champs, vous pouvez facilement obtenir leurs valeurs: get_field ($ field ['name']);

EXEMPLE COMMENT OBTENIR DES IMAGES POUR SLIDER

    <?php 
                    //or insert the ID of your fields Group.
                    $groupID='116';
                    $custom_field_keys = get_post_custom_keys($groupID);
                    foreach ( $custom_field_keys as $key => $fieldkey )
                    {
                        if (stristr($fieldkey,'field_'))
                        {
                            //echo $key . " => " . $fieldkey . "<br />";
                            //echo $field['label'] . ': ' . $field['value'];
                            //echo $fieldkey . "<br />";
                            $field = get_field_object($fieldkey, $groupID); 

                            $acf_field_name = $field['name'];

                            $attachment = get_field($acf_field_name);
                            echo "<img src='".$attachment['url']."' title='".$attachment['title']."'/>";


                        }
                    }

?> 

Merci encore!

9
Dejan

Voici une fonction que j'ai créée pour obtenir les champs d'un groupe:

function my_acf_get_fields_in_group( $group_id ) {
    $acf_meta = get_post_custom( $group_id );
    $acf_fields = array();

    foreach ( $acf_meta as $key => $val ) {
        if ( preg_match( "/^field_/", $key ) ) {
            $acf_fields[$key] = $val;
        }
    }

    return $acf_fields;
}
3
Alexander Wallin

Étant donné qu'ACF utilise des publications personnalisées de type "acf" en tant que groupes, nous pouvons utiliser get_page_by_title pour récupérer l'ID du groupe, puis faire le reste. Voici une petite fonction utilitaire:

// This was tested with ACF free edition v4.4.11
function get_group_fields($group_name){
  $group = get_page_by_title($group_name, OBJECT, 'acf');
  if(empty($group)) return false;

  $meta = get_post_meta($group->ID);
  $acf_fields = array();

  foreach($meta as $key => $value){
    $acf_meta_key = stristr($key,'field_'); // acf fields all start with "field_"
    if($acf_meta_key) $acf_fields[] = get_field_object($key);
  }

  return $acf_fields; // returns an array of field objects
}

Usage:

$group_fields = get_group_fields('My marvelous group');

foreach($group_fields as $field){
   $label = $field['label'];
   $value = $field['value'];
   // etc...
}
1
Luca Reghellin

Au cas où quelqu'un tomberait sur cette page, comme moi, et essaierait de comprendre cela, ces méthodes ne fonctionneraient plus avec la version 5 et les versions ultérieures de Advanced Custom Fields, car ce sont des posts d'utilisation au lieu de postmeta.

Dans cet environnement, c’est ainsi que j’ai pu extraire des champs d’un groupe et les utiliser comme valeurs d’un champ de sélection:

function acf_load_select_choices( $field ) {

  global $wpdb;
  $group_slug = 'Name or slug of the group';

  $group_ID = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name =  '$group_slug' "); 
  if (empty($group_ID))
    $group_ID = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title =  '$group_slug' ");

  $field['choices'] = array();
  $fields = acf_get_fields_by_id($group_ID);

  // to see what $fields contains, use:
  echo '<pre>'.var_dump($fields).'</pre>';

  if( $fields ) {
    foreach( $fields as $fieldrow ) {
      $field['choices'][ $fieldrow['name'] ] = $fieldrow['label'];
    }
  }

  return $field;

}

add_filter('acf/load_field/name=selectfieldname', 'acf_load_select_choices');
1
ionfish

Si quelqu'un cherche encore. Vous pouvez simplement le faire comme ceci:

<?php 

      $fields = get_field_objects();

      if( $fields )
      {
        foreach( $fields as $field_name => $field )
        {
            echo '<div>';
                echo '<h3>' . $field['label'] . '</h3>';
                echo $field['value'];
            echo '</div>';
        }
      }
?>
0
Artemiy Egorov