Kết hợp truy vấn với các đối số khác nhau cho mỗi loại bài đăng


11

Tôi đang xây dựng một phần trên một trang web nơi tôi đang hợp nhất hai loại bài đăng khác nhau thành một vòng lặp, và sau đó hiển thị chúng một cách ngẫu nhiên. Vấn đề là, tôi đang gặp khó khăn trong việc tìm cách giới hạn số lượng bài đăng trên mỗi loại.

Đây là những gì tôi đã thử:

  • Một truy vấn với nhiều loại bài đăng có thể đạt được với một mảng:

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

    ... nhưng không thể giới hạn số lượng bài đăng nhất định cho mỗi loại.

  • Hợp nhất hai mảng đối số truy vấn trước khi chạy WP_Query trên đó:

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

    Không có may mắn về điều này. Điều gì xảy ra là biến sau $quotesghi đè $photosvà chỉ hiển thị dấu ngoặc kép.

  • Hợp nhất hai đối tượng WP_Query với nhau thông qua typecasting:

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

... và như thế.

Tôi có thể có thể sử dụng một truy vấn SQL trực tiếp đến cơ sở dữ liệu, nhưng tôi cần có thể kết hợp hai loại bài đăng riêng biệt này cho một vòng lặp, được sắp xếp ngẫu nhiên, VÀ giới hạn ở một số lượng bài đăng nhất định cho mỗi loại.

Cảm ơn bạn đã giúp đỡ!

Câu trả lời:


16

Một cách là tùy chỉnh truy vấn SQL được thực hiện bằng cách sử dụng posts_clauseshoặc các bộ lọc khác như vậy. Để tìm thấy chúng, hãy tìm kiếm posts_clausestrong "wp-gộp / query.php" và xem loạt bộ lọc ngay trước dòng này. Những cái này có khả năng tùy chỉnh bất kỳ phần nào của truy vấn

Một điều khác bạn có thể làm là hợp nhất thủ công các bài đăng được truy vấn trong các đối tượng

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

Giải pháp thứ hai của bạn (không có SQL) đã thực hiện thủ thuật! Bây giờ tôi có toàn quyền kiểm soát những gì đang đi vào truy vấn cuối cùng đó trước khi đi vào vòng lặp. Cảm ơn bạn đã giúp đỡ!
Andy Merskin

1
Cái đầu tiên khó nhưng hiệu quả hơn (thứ hai vẫn có 2 truy vấn cơ sở dữ liệu). Tôi muốn nói rằng nó tùy thuộc vào sở thích cá nhân
Mridul Aggarwal

Sẽ cực kỳ quan tâm đến một cách để thực hiện giải pháp đầu tiên! Các bộ lọc cần thiết, v.v ... Điều này có gọi một UNIONsố loại trong sql cho mỗi post_type không?
Solomon Closson

@SolomonClosson bộ lọc này có thể giúp- codex.wordpress.org/Plugin_API/Filter_Reference/posts_clauses
Mridul Aggarwal

7

@mridual aggarwal câu trả lời của bạn rất rất tốt nhưng thật không may là nó không thực sự kết hợp cả 2 wp_querynó chỉ hiển thị các bài đăng từ cả hai sắp xếp tôi có nghĩa là 5 bài đăng từ đầu tiên & 5 từ thứ hai nhưng không được sắp xếp tất cả trong một vì vậy tôi có giải pháp & nó chính xác đạt được mục tiêu cho bản thân tôi ít nhấ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();?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.