게시물 유형마다 다른 인수로 쿼리 결합


11

두 개의 다른 게시물 유형 을 하나의 루프로 병합 한 다음 무작위로 표시 하는 사이트에 섹션을 작성하고 있습니다 . 문제는 유형 게시물 를 제한하는 방법을 찾는 데 어려움을 겪고 있다는 것 입니다 .

내가 시도한 것은 다음과 같습니다.

  • 배열을 사용하여 여러 게시물 유형을 가진 하나의 쿼리를 얻을 수 있습니다.

    $args = array( 'post_type' => array( 'photos', 'quotes' ), ...

    ... 유형 당 특정 게시물 수로 제한 할 수는 없습니다.

  • WP_Query 를 실행하기 전에 두 개의 쿼리 인수 배열을 병합 합니다.

    $photos = array( 'post_type' => 'photos', 'posts_per_page' => 15, 'orderby' => 'rand' );
    $quotes = array( 'post_type' => 'quotes', 'posts_per_page' => 5, 'orderby' => 'rand' );
    
    $args = $photos + $quotes;
    // Also tried array_merge( $photos, $quotes );

    운이 없다. 후자의 변수는 $quotes덮어 쓰기 $photos되고 따옴표 만 표시됩니다.

  • 타입 캐스팅을 통해 두 개의 WP_Query 객체를 병합

    $photos_query = new WP_Query( $photos );
    $quotes_query = new WP_Query( $quotes );
    $result = (object)array_merge( (array)$photos_query, (array)$quotes_query );

... 등등.

아마 바로 데이터베이스에 SQL 쿼리를 사용할 수 있습니다,하지만 난 필요가 무작위로 배열되고, 유형별 게시물의 일정 금액으로 제한 한 루프이 두 개의 분리 된 후 유형을 결합 할 수 있도록.

당신의 도움을 주셔서 감사합니다!

답변:


16

한 가지 방법은 posts_clauses다른 필터를 사용하여 실행 된 SQL 쿼리를 사용자 정의하는 것 입니다. posts_clauses"wp-includes / query.php"에서 검색 하고이 줄 바로 앞에있는 일련의 필터를 참조하십시오. 이들은 함께 쿼리의 모든 부분을 사용자 정의 할 수 있습니다

다른 방법은 쿼리 된 게시물을 개체에 수동으로 병합하는 것입니다.

$photos_query = new WP_Query( $photos );
$quotes_query = new WP_Query( $quotes );
$result = new WP_Query();

// start putting the contents in the new object
$result->posts = array_merge( $photos_query->posts, $quotes_query->posts );

// here you might wanna apply some sort of sorting on $result->posts

// we also need to set post count correctly so as to enable the looping
$result->post_count = count( $result->posts );

두 번째 솔루션 (SQL 제외)이 트릭을 수행했습니다! 이제 루프에 들어가기 전에 최종 쿼리에 무엇이 들어가는 지 완벽하게 제어 할 수 있습니다. 당신의 도움을 주셔서 감사합니다!
Andy Merskin

1
첫 번째는 어렵지만 더 효율적입니다 (두 번째에는 여전히 2 개의 데이터베이스 쿼리가 있음). 나는 그것이 개인 취향에 해당한다고 말하고 싶습니다
Mridul Aggarwal

첫 번째 솔루션을 달성하는 방법에 매우 관심이 있습니다! 필요한 필터 등. 이것은 UNION각 post_type에 대해 SQL에서 일종의 호출을 요구합니까?
Solomon Closson


7

@ mridual aggarwal 귀하의 답변은 매우 훌륭하지만 불행히도 실제로 2를 결합하지는 않습니다 .2 wp_query의 게시물 만 표시합니다. 첫 번째에서 5 개의 게시물을 의미하고 두 번째에서 5 개의 게시물을 의미하지만 하나에 모두 정렬되어 있지 않으므로이 항목을 갖습니다. 솔루션 & 그것은 적어도 내 자신의 목표를 달성했습니다.

<?php
$term = get_term_by( 'slug', get_query_var( 'tag' ), "post_tag" );
$tagslug = $term->slug;
$post_types = get_post_types('','names');
?>
<?php
//first query
$blogposts = get_posts(array(
    'tag' => $tagslug, //first taxonomy
    'post_type' => $post_types,
    'post_status' => 'publish',
    ));
//second query
$authorposts = get_posts(array(
    'bookauthor' => $tagslug, //second taxonomy
    'post_type' => $post_types,
    'post_status' => 'publish',
    ));
$mergedposts = array_merge( $blogposts, $authorposts ); //combine queries

$postids = array();
foreach( $mergedposts as $item ) {
$postids[]=$item->ID; //create a new query only of the post ids
}
$uniqueposts = array_unique($postids); //remove duplicate post ids

$posts = get_posts(array(
        //new query of only the unique post ids on the merged queries from above
    'post__in' => $uniqueposts,  
    'post_type' => $post_types,
    'post_status' => 'publish',
    ));
foreach( $posts as $post ) :
setup_postdata($post);
?>
// posts layout
<?php endforeach; ?>
<?php wp_reset_postdata();?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.