схоже, що 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)це працює нормально. Але я думаю, що коротша версія буде кращою

Відповіді:


32

Я можу помилятися, але з того, що я бачу, "setup_postdata ()" повинен використовуватися при виконанні користувальницького запиту вибору (не тільки query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

Крім того, якщо ви хочете використовувати теги, такі як "the_title ()" та "the_permalink ()" для цього спеціального запиту вибору ... вам потрібно буде використовувати ім'я змінної $ post спеціально (не інше ім'я змінної) у setup_postdata ( ) - КАК ДУЖЕ - вам слід зателефонувати в глобальний $ post перед циклом "foreach" ...

Тому в основному дотримуйтесь цього прикладу в цьому посиланні на кодекс. І не змінюйте ім’я змінної $ post - інакше це порушить її.

HTH


2
"Вам слід зателефонувати в глобальний $ post". ТАК! Чому цього немає в Кодексі
AlxVallejo

27

Замініть

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

з

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

Тому вам потрібно використовувати точну $postзмінну разом з setup_postdata().


Це виправило проблему, яку я мав. Народний напарник
Джефф К.

2
Хтось купить цій людині пиво! Дякую .. Будь-яка ідея, чому / як локальна змінна може зіпсуватись setup_postdata()?
Одіс

Дивно. Здається, настільки нелогічно вимагати певного імені змінної, коли ви передаєте його як параметр.
Гавін

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
киває

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(); ?>

Дякую, це працює. Але тільки для розуміння, чи знаєте ви, чому setup_postdata(), здається, не працює? Я неправильно користувався?
Jiew Meng

1
@jiewmeng - Перевірте, чи використовуєте $postзамість цього $cpвиправлення проблеми.
t31о

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

@ t31os, @curtismchale, схоже, теж не працює. Це все одно дає той же результат
Jiew Meng
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.