WP_Query と get_posts の両方を使用しました。私のサイドバー テンプレートの 1 つで、次のループを使用して、カテゴリ スラッグまたはカテゴリ名を含む「category_to_load」のキーを持つカスタム フィールドを使用して、特定のカテゴリの投稿を表示します。本当の違いは、どちらの方法の実装にもあります。
私のテンプレートのいくつかでは、get_posts メソッドは次のようになります。
<?php
global $post;
$blog_posts = get_posts( $q_string );
foreach( $blog_posts as $post ) :
setup_postdata( $post );
?>
<div class="blog_post">
<div class="title">
<h2>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</h2>
<span class="date"><?php the_time( 'F j, Y' ); ?> by <?php the_author(); ?></span>
</div>
<?php the_excerpt(); ?>
</div>
<?php endforeach;
?>
実装WP_Query
は次のようになります。
$blog_posts = new WP_Query( 'showposts=15' );
while ( $blog_posts->have_posts() ) : $blog_posts->the_post(); ?>
<div <?php post_class() ?> id="post-<?php the_ID(); ?>" class="blog_post">
<div class="title">
<h2>
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a>
</h2>
<span class="date"><?php the_time( 'F jS, Y' ) ?> <!-- by <?php the_author() ?> --></span>
</div>
<div class="entry">
<?php the_content(); ?>
</div>
<p class="postmetadata"><?php the_tags( 'Tags: ', ', ', '<br />' ); ?> Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?> <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>
</div>
<?php endwhile; ?>
主な違いは、グローバルな $post 変数をリセットする必要がないことと、WP_query を使用するときに各投稿オブジェクトで setup_postdata($post) を呼び出して投稿データを設定する必要がないことです。また、get_posts() では利用できない素敵な have_posts() 関数を WP_Query 関数で使用することもできます。
query_posts() 関数は、ページのメイン ループを変更するため、本当に意図しない限り使用しないでください。ドキュメントを参照してください。したがって、ブログを表示する特別なページを作成している場合、query_posts を呼び出すとページのループが混乱する可能性があるため、WP_Query を使用する必要があります。
それはちょうど私の 2 セントです。私の究極の提案は、最初の選択肢は WP_Query です。
-クリス