it-swarm.com.de

Kombinieren von Abfragen mit verschiedenen Argumenten pro Beitragstyp

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

Folgendes habe ich versucht:

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

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

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

  • Zusammenführen von zwei Abfrage-Argument-Arrays, bevor WP_Query 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 dabei. Was passiert ist, dass die letztere Variable $quotes$photos überschreibt und nur die Anführungszeichen anzeigt.

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

    $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 , um diese beiden separaten Beitragstypen für eine Schleife kombinieren zu können, die zufällig angeordnet und auf eine bestimmte Anzahl von Beiträgen pro Typ beschränkt ist.

Danke für Ihre Hilfe!

11
Andy Merskin

Eine Möglichkeit besteht darin, die mit posts_clauses oder anderen derartigen Filtern ausgeführte SQL-Abfrage anzupassen. Um sie zu finden, suchen Sie nach posts_clauses in "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 die abgefragten Posts auch manuell in den Objekten 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 );
16
Mridul Aggarwal

@mridual aggarwal Ihre Antwort ist sehr, sehr gut, aber leider ist es nicht wirklich die Kombination der 2 wp_query es zeigt nur die Beiträge von beiden in ordnen, ich meine 5 Beiträge von der ersten und 5 von der zweiten, aber nicht alle in einem sortiert, so habe ich Diese Lösung und es hat 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();?>
7
adnan