setup_postdata() не работает корректно?

19 февр. 2011 г., 16:50:26
Просмотры: 43.7K
Голосов: 17

Я не уверен почему, но я использовал get_posts() для запроса данных. Затем я использовал setup_postdata() ... Я думаю это нужно для того, чтобы можно было использовать такие функции как the_permalink() и др. с новыми данными поста?

<?php foreach ($childPosts as $cp) : setup_postdata($cp); ?>

<article <?php post_class() ?> id="post-<?php the_ID(); ?>">
  <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
  <?php if (has_post_thumbnail()) : ?>
  <a href="<?php the_permalink() ?>"><?php the_post_thumbnail(($hasOutputNotFeaturedDiv) ? 'thumb-small' : null) ?></a>
  <?php endif; ?>
  <?php the_excerpt(); ?>
  <p class="more"><a href="<?php the_permalink() ?>">Читать далее ...</a></p>
  <?php include (TEMPLATEPATH . '/inc/meta.php' ); ?>
</article>

<?php endforeach; ?>

но похоже, что только the_excerpt содержит новое значение данных поста, почему так? Я обнаружил, что если использовать echo get_the_permalink($cp), это работает нормально. Но я думаю, что более короткая версия будет лучше

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

Возможно, я ошибаюсь, но, судя по всему, "setup_postdata()" следует использовать при выполнении пользовательского SELECT-запроса (а не просто query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

Кроме того, если вы хотите использовать теги типа "the_title()" и "the_permalink()" с этим пользовательским SELECT-запросом ... вам нужно использовать именно имя переменной $post (а не другое имя переменной) в setup_postdata() - А ТАКЖЕ - вам следует объявить global $post перед вашим циклом "foreach"...

Так что, в общем, следуйте примеру по ссылке в кодексе. И не меняйте имя переменной $post - иначе это сломает функциональность.

Надеюсь, это поможет.

22 февр. 2011 г. 20:02:56
Комментарии

"вам следует вызвать global $post" . ДА! Почему этого нет в Кодексе

AlxVallejo AlxVallejo
26 апр. 2014 г. 20:11:39

2021 год, а эта проблема всё ещё доставляет мне неудобства, лол

Andrew Schultz Andrew Schultz
25 февр. 2021 г. 14:04:07
5
41

Замените

foreach ( $childPosts as $cp ) : setup_postdata( $cp );

на

foreach ( $childPosts as $post ) : setup_postdata( $post );

Вам нужно использовать именно переменную $post вместе с функцией setup_postdata().

25 авг. 2011 г. 00:12:28
Комментарии

Это решило проблему, с которой я столкнулся. Спасибо, приятель

Jeff K. Jeff K.
3 мар. 2012 г. 00:05:04

Кто-нибудь, купите этому человеку пиво! Спасибо... Есть идеи, почему/как локальная переменная может влиять на setup_postdata()?

Odys Odys
7 нояб. 2016 г. 16:09:53

Странно. Кажется так нелогично требовать определенное имя переменной, когда ты передаешь её как параметр.

Gavin Gavin
14 дек. 2018 г. 09:51:02

@Gavin Я не понимаю, почему больше людей не задаются вопросами о странности некоторой логики в WP. Эта странность теперь кажется чем-то нормальным...

JDandChips JDandChips
24 июл. 2020 г. 19:47:59

Ещё одна прекрасная реализация от Automattticcc.

marek.m marek.m
4 нояб. 2021 г. 17:22:08
1
12

global post; не работает с setup_postdata($post);, если вы хотите использовать семейство функций типа the_title() и другие.

Об этом указано в https://codex.wordpress.org/Function_Reference/setup_postdata

Вместо этого используйте:

// global $post; setup_postdata($post_object); // так делать не нужно!
setup_postdata( $GLOBALS['post'] =& $post_object );

...также убедитесь, что ваш $post_object является валидным объектом WP_Post.

14 сент. 2016 г. 02:40:49
Комментарии

Этот ответ действительно решает проблему, вместо того чтобы ругать автора вопроса :p

nodws nodws
24 нояб. 2017 г. 01:20:10
1
10

В зависимости от того, где вы используете setup_postdata() (если это не основной цикл, а, например, функция или виджет в сайдбаре), вам также может понадобиться объявить:

global $post;
21 сент. 2011 г. 18:50:21
Комментарии

Можешь объяснить почему?

Peter Højlund Andersen Peter Højlund Andersen
4 дек. 2021 г. 16:16:36
0

2 важных момента для правильной работы:

  1. Используйте глобальную переменную $post для настройки postdata, иначе функции цикла не увидят ваш пользовательский объект записи.

  2. ОЧЕНЬ ВАЖНО: обязательно вызывайте функцию wp_reset_postdata() функцию в конце цикла, иначе могут возникнуть странные ошибки, которые будет очень сложно отладить.

     <?php
     global $post;
    
     $myposts = get_posts( array(
         'posts_per_page' => 5,
         'offset'         => 1,
         'category'       => 1
     ) );
    
     if ( $myposts ) :
         foreach ( $myposts as $post ) :
           setup_postdata( $post ); ?>
             <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
         endforeach; 
         wp_reset_postdata();
     endif;
     ?>
    
9 нояб. 2021 г. 14:07:53
5

При запросе записей используйте стандартный цикл с набором передаваемых аргументов. Затем сбросьте запрос в конце.

<?php 

    // делает запрос учитывающим правила пагинации
    $paged = get_query_var('paged');

    // определение аргументов для пользовательского цикла
    $variablenameQuery = array(
        'post_type'                 => 'seating-charts',
        'post_status'               => 'publish',
        'cust_tax_name'             => 'custom-tax-term',
        'posts_per_page'            => -1, // -1 означает все записи
        'orderby'                   => 'date',
        'order'                     => 'ASC',
        'paged'                     => $paged,
    ); // конец запроса

    // передаем результат в query_posts для получения результата
    query_posts($variablenameQuery);

?>
<?php if (have_posts()) : ?>

    <?php while (have_posts()) : the_post(); ?>

        <?php // Стилизация отдельных записей ?>

    <?php endwhile; ?>

        <?php // навигация по страницам - следующая запись, предыдущая запись... ?>

    <?php else : ?>

    <h3>Упс, похоже, возникла проблема. Пожалуйста, <a href="<?php echo get_option('home'); ?>/contact" title="Связаться с нами">свяжитесь с нами</a>, и мы исправим проблему.</h3>

<?php endif; ?>

<!-- сбрасывает WordPress Query -->
<?php wp_reset_query(); ?>
19 февр. 2011 г. 16:55:33
Комментарии

Спасибо, это работает. Но просто для понимания, знаешь ли ты, почему setup_postdata(), кажется, не работает? Я использовал её неправильно?

Jiew Meng Jiew Meng
19 февр. 2011 г. 17:16:37

@jiewmeng - Попробуй использовать $post вместо $cp, возможно, это исправит проблему.

t31os t31os
20 февр. 2011 г. 03:28:43

Я поддерживаю решение, которое предлагает @t31os. Примеры в кодексе показывают использование именно так, и $post — это специальная переменная в WordPress, поэтому внутри цикла она может делать больше, чем то, что ты использовал.

curtismchale curtismchale
20 февр. 2011 г. 03:54:04

@t31os, @curtismchale, это тоже не сработало. До сих пор получаю тот же результат

Jiew Meng Jiew Meng
20 февр. 2011 г. 04:11:38

Старая тема, но НЕ используйте query_posts(), если вы не УВЕРЕНЫ, что она вам нужна. Это неэффективно. Взгляните на это полезное изображение с альтернативами: https://www.rarst.net/images/query_functions.png

Tex0gen Tex0gen
29 мар. 2023 г. 17:00:45