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

12

Я не уверен, почему, но я использовал 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() ?>">Read more ...</a></p>
  <?php include (TEMPLATEPATH . '/inc/meta.php' ); ?>
</article>

<?php endforeach; ?>

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

Jiew Meng
источник

Ответы:

32

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

Кроме того, если вы хотите использовать теги, такие как "the_title ()" и "the_permalink ()", с этим запросом произвольного выбора ... вам нужно будет использовать имя переменной $ post специально (не другое имя переменной) в setup_postdata ( ) - КАК ХОРОШО - перед вызовом цикла foreach вы должны вызвать глобальный $ post ...

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

НТН

Дженнифер Стюарт
источник
2
msgstr "вы должны позвонить в глобальный $ post". ДА! Почему этого нет в Кодексе
AlxVallejo
27

Заменить

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

с

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

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

WP-Silver
источник
Это решило проблему, с которой я столкнулся. Приветствия приятель
Джефф К.
2
Кто-нибудь купит этому человеку пиво! Спасибо .. Любая идея, почему / как локальная переменная может связываться setup_postdata()?
Одис
Weird. Кажется нелогичным требовать конкретное имя переменной, когда вы передаете его в качестве параметра.
Гэвин
6

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

global $post;
Дэвид Гард
источник
4

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

Это в https://codex.wordpress.org/Function_Reference/setup_postdata

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

// global $post; setup_postdata($post_object); //don't do this!
setup_postdata( $GLOBALS['post'] =& $post_object );

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

Райан Тейлор
источник
1
Этот ответ фактически решает проблему, вместо того, чтобы ругать ОП: p
nodws
1

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

<?php 

    // makes query respect paging rules
    $paged = get_query_var('paged');

    // defining the arguements for the custom loop
    $variablenameQuery = array(
        'post_type'                 => 'seating-charts',
        'post_status'               => 'publish',
        'cust_tax_name'             => 'custom-tax-term',
        'posts_per_page'            => -1, // neg 1 means all posts
        'orderby'                   => 'date',
        'order'                     => 'ASC',
        'paged'                     => $paged,
    ); // end query

    // pass result into query_posts to get result
    query_posts($variablenameQuery);

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

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

        <?php // Individual Post Styling ?>

    <?php endwhile; ?>

        <?php // paged navigation - next post, previous post... ?>

    <?php else : ?>

    <h3>Ooops looks like there was an issue. Please <a href="<?php echo get_option('home'); ?>/contact" title="Contact Us">get in touch</a> with us and we'll get the problem fixed.</h3>

<?php endif; ?>

<!-- resets the WordPress Query -->
<?php wp_reset_query(); ?>
curtismchale
источник
Спасибо, это работает. Но просто для понимания, вы знаете, почему setup_postdata()не работает? Я использовал это неправильно?
Jiew Meng
1
@jiewmeng - Посмотрите, если использовать $postвместо решения $cpпроблемы.
t31os
Я голосую за исправление, которое предлагает @ t31os. Примеры в кодексе показывают такое использование, а $ post - это специальная переменная в WordPress, поэтому она может делать больше внутри цикла, чем то, что вы использовали.
Curtismchale
@ t31os, @curtismchale, это тоже не сработало. Это все еще дает тот же результат
Jiew Meng