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.