setup_postdata() не работает корректно?
Я не уверен почему, но я использовал 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)
, это работает нормально. Но я думаю, что более короткая версия будет лучше

Возможно, я ошибаюсь, но, судя по всему, "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 - иначе это сломает функциональность.
Надеюсь, это поможет.

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

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

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

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.

2 важных момента для правильной работы:
Используйте глобальную переменную $post для настройки postdata, иначе функции цикла не увидят ваш пользовательский объект записи.
ОЧЕНЬ ВАЖНО: обязательно вызывайте функцию
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; ?>

При запросе записей используйте стандартный цикл с набором передаваемых аргументов. Затем сбросьте запрос в конце.
<?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(); ?>

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

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

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

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

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