ACF get_field не возвращает значение - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь использовать get_field, чтобы вернуть простое текстовое поле, и оно возвращается по какой-то причине пустым.Само поле находится там, где оно должно быть, и в нем есть текст, так что эта часть полностью установлена.Этот код PHP загружается с помощью фрагмента php, например, миниатюра поста, отображается отлично.Так что все работает, кроме значения поля ACF.

<div class="your-class">
    <?php
    $args = array(
        'post_type' => 'home_test',
        'posts_per_page' => -1,
        'orderby'   => 'name',
        'order'     => 'ASC',
    );
    $the_query = new WP_Query($args);
    $brand = get_posts($args);
    foreach ($brand as $post) {
        setup_postdata($post);
        $thumbnail = get_the_post_thumbnail_url($post->ID, 'full');

        $homelinkvalue = get_field("home_brand_link");

        if (!$thumbnail)
            continue;
        ?>
        <div>
            <p><?php echo $homelinkvalue; ?></p><img src="<?php echo $thumbnail; ?>">
        </div>

    <?php
    }
    wp_reset_postdata();
    ?>
</div>

Ответы [ 2 ]

6 голосов
/ 21 июня 2019

Я думаю, проблема в том, что вы смешиваете пользовательский цикл сообщений (ваши foreach и setup_postdata()), но затем используете функции, подобные get_field(), которые используют global post объект. В этом случае get_field() пытается найти значение поля, сравнивая с глобальным $post, но оно не было правильно установлено. См. Предупреждение здесь о setup_postdata($post):

Вы должны передать ссылку на глобальную переменную $ post, в противном случае такие функции, как the_title (), не будут работать должным образом.

Вы можете реализовать это в своем коде с небольшим изменением:

global $post;
foreach ($brand as $currPost) {
    $post = $currPost;
    setup_postdata($post);
    // Rest of code as normal
}

Или, поскольку get_field() может принимать конкретную запись в качестве аргумента вместо автоматического использования глобальной, вы можете изменить:

$homelinkvalue = get_field("home_brand_link");

до:

$homelinkvalue = get_field("home_brand_link",$post->ID);

Примечание: обычно рекомендуемый способ итерации сообщений - специальный шаблон "WP loop" , что-то вроде:

<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    <!-- Do something -->
<?php endwhile; ?>

Использование приведенного выше шаблона автоматически устанавливает глобальную переменную $post во время ее циклического прохождения, что позволяет разработчикам использовать такие функции, как get_field(), не беспокоясь о явной передаче определенного сообщения; делает все немного проще.

0 голосов
/ 21 июня 2019

Попробуйте это:

<div class="your-class">
       <?php
          $args = array(
                          'post_type' => 'home_test',
                          'posts_per_page' => -1,
                          'orderby'   => 'name',
                          'order'     => 'ASC',
          );
          $the_query = new WP_Query( $args );
          if ($the_query->have_posts) :
              while($the_query->have_posts) : $the_query->the_post();
          ?>
       <div>
          <p><?php the_field( "home_brand_link" ); ?></p>
          <img src="<?php the_post_thumbnail_url(); ?>">
       </div>
       <?php
          endwhile;
          wp_reset_postdata();
          endif;
          ?>
    </div>
...