Combinazione di query con argomenti diversi per tipo di post


11

Sto creando una sezione su un sito in cui unisco due diversi tipi di post in un ciclo e li visualizzo in modo casuale. Il problema è che non riesco a trovare un modo per limitare la quantità di post per tipo.

Ecco cosa ho provato:

  • È possibile ottenere una query con più tipi di post con un array:

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

    ... ma non può limitarsi a un certo numero di post per tipo.

  • Unire due matrici di argomenti di query prima di eseguire WP_Query su di esso:

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

    Nessuna fortuna su questo. Quello che succede è che l'ultima variabile $quotessovrascrive $photose mostra solo le virgolette.

  • Unendo due oggetti WP_Query insieme tramite la tipografia:

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

... e così via.

Probabilmente potrei utilizzare una query SQL direttamente alla banca dati, ma ho bisogno di essere in grado di combinare questi due tipi post a parte per un ciclo, disposti in modo casuale, e limitata ad una certa quantità di messaggi al tipo.

Grazie per l'aiuto!

Risposte:


16

Un modo è personalizzare la query SQL eseguita utilizzando posts_clauseso altri filtri simili. Per trovarli cerca posts_clausesin "wp-Includes / query.php" e vedi la serie di filtri appena prima di questa riga. Questi insieme sono in grado di personalizzare qualsiasi parte della query

Un'altra cosa che puoi fare è unire manualmente i post interrogati negli oggetti

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

La tua seconda soluzione (senza SQL) ha funzionato! Ora ho il controllo completo su ciò che sta andando in quella query finale prima di entrare nel ciclo. Grazie per l'aiuto!
Andy Merskin,

1
Il primo è difficile ma più efficiente (nel secondo ci sono ancora 2 query sul database). Direi che
dipende dalle

Sarebbe estremamente interessato in un modo per realizzare la prima soluzione! I filtri necessari, ecc. UNIONRichiede una sorta di sql in sql per ogni post_type?
Solomon Closson,


7

@mridual aggarwal la tua risposta è molto buona, ma sfortunatamente non combina davvero il 2 wp_queryma mostra solo i post di entrambi nell'organizzare intendo 5 post dal primo e 5 dal secondo ma non ordinati tutti in uno quindi ho questo soluzione e ha raggiunto esattamente l'obiettivo per me stesso almeno

<?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();?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.