Posso mesclar 2 novos WP_Query ($ variable) 's?

15

Estou executando uma rede multisite e configurei uma consulta sql que usa swith_to_blog (); e consulta as postagens.

Existe uma maneira de declarar a consulta dentro de um novo WP_Query e realmente mesclar essa consulta com outra?

Basicamente, se eu fizer isso:

$number1 = new WP_Query($multisitequery);

Posso fundi-lo com:

$number2 = new WP_Query($normalquery);

$normalquery contém configurações como paginação, por página, trecho, título etc ... em um código de acesso do portfólio.

Gostaria que ele incluísse postagens consultadas da minha nova $multisiteconsulta.

Isso pode ser alcançado? Apenas querendo me salvar de criar uma nova configuração de shortcode lol

Muito obrigado antecipadamente. Rory

EDIT ========

O que eu tenho é:

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

Mais abaixo na minha função de portfólio "depois de todas as $ settings ['options']", tenho:

$portfolio_query = new WP_Query( $portfolio );

o $portfolio_queryusa um loop em um modelo de página.

Eu quero adicionar uma consulta extra para isso assim:

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();
}

onde eu assumo que $globalcontainerseria a matriz para mesclar no wp_query();.

Então, levando em consideração o que você respondeu, em teoria eu poderia simplesmente:

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

Isso seria correto?

Segundo, em relação à substituição da chave da matriz array_merge ... Como eu interromperia uma substituição?

Rory Rothon
fonte

Respostas:

28

Você não fará muito bem ao mesclar os argumentos, precisará mesclar a matriz de postagens resultante e a contagem de post_count. Isso funciona para mim:

//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;
guidod
fonte
Parece bom, mas estou procurando uma solução que possa ser usada com o gancho pre_get_posts - ou seja, preciso modificar um objeto WP_Query existente. Eu tentei usar '$ wp_query-> init ();' em vez de '$ wp_query = new WP_Query ();', mas isso parece atrapalhar as coisas. Alguma sugestão?
ban-geoengineering
11
Você deve adicionar uma pergunta diferente, pois é uma resposta diferente, mas pode usar esse mesmo código, mas apenas as partes query2, modificando as partes -> posts e -> post_count do objeto $ wp_query para ter a soma da consulta original que pre_get_posts fornece a você e a segunda consulta que você deseja anexar.
guidod
11
Como posso remover duplicatas dessa matriz mesclada?
Roshan
Obrigado por isso. Teve uma meta_query problemática usando uma relação OR. Dividi-lo usando esta técnica e passou de 41s para 0,01s.
Craig Harshbarger 8/16
@ ban-geoengineering Você já descobriu isso? Também estou preso a isso.
quer
17

Geralmente, mesclo suas matrizes de ID e faço uma terceira consulta. Para manter o primeiro conjunto de consultas barato, retorno apenas os IDs usando o parâmetro fields como este:

//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));

Espero que isto ajude

---EDITAR---

Depois da minha resposta, a pergunta original é editada para obter detalhes sobre vários locais. No caso de postagem multisite mesclada, isso não funciona.

Bora Yalcin
fonte
2
Essa resposta funciona bem e parece menos um hack do que a solução principal. Usou-o há um ano ou mais e voltou a usá-lo novamente agora. Obrigado.
Davey
Como isso pode funcionar corretamente quando IDs de postagem não são exclusivos no escopo multissite (eles são exclusivos por blog, mas várias postagens podem ter os mesmos IDs na rede)?
Adal 5/10
11
A pergunta original @Adal é editada após a minha resposta, portanto, a minha resposta é relevante para o escopo do site único. com multisite, nunca tentei mesclar consultas e, nesse caso, é claro que isso não funcionará, as consultas precisam ser feitas e mescladas separadamente. Após a mesclagem, você pode tentar solicitá-las com as funções de classificação php, talvez (classifique para a data de publicação, etc.).
Bora Yalcin
3
Você pode preservar a classificação usando 'orderby' => 'post__in'a última consulta.
fregante 23/02
2
para os tipos de pós personalizado, penso eu, necessidade post_type param de que, em qualquer caso, mesmo com perguntando por ids, porque é post_type = post por padrão @RobbTe
Bora Yalcin
4

Então, se você tem isso:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

Eu suponho que você os defina em algum lugar anterior?

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

... nesse caso, para mesclar as duas consultas, apenas array_merge()as duas matrizes antes de passá-las para new WP_Query():

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

$merged_query = new WP_Query( $merged_query_args );

Observe que a ordem é importante na array_merge()chamada. Se ambos tiverem a mesma chave de matriz, a segunda matriz substituirá a primeira matriz.

Chip Bennett
fonte
Obrigado por responder Chip, muito apreciado. Eu editei minha pergunta original para ter uma idéia melhor do que tenho para trabalhar. Muito obrigado de fato e estou ansioso para outra conhecimento embalado resposta lol Graças
Rory Rothon