setup_postdata () wydaje się nie działać?

12

Nie jestem pewien dlaczego, ale użyłem get_posts()zapytania do niektórych danych. Potem użyłem setup_postdata()... Myślę, że jest używany, aby móc używać funkcji takich jak the_permalink()etc z nowymi danymi posta?

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

ale wygląda na to, że the_excerptzawiera tylko nową wartość danych postu, dlaczego tak jest? Uważam, że jeśli echo get_the_permalink($cp)go użyję, działa dobrze. Myślę jednak, że krótsza wersja będzie lepsza

Jiew Meng
źródło

Odpowiedzi:

32

Mogę się mylić, ale z tego, co widzę, należy użyć „setup_postdata ()” podczas wykonywania niestandardowego zapytania select (nie tylko zapytania_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

Ponadto, jeśli chcesz używać tagów takich jak „the_title ()” i „the_permalink ()” z tym niestandardowym zapytaniem wyboru ... musisz użyć konkretnej nazwy zmiennej $ post (nie innej nazwy zmiennej) w setup_postdata ( ) - TAKŻE - należy zadzwonić do globalnego $ posta przed pętlą „foreach” ...

Więc w zasadzie podążaj za tym przykładem w tym łączu kodeksu. I nie zmieniaj nazwy zmiennej $ post - w przeciwnym razie psuje ją.

HTH

Jennifer Stuart
źródło
2
„powinieneś zadzwonić na globalny $ post”. TAK! Dlaczego tego nie ma w Kodeksie
AlxVallejo
27

Zastąpić

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

z

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

Musisz więc użyć dokładnej $postzmiennej wraz z setup_postdata().

WP-Silver
źródło
To rozwiązało problem, który miałem. Pozdrawiam, kolego
Jeff K.
2
Ktoś kupi temu człowiekowi piwo! Dziękuję .. Masz pojęcie, dlaczego / jak zmienna lokalna może zadzierać setup_postdata()?
Odys
Dziwne. Wydaje się, że nielogiczne jest wymaganie podania konkretnej nazwy zmiennej, gdy przekazujesz ją jako parametr.
Gavin
6

W zależności od tego, gdzie używasz setup_postdata () (jeśli nie ma go np. W głównej pętli lub w widżecie funkcji / paska bocznego), może być konieczne zadeklarowanie -

global $post;
David Gard
źródło
4

global post;nie działa, setup_postdata($post);jeśli chcesz użyć the_title()rodziny poleceń itp.

Jest w https://codex.wordpress.org/Function_Reference/setup_postdata

Zamiast tego użyj

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

... upewnij się również, że Twój obiekt $post_objectjest prawidłowym obiektem WP_Post.

Ryan Taylor
źródło
1
Ta odpowiedź faktycznie rozwiązuje problem, zamiast
karcić
1

Podczas wyszukiwania postów użyj zwykłej pętli z przekazanym do niej zestawem argumentów. Następnie zresetuj zapytanie na końcu.

<?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
źródło
Dzięki, to działa. Ale dla zrozumienia, czy wiesz, dlaczego setup_postdata()to nie działa? Czy źle go wykorzystałem?
Jiew Meng
1
@jiewmeng - Sprawdź, czy używanie $postzamiast $cpnaprawia problem.
t31os
Głosuję na sugerowaną poprawkę @ t31os. Przykłady w kodeksie pokazują takie użycie, a $ post jest specjalną zmienną w WordPress, więc może zrobić więcej w pętli niż to, czego użyłeś.
curtismchale
@ t31os, @curtismchale, które również nie działały. Nadal daje ten sam wynik
Jiew Meng