Menggabungkan kueri dengan berbagai argumen per jenis posting

11

Saya sedang membangun bagian di situs tempat saya menggabungkan dua jenis posting berbeda menjadi satu loop, dan kemudian menampilkannya secara acak. Masalahnya adalah, saya mengalami kesulitan menemukan cara untuk membatasi jumlah posting per jenis.

Inilah yang saya coba:

  • Satu kueri dengan beberapa jenis posting dapat dicapai dengan larik:

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

    ... tetapi tidak dapat terbatas pada jumlah posting tertentu per jenis.

  • Menggabungkan dua array argumen kueri sebelum menjalankan WP_Query di atasnya:

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

    Tidak beruntung dalam hal ini. Apa yang terjadi adalah variabel yang terakhir $quotesditimpa $photosdan hanya menunjukkan tanda kutip.

  • Menggabungkan dua objek WP_Query bersama melalui typecasting:

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

... dan seterusnya.

Saya mungkin dapat menggunakan query SQL langsung ke database, tetapi saya harus dapat menggabungkan dua jenis posting terpisah ini untuk satu loop, diatur secara acak, DAN terbatas pada jumlah posting tertentu per jenis.

Terima kasih atas bantuan Anda!

Andy Merskin
sumber

Jawaban:

16

Salah satu caranya adalah dengan menyesuaikan kueri SQL yang dijalankan menggunakan posts_clausesatau filter semacam itu. Untuk menemukannya cari posts_clausesdi "wp-include / query.php" & lihat rangkaian filter sebelum baris ini. Ini bersama-sama mampu menyesuaikan setiap bagian dari permintaan

Hal lain yang dapat Anda lakukan adalah menggabungkan posting yang diminta secara manual di objek

$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
sumber
Solusi kedua Anda (tanpa SQL) berhasil! Sekarang saya memiliki kendali penuh atas apa yang masuk ke permintaan akhir sebelum masuk ke loop. Terima kasih atas bantuan Anda!
Andy Merskin
1
Yang pertama sulit tetapi lebih efisien (di kedua masih ada 2 permintaan basis data). Saya akan mengatakan itu karena preferensi pribadi
Mridul Aggarwal
Akan sangat tertarik dengan cara untuk mencapai solusi pertama! Filter diperlukan, dll. Apakah ini memerlukan UNIONbeberapa jenis dalam sql untuk setiap post_type?
Solomon Closson
@SolomonClosson filter ini dapat membantu- codex.wordpress.org/Plugin_API/Filter_Reference/posts_clauses
Mridul Aggarwal
7

@ agridwal tradisional jawaban Anda sangat sangat bagus tapi sayangnya tidak benar-benar menggabungkan 2 wp_queryitu hanya menunjukkan posting dari keduanya dalam mengatur maksud saya 5 posting dari yang pertama & 5 dari yang kedua tetapi tidak diurutkan semua dalam satu jadi saya punya ini solusi & justru mencapai tujuan untuk diri saya setidaknya

<?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
sumber