web-dev-qa-db-ja.com

人気のある投稿をページに表示する方法

私は私のブログの「ここからスタート」ページを作成しようとしています。私はそのためにテンプレートを使いますが、そのためのコンテンツはWordPressの「新しいページを追加する」ウィザードを使って作成されます。

私は、最も議論された投稿を(ほとんどのコメントと共に)表示する方法を知っていますが、PHPはページ内では機能しません。もちろん、代わりにコードをページテンプレートに貼り付けることもできますが、自分のテンプレートを見てください。

<?php
/*
  Template Name: Test Layout
*/
?>
<?php get_header(); ?>
<div id="start-here-wrapper">
    <ul>
        <?php
        $pc = new WP_Query( 'orderby=comment_count&ignore_sticky_posts=1&posts_per_page=6' );
        while ( $pc->have_posts() ) : $pc->the_post(); ?>
            <li>
                <a href="<?php the_permalink(); ?>" title="<?php 
                    the_title(); ?>"><?php the_title(); ?></a>
            </li>
        <?php endwhile; ?>
    </ul>
    <?php the_content(); ?>
</div>
<?php get_footer(); ?>

「ページウィザード」で書いたものがすべてそこに入るように、「コンテンツ」を使います。さまざまな理由ですべてをテンプレート自体にコピーして貼り付けることはしたくないので、上記のコードでこれを機能させる方法を見つける必要があります。

私が「コンテンツ」の下の人気のある記事を呼べば、それは問題なく動作します。それを前に呼び出すと(上のコードのように)、実際のページのコンテンツは表示されず、代わりに人気のある投稿のリストの最後のブログ投稿が表示されます。

1
japanworm

私が「コンテンツ」の下の人気のある記事を呼べばそれは問題なく動作します。それを前に呼び出すと(上のコードのように)、実際のページのコンテンツは表示されず、代わりに人気のある投稿のリストの最後のブログ投稿が表示されます。

the_contentはグローバルな$postの値に依存しています。これはページの読み込みの早い段階で設定されますが、ループのthe_postメソッドによってリセットされます。ページの早い段階で、ページのコンテンツに設定されています。その後、二次ループは各反復でそれを上書きします。ループが完了すると、$postにループの最後の投稿が表示されます。

そのループを実行した後に元の投稿データが必要な場合は、 wp_reset_postdata を使用する必要があります。これは$postをメインクエリの現在の投稿にリセットします。あなたの場合はそれがあなたのページのコンテンツになります。

また、適切なループの外で the_content を実行してはいけません。それはあなたがそうでなければあなたが期待するようにループの内側で走ることが常に振る舞うというわけではないことを意味します。

1
s_ha_dum

s_ha_dumはそれをすべて言っています。

    <?php
    /**
     * Template Name: Test Layout
     *
     */
    ?>
    <?php get_header(); ?>

    <div id="start-here-wrapper">
    <?php while ( have_posts() ) : the_post(); ?>
            <ul>
                <?php
                $pc = new WP_Query('orderby=comment_count&ignore_sticky_posts=1&posts_per_page=6'); ?>
                <?php while ($pc->have_posts()) : $pc->the_post(); ?>
                    <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></li>
                <?php endwhile; ?>
                <?php wp_reset_postdata(); ?>
            </ul>
        <?php the_content(); ?>
    <?php endwhile; ?>
    </div>

    <?php get_footer(); ?>
1
Puni