web-dev-qa-db-ja.com

WP_Queryから10の投稿を取得します。 10未満の場合は、残りの部分を他の場所から入手します。

関連記事WP_Queryを作成しようとしています。これまでは、タグの配列に一致するすべての投稿をクエリするカスタムWP_Queryを作成しました。

しかし、私は単純なif statementを作成しようとしています:取得された投稿の数が 10以下 の場合、残りは elsewhere から取得してください(これは特定のカテゴリのものです)。

次のようなループがあります。投稿数を取得するには$related_posts->found_postsを使用します。

$related_posts_args =
    array(
    'tag__and' => $list_of_tags, // array of tag IDS
    'posts_per_page' => 10,
    'post__not_in' => $already_posted, // array of post IDs
    'post_type' => 'post',
    'post_status' => 'publish',
    'orderby' => 'date',
    'order' => 'DESC',
    'orderby' => 'Rand',
);

$related_posts_query = new WP_Query( $related_posts_args );
if ( $related_posts_query->have_posts() ):
    while ( $related_posts_query->have_posts() ):
        $related_posts_query->the_post();
// this is the number of posts in my current query
    echo $related_posts_query->found_posts; 
            the_title();
    endwhile;
endif;
wp_reset_postdata();

他の場所から投稿を取得するために残りの部分を使用する方法を知っている人はいますか? (そして同じループ内で可能です)。

6
tmyie

次のようなことができます。

$related_posts_query = new WP_Query( $related_posts_args );
if( $related_posts_query->found_posts < 10 ){
   $args = array(/* new wp_query args*/);
   $newquery = new WP_Query( $args );
}

# merge the two results
$related_posts_query->posts = array_merge( $related_posts_query->posts, $newquery->posts );
$related_posts_query->post_count = count( $related_posts_query->posts );

# do your loop here
7
RRikesh

最善のアプローチIMOはあなたのクエリで設定されたset posts_per_pageオプションに対してページごとに返された投稿を数えることです。カウントがセットposts_per_pageより少ない場合は、差を計算してからこれを投稿数として使用し、カスタムクエリの残りを埋めます。

これはどのように機能するかです。

まず、あなたの "main"クエリによって返された投稿の数を数えます。この場合、これは$related_posts_args->postsになります。

count($related_posts_args->posts)

posts_per_page10に設定したので、これはカウントをチェックするための番号になります。

count($related_posts_args->posts) < 10

カウントが10未満の場合は、10とカウントの差を取る必要があります。この違いは、カスタムクエリのposts_per_pageオプションになります。

$ppp = 10 - count($related_posts_args->posts);

これで、カスタムクエリを実行して投稿を取得し、空白スペースを埋めることができます。あなただけの独自のクエリ引数を追加する必要があります

これが完全なコードです。

if( count($related_posts_args->posts) < 10 ) { 

    $ppp = 10 - count($related_posts_args->posts);

    $args = [ //Add your own query arguments to suite your needs
        'orderby' => 'Rand',
        'posts_per_page' => $ppp
    ];

    $q = new WP_Query( $args );

    if( $q->have_posts() ) {
        while( $q->have_posts() ) {
            $q->the_post();

            //Display your loop elements

        }
        wp_reset_postdata();
    }
}

コードを統合して

$related_posts_args = [
    'tag__and' => $list_of_tags, // array of tag IDS
    'posts_per_page' => 10,
    'post__not_in' => $already_posted, // array of post IDs
    'post_type' => 'post',
    'post_status' => 'publish',
    'orderby' => 'date',
    'order' => 'DESC',
    'orderby' => 'Rand',
];

$related_posts_query = new WP_Query( $related_posts_args );
if ( $related_posts_query->have_posts() ) {
    while ( $related_posts_query->have_posts() ) {
        $related_posts_query->the_post();

        //Display your loop elements

    }
    wp_reset_postdata();

    if( count($related_posts_args->posts) < 10 ) { 

        $ppp = 10 - count($related_posts_args->posts);

        $args = [ //Add your own query arguments to suite your needs
            'orderby' => 'Rand',
            'posts_per_page' => $ppp
        ];

        $q = new WP_Query( $args );

        if( $q->have_posts() ) {
            while( $q->have_posts() ) {
                $q->the_post();

                //Display your loop elements

            }
            wp_reset_postdata();
        }
    }
}
0
Pieter Goosen