2 개의 새로운 WP_Query ($ variable)를 병합 할 수 있습니까?


15

다중 사이트 네트워크를 실행 중이며 swith_to_blog ()를 사용하는 SQL 쿼리를 설정했습니다. 게시물을 쿼리합니다.

새 WP_Query 내에서 쿼리를 선언하고 실제로 해당 쿼리를 다른 쿼리와 병합 할 수있는 방법이 있습니까?

기본적으로 내가 이렇게하면 :

$number1 = new WP_Query($multisitequery);

그것을 병합 할 수 있습니까?

$number2 = new WP_Query($normalquery);

$normalquery 페이지 매김, 페이지 당, 발췌, 제목 등과 같은 설정을 포트폴리오 단축 코드에 보유합니다.

$multisite쿼리 에서 쿼리 한 게시물을 포함하고 싶습니다 .

이것이 달성 될 수 있습니까? 완전히 새로운 단축 코드 설정을 작성하지 않아도됩니다.

미리 감사드립니다. 로리

편집 ========

내가 가진 것은 :

$portfolio = array();
$portfolio = $settings;

"내 모든 $ settings [ 'options']"후에 내 포트폴리오 기능을 더 아래로 내리십시오.

$portfolio_query = new WP_Query( $portfolio );

$portfolio_query페이지 템플릿에서 루프를 사용합니다.

다음과 같이 추가 쿼리를 추가하고 싶습니다.

global $wpdb, $blog_id, $post;

$blogs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM wp_blogs ORDER BY blog_id" ) );

$globalcontainer = array();

foreach ($blogs as $blog){

   switch_to_blog($blog->blog_id);

   $globalquery = query_posts($args);

   $globalcontainer = array_merge( $globalcontainer, $globalquery );

   restore_current_blog();
}

여기서는 $globalcontainer에 병합 할 배열 이라고 가정 합니다 wp_query();.

그래서 당신이 대답 한 것을 온보드로 가져 가면 이론 상으로는 간단하게 할 수 있습니다.

$mergedqueryargs = array_merge($portfolio , $globalcontainer);
$portfolio_query = new WP_query($mergedqueryargs);

맞습니까?

둘째, array_merge 배열 키 덮어 쓰기와 관련하여 ... 덮어 쓰기를 중지하려면 어떻게해야합니까?

답변:


28

인수를 병합하는 것만으로는 별다른 이점이 없으므로 결과 게시물 배열과 post_count 수를 병합해야합니다. 이것은 나를 위해 작동합니다 :

//setup your queries as you already do
$query1 = new WP_Query($args_for_query1);
$query2 = new WP_Query($args_for_query2);

//create new empty query and populate it with the other two
$wp_query = new WP_Query();
$wp_query->posts = array_merge( $query1->posts, $query2->posts );

//populate post_count count for the loop to work correctly
$wp_query->post_count = $query1->post_count + $query2->post_count;

이것은 좋아 보이지만 pre_get_posts 후크와 함께 사용할 수있는 솔루션을 찾고 있습니다. 즉, 기존 WP_Query 객체를 수정해야합니다. '$ wp_query-> init ();'를 사용하려고했습니다. '$ wp_query = new WP_Query ();'대신에 문제가 발생하는 것으로 보입니다. 어떤 제안?
ban-geoengineering

1
다른 답변이기 때문에 다른 질문을 추가해야하지만 $ wp_query 객체의-> posts 및-> post_count 부분을 수정하여 동일한 코드를 query2 부분 만 사용할 수 있습니다 .pre_get_posts 추가하려는 두 번째 쿼리를 제공합니다.
guidod

1
이 병합 된 배열에서 중복을 제거하려면 어떻게해야합니까?
roshan

고마워 OR 관계를 사용하여 문제가있는 meta_query가있었습니다. 이 기술을 사용하여 그것을 나누고 41에서 0.01로 갔다.
Craig Harshbarger 2016 년

@ ban-geoengineering 이것을 알아 낸 적이 있습니까? 나는 이것도 붙어 있습니다.
harvey

17

나는 일반적으로 ID 배열을 병합하고 세 번째 쿼리를 만듭니다. 첫 번째 쿼리 세트를 저렴하게 유지하려면 다음과 같이 fields 매개 변수를 사용하여 ID를 반환합니다.

//setup your queries with extra parameter fields => ids
$query1 = new WP_Query(array('fields' => 'ids','other_parameters' => 'etc'));
$query2 = new WP_Query(array('fields' => 'ids','other_parameters'=>'etc'));

//now you got post IDs in $query->posts
$allTheIDs = array_merge($query1->posts,$query2->posts);

//new query, using post__in parameter
$finalQuery = new WP_Query(array('post__in' => $allTheIDs));

도움이 되었기를 바랍니다

---편집하다---

내 답변 후 여러 사이트 세부 정보를 위해 원래 질문이 편집됩니다. 다중 사이트 게시 병합의 경우 작동하지 않습니다.


2
이 답변은 잘 작동하며 최고의 솔루션보다 해킹이 적습니다. 1 년 정도 전에 사용했고 지금 다시 사용하기 위해 돌아 왔습니다. 감사합니다.
Davey

멀티 사이트 범위에서 post_ID가 고유하지 않은 경우 어떻게 작동합니까 (블로그마다 고유하지만 여러 게시물이 네트워크에서 동일한 ID를 가질 수 있음)?
Adal

1
@Adal 원래 답변은 답변 후 단일 사이트 범위와 관련이 있으므로 답변 후 편집됩니다. 멀티 사이트를 사용하면 쿼리를 병합하려고 시도하지 않았으며 물론이 경우 작동하지 않으므로 쿼리를 별도로 작성하고 병합해야합니다. 병합 후 PHP 정렬 기능을 사용하여 주문할 수 있습니다 (게시 날짜 정렬 등).
보라 얄신

3
'orderby' => 'post__in'마지막 쿼리에서 를 사용하여 정렬을 유지할 수 있습니다 .
fregante

2
사용자 정의 게시물 유형의 경우 post_type 매개 변수는 기본적으로 post_type = post이므로 @RobbTe
Bora

4

따라서이 경우

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

나는 당신이 이것을 어딘가에 정의했다고 가정합니까?

$multisitequery = array();
$normalquery = array();

...이 경우 두 쿼리를 병합하려면 두 쿼리 array_merge()를 전달하기 전에 두 배열 만 병합하십시오 new WP_Query().

$merged_query_args = array_merge( $normalquery, $multisitequery );

$merged_query = new WP_Query( $merged_query_args );

array_merge()통화 에서는 순서가 중요합니다 . 둘 다 동일한 배열 키를 가진 경우 두 번째 배열은 첫 번째 배열을 덮어 씁니다.


Chip에 회신 해 주셔서 감사합니다. 내가해야 할 일을 더 잘 이해할 수 있도록 원래의 질문을 편집했습니다. 실제로 많은 감사와 나는 다른 지식으로 가득 찬 답변을 기대합니다 lol Thanks
Rory Rothon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.