¿Puedo fusionar 2 nuevos WP_Query ($ variable)?

15

Estoy ejecutando una red multisitio y he configurado una consulta sql que usa swith_to_blog (); y consulta las publicaciones.

¿Hay alguna manera de que pueda declarar la consulta dentro de una nueva WP_Query y realmente combinar esa consulta con otra?

Básicamente si hago esto:

$number1 = new WP_Query($multisitequery);

¿Puedo fusionarlo con:

$number2 = new WP_Query($normalquery);

$normalquery contiene configuraciones como paginación, por página, extracto, título, etc. en un shortcode de cartera.

Me gustaría incluir publicaciones consultadas de mi nueva $multisiteconsulta.

¿Se puede lograr esto? Solo quiero salvarme de crear una nueva configuración de shortcode lol

Muchas gracias de antemano. Rory

EDITAR ========

Lo que tengo es:

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

Más abajo en la función de mi cartera "después de todas las configuraciones $ ['opciones']" tengo:

$portfolio_query = new WP_Query( $portfolio );

el $portfolio_queryutiliza un bucle en una plantilla de página.

Quiero agregar una consulta adicional en esto de esta manera:

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

donde supongo que $globalcontainersería la matriz para fusionarse en el wp_query();.

Entonces, teniendo en cuenta lo que ha respondido, en teoría podría simplemente:

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

¿Sería eso correcto?

Segundo, con respecto a la sobrescritura de la clave de matriz array_merge ..... ¿Cómo haría para detener una sobrescritura?

Rory Rothon
fuente

Respuestas:

28

No hará mucho bien solo fusionando los argumentos, necesita fusionar la matriz de publicaciones resultante y el recuento de post_count. Esto funciona para mi:

//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
fuente
Esto se ve bien, pero estoy buscando una solución que pueda usarse con el gancho pre_get_posts, es decir, necesito modificar un objeto WP_Query existente. He intentado usar '$ wp_query-> init ();' en lugar de '$ wp_query = new WP_Query ();', pero eso parece arruinar las cosas. ¿Alguna sugerencia?
prohibición de geoingeniería
1
Debe agregar una pregunta diferente ya que es una respuesta diferente, pero puede usar este mismo código pero solo las partes query2, modificando las partes -> posts y -> post_count del objeto $ wp_query para tener la suma de la consulta original que pre_get_posts le da a usted y la segunda consulta que desea agregar.
guidod
1
¿Cómo puedo eliminar duplicados de esta matriz combinada?
roshan
Gracias por esto. Tenía una meta_query problemática usando una relación OR. Divídalo usando esta técnica y pasó de 41s a 0.01s.
Craig Harshbarger
@ ban-geoingeniería ¿Alguna vez has descubierto esto? Estoy atrapado con esto también.
harvey
17

Generalmente combino sus matrices de ID y hago una tercera consulta. Para mantener barato el primer conjunto de consultas, solo devuelvo sus ID utilizando parámetros de campo 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 esto ayude

---EDITAR---

Después de mi respuesta, la pregunta original se edita para obtener detalles de varios sitios. En caso de fusión de sitios múltiples, esto no funciona.

Bora Yalcin
fuente
2
Esta respuesta funciona bien y parece menos hackear que la solución principal. Lo usé hace aproximadamente un año y volví a usarlo nuevamente ahora. Gracias.
Davey
¿Cómo puede funcionar esto correctamente cuando los post_ID no son únicos en el ámbito multisitio (son únicos por blog pero varias publicaciones pueden tener los mismos ID en toda la red)?
Adal
1
@Adal La pregunta original se edita después de mi respuesta, por lo que mi respuesta es relevante para el alcance del sitio único. con multisitio nunca intenté fusionar consultas y en ese caso, por supuesto, esto no funcionará, las consultas deben hacerse y fusionarse por separado. Después de la fusión, puede intentar ordenarlos con funciones de ordenación php (ordenar por fecha de publicación, etc.).
Bora Yalcin
3
Puede preservar la clasificación mediante el uso 'orderby' => 'post__in'en la última consulta.
fregante
2
para los tipos de publicaciones personalizadas, creo que post_type param necesita eso en cualquier caso, incluso con preguntar por id porque es post_type = post por defecto @RobbTe
Bora Yalcin
4

Entonces, si tienes esto:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

¿Supongo que los define en algún lugar anterior?

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

... en cuyo caso, para fusionar las dos consultas, solo array_merge()las dos matrices antes de pasarlas a new WP_Query():

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

$merged_query = new WP_Query( $merged_query_args );

Tenga en cuenta que el orden es importante en la array_merge()llamada. Si ambos tienen la misma clave de matriz, la segunda matriz sobrescribirá la primera matriz.

Chip Bennett
fuente
Gracias por responder Chip, muy apreciado. He editado mi pregunta original para darle una mejor idea de con qué tengo que trabajar. Muchas gracias de verdad y espero otra respuesta llena de conocimiento jajaja Gracias
Rory Rothon