2つの新しいWP_Query($ variable)をマージできますか?


15

マルチサイトネットワークを実行していて、swith_to_blog();を使用するSQLクエリをセットアップしました。投稿をクエリします。

新しいWP_Query内でクエリを宣言し、実際にそのクエリを別のクエリとマージする方法はありますか?

基本的にこれを行う場合:

$number1 = new WP_Query($multisitequery);

それとマージできますか?

$number2 = new WP_Query($normalquery);

$normalquery ポートフォリオショートコードのページ設定、ページごと、抜粋、タイトルなどの設定を保持します。

新しい$multisiteクエリのクエリされた投稿を含めたいです。

これは達成できますか?まったく新しいショートコード設定を作成しないようにしたいですlol

よろしくお願いします。ロリー

編集========

私が持っているものは:

$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

引数をマージするだけではあまり効果はありません。結果のposts配列と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
別の質問なので、別の質問を追加する必要がありますが、同じコードを使用できますが、query2の部分のみを使用して、$ wp_queryオブジェクトの-> postsおよび-> post_countの部分を変更して、元のクエリの合計がpre_get_postsになるようにします。追加する2番目のクエリが表示されます。
guidod 2014年

1
このマージされた配列から重複を削除するにはどうすればよいですか?
roshan 2015年

これをありがとう。OR関係を使用した問題のあるmeta_queryがありました。この手法を使用して分割すると、41秒から0.01秒になりました。
Craig Harshbarger 16年

@ ban-geoengineeringこれを理解したことがありますか?私もこれにこだわっています。
harvey

17

私は通常、ID配列をマージして、3番目のクエリを作成します。最初のクエリセットを安く保つために、次のように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、2017

post_IDがマルチサイトスコープで一意でない場合、これはどのように正しく機能しますか(ブログごとに一意ですが、複数の投稿がネットワーク全体で同じIDを持つことができます)?
Adal

1
@Adal元の質問は私の回答の後に編集されるため、私の回答は単一のサイトスコープに関連しています。マルチサイトでは、クエリをマージしようとしたことはありません。その場合、もちろんこれは機能しません。クエリを個別に作成してマージする必要があります。マージした後は、phpのソート関数(それらを公開日などでソートする)でそれらを並べ替えてみることができます。
Bora Yalcin 2017年

3
'orderby' => 'post__in'最後のクエリでを使用して、並べ替えを保持できます。
-fregante

2
カスタム投稿タイプの場合、post_type paramはいずれにせよそれが必要であると思います。デフォルトではpost_type = postであるため、IDで要求する場合でも@RobbTe
Bora Yalcin

4

だから、これがあれば:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

あなたはこれらを以前のどこかで定義したと思いますか?

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

...その場合、2つのクエリをマージするにarray_merge()は、2つの配列を渡す前に2つの配列のみを使用しますnew WP_Query()

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

$merged_query = new WP_Query( $merged_query_args );

array_merge()呼び出しでは順序が重要であることに注意してください。両方に同じ配列キーがある場合、2番目の配列は最初の配列を上書きします。


チップに返信いただきありがとうございます。元の質問を編集して、私が何を処理しなければならないかをよりよく理解できるようにしました。本当に本当にありがとう。私は別の知識が詰まった返信を楽しみにしていますlolありがとう
ロリーロトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.