ACF - получение полей из группы

9 апр. 2013 г., 12:36:33
Просмотры: 40.1K
Голосов: 7

Я использовал следующий код для получения всех полей из определенной группы:

<?php
$GroupOrPostSlug = 'acf_specialgroup';
//или вставьте ID вашей группы полей
$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'];

    }
}
?>

но он отображает только названия полей. Не существует ли простой хук/функция, что-то вроде: get_all_fields_from_group($id)

0
Все ответы на вопрос 6
2
10

Большое спасибо за ваш пост, я потратил полдня, чтобы разобраться, как получить названия полей по их группе.

Если у вас есть названия полей, вы легко можете получить их значения: get_field($field['name']);

ПРИМЕР ПОЛУЧЕНИЯ ИЗОБРАЖЕНИЙ ДЛЯ СЛАЙДЕРА

    <?php 
                    //или вставьте ID вашей группы полей.
                    $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']."'/>";


                        }
                    }

?> 

Ещё раз спасибо!

10 июл. 2013 г. 18:47:29
Комментарии

Просто заметка, почему это работает: ACF использует пользовательские типы записей и мета-значения WordPress ("post customs") :)

jave.web jave.web
19 июн. 2016 г. 03:10:35

Это очень сложно; смотрите ответ Lucas, где приведена уже готовая функция от ACF

jla jla
12 февр. 2022 г. 10:28:04
1

Удивительно, что никто еще не упомянул acf_get_fields('someGroupId').

/**
 * acf_get_fields
 *
 * Возвращает массив полей для указанного $parent.
 *
 * @date    30/09/13
 * @since   5.0.0
 *
 * @param   (int|string|array) $parent Настройки группы полей или полей. Также принимает ID или ключ группы полей.
 * @return  array
 */
2 окт. 2021 г. 01:08:24
Комментарии

Спасибо за это. Мне было интересно, почему все остальные ответы такие сложные по сравнению с acf_get_fields

CodeBrauer CodeBrauer
13 окт. 2021 г. 13:00:25
0

Вот функция, которую я создал для получения полей группы:

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 окт. 2013 г. 19:02:13
1

Если кто-то, как и я, наткнулся на эту страницу и пытался разобраться, то эти методы больше не работают с версией 5 и выше Advanced Custom Fields, так как теперь используются записи (posts) вместо postmeta.

В такой среде вот способ, который позволил мне получить поля из группы и использовать их как значения для поля выбора (select):

function acf_load_select_choices( $field ) {

  global $wpdb;
  $group_slug = 'Название или ярлык группы';

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

  // чтобы увидеть, что содержит $fields, используйте:
  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 мая 2015 г. 19:44:14
Комментарии

acf_get_fields_by_id устарел в пользу новой функции acf_get_fields()

jave.web jave.web
24 февр. 2021 г. 17:04:49
0

Поскольку ACF использует пользовательские записи типа 'acf' для групп, мы можем использовать get_page_by_title для получения ID группы, а затем выполнить остальные действия. Вот небольшая вспомогательная функция:

// Тестировалось с 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 начинаются с "field_"
    if($acf_meta_key) $acf_fields[] = get_field_object($key);
  }

  return $acf_fields; // возвращает массив объектов полей
}

Использование:

$group_fields = get_group_fields('Моя замечательная группа');

foreach($group_fields as $field){
   $label = $field['label'];
   $value = $field['value'];
   // и т.д...
}
31 июл. 2017 г. 12:33:20
4

Если кто-то все еще ищет решение. Вы можете сделать это следующим образом:

<?php 

      // Получаем все объекты полей ACF
      $fields = get_field_objects();

      // Проверяем, есть ли поля
      if( $fields )
      {
        // Проходимся по каждому полю
        foreach( $fields as $field_name => $field )
        {
            echo '<div>';
                echo '<h3>' . $field['label'] . '</h3>'; // Выводим заголовок поля
                echo $field['value']; // Выводим значение поля
            echo '</div>';
        }
      }
?>
31 окт. 2017 г. 20:06:57
Комментарии

Пожалуйста, уделите минуту и объясните, что происходит в коде, вместо того чтобы просто скидывать фрагмент кода.

user9447 user9447
31 окт. 2017 г. 20:20:19

Ну, это практически ответ на вопрос: "как получить названия полей по их группе." А также значения здесь; Фрагмент кода достаточно самодостаточен

Artemiy Egorov Artemiy Egorov
12 дек. 2017 г. 12:47:35

Потрясающе! Не понимаю, почему они не включают get_field_objects в свою документацию!

Protector one Protector one
25 мар. 2019 г. 19:42:30

А как можно получить название определенной группы полей, а не всех?

Johan Johan
1 окт. 2021 г. 22:11:21