ACF - ottenere i campi da un gruppo

9 apr 2013, 12:36:33
Visualizzazioni: 40.1K
Voti: 7

Ho utilizzato questo codice per ottenere tutti i campi da un gruppo specifico:

<?php
$GroupOrPostSlug = 'acf_specialgroup';
//oppure inserisci l'ID del tuo gruppo di campi
$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'];

    }
}
?>

ma visualizza solo i nomi dei campi. Non esiste una funzione/hook più semplice, qualcosa del tipo: get_all_fields_from_group($id)

0
Tutte le risposte alla domanda 6
2
10

Grazie mille per il tuo post, ho passato mezza giornata a cercare di capire come ottenere i nomi dei campi in base al loro gruppo.

Se hai i nomi dei campi, puoi facilmente ottenere i loro valori: get_field($field['name']);

ESEMPIO SU COME OTTENERE IMMAGINI PER UNO SLIDER

    <?php 
                    //o inserisci l'ID del tuo gruppo di campi.
                    $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']."'/>";


                        }
                    }

?> 

Grazie ancora!

10 lug 2013 18:47:29
Commenti

Solo una nota sul perché funziona: ACF utilizza tipi di post personalizzati nativi di WordPress e valori meta ("post customs") :)

jave.web jave.web
19 giu 2016 03:10:35

Questo è molto complicato; vedi la risposta di Lucas per una funzione già fornita da ACF

jla jla
12 feb 2022 10:28:04
1

Mi sorprende che nessuno abbia ancora menzionato acf_get_fields('someGroupId').

/**
 * acf_get_fields
 *
 * Restituisce un array di campi per il dato $parent.
 *
 * @date    30/09/13
 * @since   5.0.0
 *
 * @param   (int|string|array) $parent Il gruppo di campi o le impostazioni del campo. Accetta anche l'ID o la chiave del gruppo di campi.
 * @return  array
 */
2 ott 2021 01:08:24
Commenti

Grazie per questo. Mi chiedevo perché tutte le altre risposte siano così complesse rispetto a acf_get_fields

CodeBrauer CodeBrauer
13 ott 2021 13:00:25
0

Ecco una funzione che ho creato per ottenere i campi di un gruppo:

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;
}
9 ott 2013 19:02:13
1

Nel caso qualcuno si imbattesse in questa pagina come è successo a me, e stesse cercando di capire come fare, questi metodi non funzionano più dalla versione 5 in poi di Advanced Custom Fields in quanto utilizza post invece di postmeta.

In questo contesto, questo è il modo in cui sono riuscito a ottenere i campi da un gruppo e usarli come valori per un campo select:

function acf_load_select_choices( $field ) {

  global $wpdb;
  $group_slug = 'Nome o slug del gruppo';

  $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);

  // per vedere cosa contiene $fields, usa:
  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');
25 mag 2015 19:44:14
Commenti

acf_get_fields_by_id è stato deprecato in favore del nuovo acf_get_fields()

jave.web jave.web
24 feb 2021 17:04:49
0

Dato che ACF utilizza post personalizzati di tipo 'acf' come gruppi, possiamo usare get_page_by_title per recuperare l'ID del gruppo, e poi fare il resto. Ecco una piccola funzione di utilità:

// Questo è stato testato con ACF versione gratuita 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_'); // i campi acf iniziano tutti con "field_"
    if($acf_meta_key) $acf_fields[] = get_field_object($key);
  }

  return $acf_fields; // restituisce un array di oggetti campo
}

Utilizzo:

$group_fields = get_group_fields('Il mio meraviglioso gruppo');

foreach($group_fields as $field){
   $label = $field['label'];
   $value = $field['value'];
   // ecc...
}
31 lug 2017 12:33:20
4

Se qualcuno sta ancora cercando una soluzione, puoi farlo semplicemente così:

<?php 

      // Ottieni tutti i campi personalizzati
      $fields = get_field_objects();

      // Verifica se ci sono campi
      if( $fields )
      {
        // Cicla attraverso ogni campo
        foreach( $fields as $field_name => $field )
        {
            echo '<div>';
                echo '<h3>' . $field['label'] . '</h3>'; // Mostra l'etichetta del campo
                echo $field['value']; // Mostra il valore del campo
            echo '</div>';
        }
      }
?>
31 ott 2017 20:06:57
Commenti

Per favore, prenditi un minuto e spiega cosa sta succedendo nel codice invece di incollare solo uno snippet di codice.

user9447 user9447
31 ott 2017 20:20:19

Beh, si tratta semplicemente della risposta alla domanda: "come ottenere i nomi dei campi in base al loro gruppo." E anche i valori qui presenti; Lo snippet è abbastanza autoesplicativo

Artemiy Egorov Artemiy Egorov
12 dic 2017 12:47:35

Fantastico! Non so perché non includano get_field_objects nella loro documentazione!

Protector one Protector one
25 mar 2019 19:42:30

E come potremmo ottenere il nome di un determinato gruppo di campi invece di tutti?

Johan Johan
1 ott 2021 22:11:21