Расширенное настраиваемое поле Wordpress отсутствует в объекте сообщения

  • Wordpress 4.9.8
  • Расширенные настраиваемые поля Pro 5.7.7

Моя первая и самая серьезная проблема заключается в том, что the_field('a_field_I_have_in_art_post') возвращает пустой.

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

Я думал, что расширенные настраиваемые поля отображаются как мета-ключ в объекте сообщения (?).

реестр настраиваемых типов записей:

function art_init()
{
    $arts_labels = array(
        'name' => 'Arts',
        'singular_name' => 'Art',
        'menu_name' => 'Arts'
    );

    $args = array(
        'labels' => $arts_labels,
        'public' => true,
        'show_ui' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'rewrite' => array('slug' => 'art'),
        'query_var' => true,
        'menu_icon' => 'dashicons-welcome-widgets-menus',
        'supports' => array(
            'title',
            'editor',
            'excerpt',
            'trackbacks',
            'custom-fields',
            'comments',
            'revisions',
            'thumbnail',
            'author',
            'page-attributes',)
    );
    register_post_type('art', $args);
}

add_action('init', 'art_init');

пост-отладка:

$posts = get_posts([
    'numberposts' => -1,
    'post_type' => 'art',
]);
if ($posts) {
    foreach ($posts as $postKey => $postValue) {
        var_dump($postValue->meta_key);
        $postAcfFields = get_fields($postValue);
        //var_dump('$postAcfFields: '.count($postAcfFields));
        if ($postAcfFields['item_images']) {
            $postObjWithImages[$postValue->ID] = $postAcfFields;
        }
    }
}

Отладка возвращается:

object(WP_Post)[1600]
  public 'ID' => int 1840
  public 'post_author' => string '1' (length=1)
  public 'post_date' => string '2018-10-13 10:53:45' (length=19)
  public 'post_date_gmt' => string '2018-10-13 10:53:45' (length=19)
  public 'post_content' => string '' (length=0)
  public 'post_title' => string 'this is a contact' (length=17)
  public 'post_excerpt' => string '' (length=0)
  public 'post_status' => string 'publish' (length=7)
  public 'comment_status' => string 'open' (length=4)
  public 'ping_status' => string 'open' (length=4)
  public 'post_password' => string '' (length=0)
  public 'post_name' => string 'this-is-a-contact' (length=17)
  public 'to_ping' => string '' (length=0)
  public 'pinged' => string '' (length=0)
  public 'post_modified' => string '2018-10-13 13:47:17' (length=19)
  public 'post_modified_gmt' => string '2018-10-13 13:47:17' (length=19)
  public 'post_content_filtered' => string '' (length=0)
  public 'post_parent' => int 0
  public 'guid' => string 'http://website.com/?post_type=art&p=1840' (length=61)
  public 'menu_order' => int 0
  public 'post_type' => string 'art' (length=3)
  public 'post_mime_type' => string '' (length=0)
  public 'comment_count' => string '0' (length=1)
  public 'filter' => string 'raw' (length=3)

the_field('item_title), например, возвращает пустой, но get_fields() в цикле объекта сообщения показывает отдельный массив всех полей ACF без связи с объектом сообщения и его атрибутами (ссылка, заголовок и т. д.).

Как видно из моего фрагмента, я создал ассоциативный массив, чтобы помочь с этим, но это делает все мои запросы неоптимизированными, вялыми и очень сложными для объединения с HTML с несколькими вложенными foreach(), особенно для изображений, поскольку я пытаюсь реализовать их изображения в слайдере начальной загрузки с несколькими внутренними элементами на основе публикации.

Я заинтересован в использовании get_field(), на каждом 'post_type' => 'art' много образов.

вы скоро обновите плагин дополнительных настраиваемых полей?

dineshkashera 20.10.2018 08:39

да, 5.7.7 купил PRO, добавлю в вопросе.

clusterBuddy 20.10.2018 08:40

Можете ли вы увидеть ссылку на обновление базы данных для дополнительных настраиваемых полей на стороне администратора? Перейдите в раздел Плагины >> Установленные плагины и посмотрите, видите ли вы какое-либо уведомление для расширенного плагина настраиваемых полей.

dineshkashera 20.10.2018 08:46

@dineshkashera, уведомлений нет. он обновлен и готов к использованию, возможно, я просто неправильно его использую ... Так я прав? ACF должен быть на объекте post как какой-то мета-ключ?

clusterBuddy 20.10.2018 08:49

Пожалуйста, получите доступ к вашему ключу с помощью get_post_meta ($ post_id, 'a_field_I_have_in_art_post', true); Вы также можете получить доступ к мета поста.

dineshkashera 20.10.2018 08:52
get_post_meta() действительно возвращает значение по моему выбору, но это все еще не решает проблему, которую я должен совершить для создания слайдера начальной загрузки, 3 слайда в наборе и на основе заголовка, который может иметь более 3 слайдов. $image = get_field('item_images'); будет массивом, и я не могу до него добраться <= вот в чем проблема.
clusterBuddy 20.10.2018 09:08

Если я понимаю ваш вопрос, clusterBuddy, если вы пытаетесь получить поле ACF полного массива изображений, вам придется создавать разметку для каждого изображения: <img src = "<?php echo $image['url']; ?>" alt = "<?php echo $image['alt']; ?>" /

tnog 20.10.2018 09:14
Как убрать количество товаров в категории WooCommerce
Как убрать количество товаров в категории WooCommerce
По умолчанию WooCommerce показывает количество товаров рядом с категорией, как показано ниже.
1
7
732
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что проблема заключается в том, чтобы понять, что такое поле ACF: просто настраиваемое поле WordPress (хранящееся в таблице wp_postmeta), а не часть стандартного объекта WP_Post, который хранится в таблице wp_posts.

Другой ответ, который раскрывает это немного глубже с некоторыми альтернативными подходами, - это ответ в WordPress Stack Exchange: https://wordpress.stackexchange.com/questions/172041/can-wp-query-return-posts-meta-in-a-single-request

Таким образом, в приведенном выше цикле foreach вы можете получить свое настраиваемое поле с помощью ACF get_field ($ selector, $ post_id) или вы также можете использовать get_post_meta ($ post_id, $ key), но вам нужно будет передать $ post_id.

$postAcfFields = get_fields($postValue); 
    //var_dump('$postAcfFields: '.count($postAcfFields));
    if ($postAcfFields['item_images']) { // This will always return false since you're not specifying the $post_id above in get_fields($postValue)
        $postObjWithImages[$postValue->ID] = $postAcfFields;
 }

Другие вопросы по теме