Kombinieren von Abfragen mit unterschiedlichen Argumenten pro Beitragstyp

11

Ich erstelle einen Abschnitt auf einer Site, in der ich zwei verschiedene Beitragstypen in einer Schleife zusammenführe und sie dann zufällig anzeige. Das Problem ist, dass es mir schwer fällt, die Anzahl der Beiträge pro Typ zu begrenzen .

Folgendes habe ich versucht:

  • Eine Abfrage mit mehreren Beitragstypen kann mit einem Array durchgeführt werden:

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

    ... kann aber nicht auf eine bestimmte Anzahl von Posts pro Typ beschränkt werden.

  • Zusammenführen von zwei Arrays mit Abfrageargumenten, bevor WP_Query darauf ausgeführt wird:

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

    Kein Glück. Was passiert, ist, dass die letztere Variable $quotesüberschreibt $photosund nur die Anführungszeichen anzeigt.

  • Zusammenführen von zwei WP_Query- Objekten durch Typumwandlung:

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

... und so weiter.

Ich könnte wahrscheinlich eine SQL-Abfrage direkt in der Datenbank verwenden, aber ich muss in der Lage sein, diese beiden separaten Beitragstypen für eine Schleife zu kombinieren, die zufällig angeordnet und auf eine bestimmte Anzahl von Beiträgen pro Typ beschränkt ist.

Danke für Ihre Hilfe!

Andy Merskin
quelle

Antworten:

16

Eine Möglichkeit besteht darin, die SQL-Abfrage anzupassen, die mit posts_clausesoder anderen solchen Filtern ausgeführt wird. Um sie zu finden, suchen Sie posts_clausesin "wp-includes / query.php" und sehen Sie sich die Reihe der Filter direkt vor dieser Zeile an. Diese zusammen können jeden Teil der Abfrage anpassen

Sie können auch die abgefragten Beiträge in den Objekten manuell zusammenführen

$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 );
Mridul Aggarwal
quelle
Ihre zweite Lösung (ohne SQL) hat es geschafft! Jetzt habe ich die vollständige Kontrolle darüber, was in diese letzte Abfrage geht, bevor ich in die Schleife gehe. Danke für Ihre Hilfe!
Andy Merskin
1
Die erste ist schwierig, aber effizienter (in der zweiten gibt es noch 2 Datenbankabfragen). Ich würde sagen, es kommt auf die persönlichen Vorlieben an
Mridul Aggarwal
Wäre sehr interessiert an einem Weg, um die erste Lösung zu erreichen! Die benötigten Filter usw. UNIONErfordert dies für jeden post_type eine Art in der SQL?
Solomon Closson
@SolomonClosson dieser Filter kann helfen- codex.wordpress.org/Plugin_API/Filter_Reference/posts_clauses
Mridul Aggarwal
7

@mridual aggarwal Ihre Antwort ist sehr sehr gut, aber leider kombiniert es die 2 nicht wirklich wp_query sondern zeigt nur die Beiträge von beiden in Anordnung. Ich meine 5 Beiträge vom ersten und 5 vom zweiten, aber nicht alle in einem sortiert, also habe ich dies Lösung & es hat zumindest genau das Ziel für mich selbst erreicht

<?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();?>
adnan
quelle