web-dev-qa-db-ja.com

著者ごとに最大1つの投稿を返すためのクエリ

私達は私達のサイトで "特集作家"エリアを紹介していて、作家の選択したグループによる最新の記事を表示したいと思います。ただし、著者1人につき最大1件の投稿を表示するようにします。そのため、他の作者が投稿してから5回投稿する可能性がありますが、関係なく自分の投稿は1つだけ表示されます。現在これは私が持っているコードです:

<?php
$args = array(
'showposts' => 5,
'author' => "6800,3845,1720,7045,4949"
);

$the_query = new WP_Query( $args );

while ( $the_query->have_posts() ) : $the_query->the_post(); 

?>

// DISPLAYING STUFF

<?php endwhile; wp_reset_query(); ?>

私が考えた解決策の1つは、より多くの投稿をクエリして配列を設定し、その後毎回配列をチェックして作者が既にその中にいるかどうかを確認することです。もしそうなら、それは次の行に続くでしょう。しかし、これに関する明らかな問題は、特定の "おすすめの著者"がしばらく書いていなかった場合、私が潜在的に何百もの投稿を取り戻さなければならなくなる可能性があることです。

私はまだPHP/MySQLにかなり慣れていませんし、解決策がおそらく私の顔に浮かぶでしょう。援助を認めなさい。

3

あなたは作者IDをGROUP BYする必要があります。それは posts_groupby でフィルタを必要とします。そのフィルタのCodexページは存在しませんが、 posts_join のように動作します。何かのようなもの...

function filter_authors($groupby) {
  global $wpdb;
  $groupby = " {$wpdb->posts}.post_author";
 return $groupby;
}
add_filter('posts_groupby','filter_authors');

$args = array(
 'showposts' => 3,
 'author' => "1,2,3"
);

$the_query = new WP_Query( $args );

while ( $the_query->have_posts() ) : $the_query->the_post();
 echo $post->post_title.' :: '.$post->post_author."<br/>";
endwhile;

もちろん$argsであなた自身の値を使ってください。

これは、このコードブロックの後に実行されるページ上の他のクエリに影響します。完了したら、 フィルタ を削除することができます。

remove_filter('posts_groupby','filter_authors');
5
s_ha_dum

別の方法は、 get_posts をループして結果を表示する関数を使用することです。

このQ&Aをチェックしてください: いつWP_Query vs query_posts()vs get_posts()を使うべきですか?

// function located in the theme's functions.php
function wpse_78117_print_authors_last_post() 
{
    $user_ids = array( '1', '2' );
    foreach( $user_ids as $user )
    {
        $args = array( 
                'post_type'     => 'post',
                'numberposts'   => 1,
                'author'        => $user
            ); 

        // as we are getting only 1 post, extract it from the returned array
        $user_post = array_shift( get_posts( $args ) );

        // similar
        $nick = array_shift( get_user_meta( $user, 'nickname' ) );

        // custom output, $user_post contains all the post normal data
        echo $user_post->post_title . ', by: ' . $nick;
    }
}

そしてそれを任意のテーマテンプレートで使用します。
<?php wpse_78117_print_authors_last_post(); ?>

3
brasofilo

私はこの問題に筆者一人につき一つの記事をスライダーに入れて欲しいだけであり、それを次のように解決しました。

$query_args = array('post_type' => 'post');
$query = new WP_Query($query_args);
$author_ids = array(); // Array of author id's to check before executing 
if ($query->have_posts()) : $query->the_post();
  if (!in_array(get_the_author_meta('ID'), $author_ids)) {
    // DO YOUR STUFF
    // Afterwards, add that id to our array so we don't get another one
    array_Push($author_ids, get_the_author_meta('ID'));
  }
endif;
0
Zachary