ACF: получение информации в переменных из вложенной группы

#php #wordpress #advanced-custom-fields

#php #wordpress #дополнительно-пользовательские поля

Вопрос:

У меня есть следующая настройка поля:

 welcome_screen (type: group)
  title
  terms_group (type: group)
    terms_text (type: text) 

Я пытаюсь получить значение terms_text .

Вот что у меня есть до сих пор:

 <?php
$welcome_screen = get_field('welcome_screen'); // type: group

if($welcome_screen):
  $title        = $welcome_screen['title'];

  while( have_rows('welcome_screen') ): the_row();
    $terms_group = $welcome_screen('terms_group'); // nested group
    $terms_text           = $terms_group['terms_text'];
  endwhile;

endif;

echo $terms_text;

?> 

В настоящее время, если я echo $terms_text в while цикле, я получаю сообщение об ошибке Function name must be a string в этой строке: $terms_group = $welcome_screen('terms_group');

Я также хочу использовать $terms_text переменную вне цикла, поэтому интересно, есть ли альтернативный способ достичь того, чего я хочу, без цикла while?

Редактировать:

Я запустил a var_dump , чтобы проверить вывод:

 $welcome_screen = get_field('welcome_screen'); // type: group
echo '<pre>'; var_dump($welcome_screen); echo '</pre>'; 

Вот результат:

 array(3) {
  ["title"]=>
  string(13) "Health Survey"
  ["standfirst"]=>
  string(113) "We just need some answers to some quick health questions about your general health to get you the best treatment."
  ["terms_group"]=>
  array(3) {
    ["terms_text"]=>
    string(41) "By proceeding you agree to the following:"
    ["terms_listing"]=>
    array(2) {
      [0]=>
      array(1) {
        ["terms"]=>
        string(88) ""
      }
      [1]=>
      array(1) {
        ["terms"]=>
        string(0) ""
      }
    }
    ["agree_to_terms_radio"]=>
    string(3) "Yes"
  }
} 

Комментарии:

1. Сразу после $welcome_screen = get_field('welcome_screen'); этого вы можете добавить echo '<pre>'; var_dump($welcome_screen); echo '</pre>'; и поделиться выведенным массивом дампа, пожалуйста.

2. Привет @joshmoto — Конечно 🙂 Я отредактировал свой вопрос, чтобы продемонстрировать результат

3. почему бы просто не выполнить обычный цикл по массиву?

4. Если вы пытаетесь выйти за $terms_text пределы while цикла, кажется, нет причин даже использовать цикл здесь. Почему бы не использовать ключи массива для прямого доступа к данным? Похоже, вы даже не используете цикл для перебора нескольких массивов.

Ответ №1:

Хорошо, классные приветствия за публикацию данных дампа.

Поэтому я не думаю, что вам нужно использовать циклы, вы можете попробовать этот php ниже. Он не тестировался, поэтому вам может потребоваться исправить любые ошибки, если я их допустил.

Я не могу вспомнить, выводит ли acf значения массива, если они не установлены, поэтому вам может потребоваться добавить isset() некоторые переменные php, чтобы проверить, установлено ли значение.

Смотрите Комментарии в коде…

 <?php

// get welcome screen group
$welcome_screen = get_field('welcome_screen');

// check if we have group
if($welcome_screen) {
  
  // output the welcome title
  echo $welcome_screen['title'];
  
  // set the terms group
  $terms_group = $welcome_screen['terms_group'];

  // if terms group is array
  if(is_array[$terms_group]) {
    
    // output term group term text
    echo $terms_group['terms_text'];

    // set term group term listing
    $terms_listings = $terms_group['terms_listing'];
    
    // if terms listings is an array
    if(is_array($terms_listings)) {
      
      // foreach listings
      foreach($terms_listings as $terms_listing) {
        
        // output listing terms
        echo $terms_listing['terms'];

      }

    }

    // output term group term agreement
    echo $terms_group['agree_to_terms_radio'];

  }

}