Gönderi türü başına sorguları farklı bağımsız değişkenlerle birleştirme


11

Bir sitede iki farklı yazı türünü bir döngüde birleştirdiğim ve sonra rasgele görüntülediğim bir bölüm oluşturuyorum. Sorun şu ki, yazı başına yazı miktarını sınırlamak için bir yol bulmakta zorlanıyorum .

İşte denedim:

  • Bir dizi ile birden çok gönderi türüne sahip bir sorgu gerçekleştirilebilir:

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

    ... ancak tür başına belirli sayıda yayınla sınırlandırılamaz.

  • Üzerinde WP_Query çalıştırmadan önce iki sorgu bağımsız değişkeni dizisini birleştirme :

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

    Bunda şans yok. Olan şey, ikinci değişkenin $quotesüzerine yazılması $photosve yalnızca tırnak işaretlerinin gösterilmesidir.

  • İki WP_Query nesnesini yazım hatasıyla birleştirme :

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

... ve bunun gibi.

Muhtemelen veritabanına doğrudan bir SQL sorgusu kullanabilirsiniz, ancak rastgele düzenlenmiş VE tür başına yazı belirli bir miktar ile sınırlı bir döngü için bu iki ayrı yazı türleri birleştirmek gerekir .

Yardım ettiğin için teşekkür ederim!

Yanıtlar:


16

Bunun bir yolu, posts_clausesveya bu tür filtreleri kullanarak yürütülen SQL sorgusunu özelleştirmektir . Bunları bulmak için posts_clauses"wp-include / query.php" ifadesini arayın ve bu satırdan hemen önce filtre serisine bakın. Bunlar birlikte sorgunun herhangi bir bölümünü özelleştirebilir

Yapabileceğiniz başka bir şey, nesnelerdeki sorgulanan gönderileri manuel olarak birleştirmektir

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

İkinci çözüm (SQL olmadan) hile yaptı! Şimdi döngüye girmeden önce o son sorguya ne üzerinde tam bir kontrol var. Yardım ettiğin için teşekkür ederim!
Andy Merskin

1
Birincisi zor ama daha verimli (ikincisinde hala 2 veritabanı sorgusu var). Kişisel tercihe geldiğini söyleyebilirim
Mridul Aggarwal

İlk çözümü gerçekleştirmenin bir yolu ile son derece ilgilenirsiniz! Gerekli filtreler vb. Bu UNION, her post_type için sql'de bir tür çağrı gerektiriyor mu?
Solomon Closson

@SolomonClosson bu filtre yardımcı olabilir- codex.wordpress.org/Plugin_API/Filter_Reference/posts_clauses
Mridul Aggarwal

7

mridual aggarwal cevabınız çok çok iyi ama talihsiz bir şekilde gerçekten birleştiren 2 wp_querydeğil sadece her ikisinden gelen mesajları gösterir düzenlemek i ikinci ve 5 gelen 5 mesaj demek ama hepsi bir arada bu yüzden bu var çözüm ve en azından kendim için hedefe ulaştı

<?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();?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.