Правильный способ вывода сгенерированных ACF-значений с помощью WP_Query () и Foreach () - PullRequest
1 голос
/ 16 января 2020

У меня есть поля настройки и подполя с использованием Advanced Custom Fields (ACF). Структура похожа на:

Field: Pet Details
- Sub-Field: Pet Name (text)
- Sub-Field: Pet Birthday (date picker)
- Sub-Field: Pet Gender (taxonomy, select)
- Additional... 

Я смог использовать их в своем пользовательском типе записи (/ cpt_slug / post_title), используя функции get_field(), get_sub_field(), однако я не смог использовать функции ACF по умолчанию (get_field(), get_sub_field() и т. д. c) в сочетании с дополнительными страницами, на которых отображается эта информация - в данном случае domain.com/account (страница моего аккаунта woocommerce), что хорошо для меня Я рад использовать WP_Query.

. Хотя у меня есть рабочий код ниже, мне нужно настроить $variable = get_post_meta( $pet->ID, field_sub_field, true ) для каждого подполя acf. Учитывая структуру массива,

Наилучший результат, который я мог бы получить, был echo $details['pet_details_pet_name'][0], который выдает 'Cooper' (правильно), но с моим ограниченным знанием массивов, есть ли шанс, что '0' будет когда-либо становился '1' и не позволял этому работать? Я не верю, что cpt / acf когда-нибудь поместит второе значение в массив, но я хотел бы услышать ваши мысли.

Код

global $current_user;

$query = new WP_Query ( array ( 
    'post_type' => 'audp_pets', 
    'author' => $current_user->ID, 
    'order' => 'ASC' 
    ) );

$pets = $query->posts;

if ( $pets ) {

    foreach ( $pets as $pet ) {

        var_dump ( $pet );

        ?><hr><?php

        echo "\$pet->post_title = " . $pet->post_title . '<br />';

        ?><hr><?php

        $details = get_post_meta( $pet->ID );

        $pet_name = get_post_meta( $pet->ID, 'pet_details_pet_name', true );
        echo "\$pet_name = " . $pet_name . '<br />';

        ?><hr><?php

        var_dump ( $details );


    }

wp_reset_postdata();

}

Выходы (Источник)

object(WP_Post)#13185 (24) {
  ["ID"]=>
  int(952)
  ["post_author"]=>
  string(1) "1"
  ["post_date"]=>
  string(19) "2020-01-16 16:24:17"
  ["post_date_gmt"]=>
  string(19) "2020-01-16 05:24:17"
  ["post_content"]=>
  string(0) ""
  ["post_title"]=>
  string(6) "AA0AA0"
  ["post_excerpt"]=>
  string(0) ""
  ... (additional fields)
}

(N.B -- $pet->post_title = AA0AA0)

array(56) {
  ["_edit_last"]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  ["_edit_lock"]=>
  array(1) {
    [0]=>
    string(12) "1579152259:1"
  }
  ["pet_details_pet_name"]=>
  array(1) {
    [0]=>
    string(6) "Cooper"
  }
  ["_pet_details_pet_name"]=>
  array(1) {
    [0]=>
    string(19) "field_5e1189ab705b2"
  }
  ["pet_details_pet_birthday"]=>
  array(1) {
    [0]=>
    string(8) "20130313"
  }
  ... (additional fields)
}

(N.B. $pet_name = Cooper)

Заранее спасибо.

1 Ответ

1 голос
/ 16 января 2020

По сути, вы можете сделать это так:

global $current_user;

$args = array ( 
'post_type' => 'audar_pets', 
'author' => $current_user->ID, 
'order' => 'ASC' 
);

$query = new WP_Query( $args );

//Here we set the loop up so we can use it all in the normal way.. 
if($query->have_posts()){
    while ($query->have_posts()) {
        $query->the_post();
        echo get_the_title();
        //Get you fields
        var_dump(get_field('pet_details'));

        if( have_rows('pet_details') ):

            // loop through the rows of data
            while ( have_rows('pet_details') ) : the_row();

                // display a sub field value
                the_sub_field('pet_name');

            endwhile;

        else :

        // no rows found

    endif;
    } 
wp_reset_postdata();
}

Но это предположение, что вы используете ретранслятор, и это действительно подполе, а не просто другое поле.

Вы также можете использовать have_rows et c, добавив идентификатор записи в конце, как вы можете использовать любую функцию ACF.

Вы можете получить любое поле с любой страницы, публикации, вложения et c вы хотите, добавив идентификатор $value = get_field( "text_field", 123 );

...