8

組み込み関数を使用して Wordpress からコンテンツを出力するには、主に 3 つの方法があるようですWP_Queryが、推奨される方法は次のとおりです。

それらの違いは何ですか?WP_Query(それはクラスであり、他の2つはメソッドであることを理解しています)。

互いに干渉することなく、同じページに複数のループを配置する最もクリーンな方法は何ですか?

WP ループのプログラミング方法の例を探しています。例: カテゴリごとに 2 つの個別の投稿リストを、添付ファイル、メタデータなどとともに出力します。

これは私がこれまでに見つけた最高のリファレンスです:

4

3 に答える 3

6

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 &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></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 です。

-クリス

于 2009-02-21T17:33:34.120 に答える
1

$wp_queryWPは、メインループに呼び出されるオブジェクトを使用します。このオブジェクトは背後に隠されてhave_posts()おり、とのthe_post()ラッパーにすぎない ため、通常は表示されません。$wp_query->have_posts()$wp_query->the_post()

メインループを変更する場合はquery_posts()、ループの前に使用する必要があります。

別のループが必要な場合は、その新しいループの前に$wp_query使用してオブジェクトを再利用できます。query_posts()これは、必要に応じて何度でも実行できます。

何らかの理由で$wp_queryオブジェクトを保持する必要がある場合は、を使用する必要がありますWP_Query。そしてもちろん、have_posts()the_post()はオブジェクトのラッパーであるため、$wp_queryで使用することはできませんWP_Query。むしろ使用する必要があり$your_query_obj->have_posts()ます

$sidebar= WP_Query('category_name= sidebar');

while( $sidebar->have_posts() ): $sidebar->the_post();
  the_title();
  the_content();
endwhile;

左側のサイドバーWP_Queryよりも優れている可能性がある良いケース。query_posts()サイドバーのコードループはおそらくメインループの上に配置されるため、query_posts()呼び出しによって$wp_queryオブジェクトが変更され、メインループも変更されます。この場合query_posts()、サイドバーコードで使用するquery_posts()には、メインループの前に使用して、そのループの適切なコンテンツをクエリする必要があります。

したがって、この場合にWP_Queryを使用すると、$ wp_queryが維持されるため、メインループは変更されません。

しかし、繰り返しになりますが、一般的なシナリオquery_posts()では、コンテンツをクエリするための美しい方法です。

query_posts('category_name=blog');

while( have_posts() ): the_post();
  the_title();
  the_content();
endwhile;
于 2009-12-23T19:33:44.900 に答える