setup_postdata()が動作していないようですか?


12

理由はわかりませんが、以前get_posts()はいくつかのデータのクエリを実行していました。それから私は使ったsetup_postdata()... the_permalink()新しい投稿データでetcのような機能を使えるようにするために使ったと思いますか?

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

カスタム選択クエリ(だけでなく、query_posts)を行っているとき、私は間違っているかもしれないが、私は、見ているものから、「setup_postdataを()」を使用する必要があります。 http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

だけでなく、あなたのようなタグを使用する場合は、「the_titleを()」と「the_permalink()は、」そのカスタム選択クエリで...あなたは、変数名を使用する必要があります$ポストを(setup_postdataで特異的に(ではない別の変数名を) )-AS Well- "foreach"ループの前にグローバル$ postを呼び出す必要があります...

したがって、基本的にはそのコーデックスリンクのその例に従ってください。また、変数名$ postを変更しないでください。変更すると、破損します。

HTH


2
「グローバル$ postを呼び出す必要があります」。はい!なぜそれがコーデックスにないのですか
AlxVallejo 2014

27

を交換

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

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

したがって、$postとともに正確な変数を使用する必要がありますsetup_postdata()


これは私が抱えていた問題を修正しました。乾杯の仲間
ジェフK.

2
誰かがこの男にビールを買う!ありがとう..ローカル変数がなぜ/どのように混乱するのsetup_postdata()か、どんな考えですか?
Odys

変だ。パラメータとして渡すときに特定の変数名を要求するのは非常に非合理的です。
Gavin

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
この答えは、OPを叱るのではなく、実際に問題を解決します: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(); ?>

ありがとう、これでうまくいきます。しかし、理解のために、なぜsetup_postdata()うまくいかないのか知っていますか?間違って使用しましたか?
Jiew Meng、2011

1
@jiewmeng- $post代わりにを使用し$cpて問題を修正するかどうかを確認します。
t31os

@ t31osが提案する修正に投票します。コーデックスの例はそのような使用法を示しており、$ postはWordPressの特別な変数であるため、ループ内では、使用したものよりも多くのことを行う可能性があります。
curtismchale、2011

@ t31os、@ curtismchale、それも機能していないようです。それでも同じ結果が得られます
Jiew Meng、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.