Combinando consultas con diferentes argumentos por tipo de publicación

11

Estoy creando una sección en un sitio en el que estoy fusionando dos tipos de publicaciones diferentes en un solo bucle y luego los muestro al azar. El problema es que me cuesta mucho encontrar una manera de limitar la cantidad de publicaciones por .

Esto es lo que he intentado:

  • Una consulta con varios tipos de publicaciones se puede lograr con una matriz:

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

    ... pero no se limita a un cierto número de publicaciones por tipo.

  • Fusionando dos matrices de argumentos de consulta antes de ejecutar WP_Query en él:

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

    No hay suerte en esto. Lo que sucede es que la última variable $quotes sobrescribe $photos y solo muestra las comillas.

  • Fusionando dos objetos WP_Query a través de encasillamiento:

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

... y así sucesivamente.

Probablemente podría usar una consulta SQL directamente a la base de datos, pero necesito poder combinar estos dos tipos de mensajes separados para un bucle, dispuestos aleatoriamente, Y limitado a una cierta cantidad de mensajes por tipo.

¡Gracias por tu ayuda!

    
pregunta Andy Merskin 05.11.2012 - 08:31

2 respuestas

15

Una forma es personalizar la consulta SQL ejecutada usando posts_clauses u otros filtros similares. Para encontrarlos, busque posts_clauses en "wp-includes / query.php" & Vea la serie de filtros justo antes de esta línea. Estos juntos son capaces de personalizar cualquier parte de la consulta

Otra cosa que puedes hacer es combinar manualmente las publicaciones consultadas en los objetos

$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 );
    
respondido por el Mridul Aggarwal 05.11.2012 - 09:04
5

@mridual aggarwal tu respuesta es muy buena, pero por desgracia no combina realmente el 2 wp_query , solo muestra las publicaciones de los dos en orden. Significo 5 publicaciones de la primera & 5 del segundo pero no ordenados todos en uno, así que tengo esta solución & Alcanzó exactamente el objetivo para mí mismo, al menos

<?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();?>
    
respondido por el adnan 28.10.2013 - 14:26

Lea otras preguntas en las etiquetas