setup_postdata () dường như không hoạt động?


12

Tôi không chắc tại sao nhưng tôi đã sử dụng get_posts()để truy vấn một số dữ liệu. Sau đó, tôi đã sử dụng setup_postdata()... Tôi nghĩ rằng nó được sử dụng để tôi có thể sử dụng các chức năng như the_permalink()vv với dữ liệu bài đăng mới?

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

nhưng có vẻ như chỉ the_excerptchứa giá trị dữ liệu bài mới, tại sao vậy? Tôi thấy rằng nếu tôi sử dụng echo get_the_permalink($cp)nó hoạt động ok. Nhưng tôi nghĩ phiên bản ngắn hơn sẽ tốt hơn

Câu trả lời:


32

Tôi có thể sai, nhưng từ những gì tôi thấy, "setup_postdata ()" nên được sử dụng khi thực hiện một truy vấn chọn tùy chỉnh (không chỉ truy vấn_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

Đồng thời, nếu bạn muốn sử dụng các thẻ như "the_title ()" và "the_permalink ()" với truy vấn chọn tùy chỉnh đó ... bạn sẽ cần sử dụng tên biến $ post cụ thể (không phải tên biến khác) trong setup_postdata ( ) - NHƯ VẬY - bạn nên gọi bài toàn cầu $ trước vòng lặp "foreach" của bạn ...

Vì vậy, về cơ bản theo ví dụ đó trong liên kết codex đó. Và đừng thay đổi tên biến $ post - nếu không nó sẽ phá vỡ nó.

HTH


2
"bạn nên gọi bài toàn cầu $". ĐÚNG! Tại sao điều đó không có trong Codex
AlxVallejo

27

Thay thế cái

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

với

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

Vì vậy, bạn cần phải sử dụng các $postbiến chính xác cùng với setup_postdata().


Điều này đã khắc phục vấn đề tôi đang gặp phải. Chúc mừng người bạn đời
Jeff K.

2
Ai đó mua cho người đàn ông này một cốc bia! Cảm ơn bạn .. Có ai biết tại sao / làm thế nào một biến cục bộ có thể gây rối setup_postdata()không?
Odys

Kỳ dị. Có vẻ rất phi logic khi yêu cầu một tên biến cụ thể khi bạn chuyển nó dưới dạng tham số.
Gavin

6

Tùy thuộc vào nơi bạn đang sử dụng setup_postdata () (nếu nó không nằm trong vòng lặp chính hoặc trong tiện ích chức năng / thanh bên chẳng hạn), bạn cũng có thể cần phải khai báo -

global $post;

4

global post;không hoạt động với setup_postdata($post);nếu bạn muốn sử dụng the_title()họ lệnh, v.v.

Nó có trong https://codex.wordpress.org/Function_Reference/setup_postdata

Thay vào đó hãy sử dụng

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

... cũng đảm bảo rằng bạn $post_objectlà một đối tượng WP_Post hợp lệ.


1
Câu trả lời này thực sự giải quyết được vấn đề, thay vì la mắng OP: p
gật đầu

1

Khi truy vấn bài viết chỉ cần sử dụng vòng lặp bình thường với một tập hợp các đối số được truyền vào nó. Sau đó đặt lại truy vấn ở cuối.

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

Cảm ơn, điều này làm việc. Nhưng chỉ để hiểu, bạn có biết tại sao setup_postdata()dường như không hoạt động? Tôi đã sử dụng nó sai?
Jiew Meng

1
@jiewmeng - Xem nếu sử dụng $postthay vì $cpkhắc phục sự cố.
t31os

Tôi bỏ phiếu cho sửa chữa @ t31os gợi ý. Các ví dụ trên codex cho thấy cách sử dụng như thế và $ post là một biến đặc biệt trong WordPress để nó có thể thực hiện nhiều hơn trong một vòng lặp so với những gì bạn đã sử dụng.
curtismchale

@ t31os, @curtismchale, dường như cũng không hoạt động. Nó vẫn cho kết quả tương tự
Jiew Meng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.