Sử dụng wp_query có thể phân loại thứ tự?


49

Câu hỏi của tôi rất đơn giản, tôi đang sử dụng WP_Query để truy xuất một số bài đăng loại tùy chỉnh theo phân loại bằng cách sử dụng tax_query.

Bây giờ vấn đề của tôi là tôi muốn đặt hàng phân loại, nhưng từ tài liệu và tìm kiếm trên web tôi không thể tìm ra giải pháp.

Thứ tự trong WP_Query cho phép bạn đặt hàng theo một loạt các trường thậm chí các trường meta tùy chỉnh nhưng dường như nó không hỗ trợ phân loại.

Bất kỳ con trỏ đi đúng hướng?

Cảm ơn tất cả.

Câu trả lời:


12

Không, không thể đặt hàng theo phân loại, bởi vì từ một loại quan điểm nhất định, điều đó thực sự không có ý nghĩa nhiều.

Phân loại học là cách để nhóm các thứ lại với nhau. Vì vậy, quan điểm của việc phân loại các bài đăng sẽ thực sự có các điều khoản trong phân loại đó được chia sẻ giữa các bài viết. Nếu một phân loại có các thuật ngữ chỉ được sử dụng trên một bài đăng, thì điều đó sẽ làm cho loại phân loại trở nên vô nghĩa. Và nếu các điều khoản được chia sẻ như họ nên, thì việc đặt hàng bởi nó sẽ không tạo ra bất cứ điều gì đặc biệt hữu ích.

Những gì bạn nên sử dụng trong tình huống như vậy là meta bài viết. Bạn có thể đặt hàng theo meta bài đăng và nó là duy nhất cho mỗi bài đăng.

Chỉnh sửa: Điều đó nói rằng, bạn có thể đặt hàng bằng cách phân loại bằng cách làm cho một truy vấn SQL tùy biến sử dụng một bộ lọc, bạn chỉ có thể làm điều đó từ một WP_Query chưa sửa đổi: http://scribu.net/wordpress/sortable-taxonomy-columns.html

Tuy nhiên, nếu bạn phải dùng đến việc này, thì cấu trúc thiết kế dữ liệu của bạn đã sai ngay từ đầu. "Điều khoản" trong phân loại không phải là "dữ liệu" thực tế. Bản thân các thuật ngữ không có ý nghĩa vốn có, chúng chỉ là nhãn cho nhóm cụ thể mà chúng mô tả. Nếu bạn đang coi chúng là dữ liệu có ý nghĩa, thì bạn có một lỗi thiết kế cơ bản.

Phân loại nhóm điều bằng cách gán các điều khoản cho họ. Nhóm đó là toàn bộ quan điểm của các nguyên tắc phân loại, các điều khoản chỉ là những khuôn mặt đẹp trên nhóm. Nếu bạn có siêu dữ liệu có ý nghĩa để gán cho một bài đăng, thì bạn nên sử dụng meta bài đăng cho nó. Và bạn có thể đặt hàng theo, bởi vì meta post sử dụng cả khóa và giá trị để lưu trữ thông tin. Với phân loại, bạn thực sự chỉ lưu trữ khóa, với các giá trị của chúng là các bài đăng được nhóm lại với nhau theo thuật ngữ đó.

Mọi thứ sẽ dễ dàng hơn trong thời gian dài nếu bạn sử dụng phương pháp chính xác cho nó. Mặc dù tôi không nói rằng bạn không thể làm điều gì đó kỳ lạ với phân loại học, nhưng về lâu dài, bạn chỉ khiến mọi thứ trở nên khó khăn hơn bằng cách sử dụng sai.


Xin chào Otto, cảm ơn bạn đã trả lời. Tôi thấy quan điểm của bạn và có lẽ tôi đang đi sai đường với điều này. Trong ví dụ của tôi, một trang web về các chương trình truyền hình, tôi có phân loại cho loạt 1, serie 2, serie 3, v.v. Vì vậy, tôi có thể nhóm tất cả các chương trình truyền hình khác nhau theo số sê-ri. Sau đó, tôi có điều tương tự cho các tập, Tập 01, Tập 02, v.v. Điều tôi muốn là khi hiển thị danh sách tất cả các tập được sắp xếp theo tập và serie. Tôi sẽ phân tích sau đó đăng meta và các lĩnh vực tùy chỉnh. Cảm ơn Otto.
yeope

@yeope phân loại của bạn nên là loạt và các điều khoản của bạn nên là loạt 1, loạt 2, v.v ... Với các tập tôi giả sử một loạt có nhiều tập để nó có thể sử dụng cùng một phân loại, "loạt" và nếu chúng được phân cấp thì tập 1, tập 2, v.v. sẽ có thuật ngữ phụ "sê-ri x". Sau đó, bạn có thể truy vấn toàn bộ một chuỗi theo thứ tự với các tập theo thứ tự mà chúng nên.
Chris_O

@Chris_O Tôi hiểu rồi, bạn có thể đang ở trên tiền đó! Vấn đề duy nhất tôi có thể thấy là việc phải lặp lại các thuật ngữ "Tập 1", "Tập 2" cho mỗi loạt. Cũng không thể nhóm tất cả các tập 1 không phụ thuộc vào bộ, nhưng tôi nghĩ có lẽ có một cách xung quanh nó. Cảm ơn bạn Chris_O
yeope

2
Thực tế, sử dụng phân loại cho các tập phim không có nhiều ý nghĩa, bởi vì việc phân nhóm là vô giá trị. Hãy suy nghĩ về điều này, nếu bạn có "tập 1" là một thuật ngữ, thì bạn đang nhóm tập 1 với mọi tập 1 khác từ mọi chương trình truyền hình khác. Số tập và số có ý nghĩa hơn là post_meta, vì chúng cụ thể cho chương trình cụ thể đó và không hữu ích như một nhóm. Tên của chương trình truyền hình sẽ hữu ích như một thuật ngữ trong phân loại chương trình truyền hình, bởi vì sau đó bạn sẽ nhóm lại toàn bộ chương trình.
Otto

1
Otto đã theo dõi điều này với một bài đăng trên blog thú vị: Khi nào (không) sử dụng Phân loại tùy chỉnh .
Jan Fabry

47

Câu trả lời được chấp nhận cho câu hỏi này là không thể chấp nhận được. Thật phi lý khi cho rằng đặt hàng bằng thuế "không có ý nghĩa". Câu trả lời anh đưa ra không có ý nghĩa.

Xem xét có một loại bài đăng thực đơn. Sau đó, bạn có thuế tùy chỉnh của "Thực phẩm loại". Thuế FoodC loại có các điều khoản "Bữa sáng", "Bữa trưa" và "Bữa tối". Nếu bạn gửi một truy vấn sử dụng param_query param, bây giờ bạn có một kết quả được đặt với tất cả các điều khoản, tuy nhiên chúng được sắp xếp theo ngày đăng.

Để có được thứ tự chính xác trong số này, liên quan đến các điều khoản của họ và sau đó hiển thị ở mặt trước một cách thích hợp bằng cách tách các bài đăng thành các danh mục khác nhau, bạn phải lặp qua tập kết quả, sau đó truy vấn từng bài đăng riêng lẻ trong kết quả được đặt để tìm các thuật ngữ của nó và so sánh với thuật ngữ hiện tại, lọc thành một mảng và tiếp tục xuyên suốt. Sau đó, bạn phải lặp lại qua mảng mới để hiển thị. Điều này không hiệu quả.

Sẽ thật tuyệt nếu WP có tùy chọn đặt hàng "tax__in" vì nó có tùy chọn "post__in", nhưng vì không có, bạn phải thực hiện quy trình lố bịch trên; tự mình tùy chỉnh truy vấn theo bộ lọc 'post_orderby' và bộ lọc 'post_join' để điều chỉnh phương thức đặt hàng và thêm thuật ngữ vào tập kết quả, tương ứng; hoặc bạn phải tạo một truy vấn mới cho mỗi thuật ngữ bạn đang lọc trong các phần html liên quan đến các thuật ngữ đó.

Hiệu quả nhất sẽ là thay đổi chuỗi truy vấn bằng các bộ lọc. Đơn giản nhất sẽ là làm ba truy vấn riêng biệt. API WP nên xử lý việc đặt hàng theo thuế hoặc bất kỳ tham số truy vấn hạn chế nào. Nếu bạn đang hạn chế một truy vấn dựa trên các điều kiện nhất định, có khả năng cao là nhiều người sẽ phải đặt hàng theo các điều kiện tương tự.


2
Xin lỗi nhưng bạn sai rồi. Đặt hàng theo phân loại cũng không có ý nghĩa gì trong trường hợp của bạn. Bạn muốn thể hiện điều gì? Tất cả các Bữa sáng trước, tiếp theo là tất cả các Bữa tối, sau đó là tất cả các Bữa trưa? Bạn nên chọn những gì bạn muốn và thứ tự mà bạn muốn nó, nhưng phân loại chỉ là một nhãn nhóm. Đó là "dữ liệu" không có ý nghĩa mà bạn nên đặt hàng trước. Nếu đúng như vậy, thì nó không nên là một thuật ngữ trong phân loại, thay vào đó bạn nên biến nó thành một meta-meta.
Otto

15
Tất nhiên, sẽ có một số trường hợp mà bạn sẽ muốn đặt hàng các bài đăng theo thuật ngữ phân loại. Một ví dụ khác là loại bài đăng Phim với phân loại Xếp hạng. Trong một danh sách các bộ phim, thật dễ dàng để tưởng tượng mọi người muốn đặt một danh sách các bộ phim theo xếp hạng để tất cả các phim được xếp hạng G, sau đó được xếp hạng PG, v.v. đều xuất hiện ở đầu. (Trong ví dụ này và ví dụ về bữa ăn, chúng có thể được đặt hàng bởi term_id thay vì tên.) -able
SeventhSteel 10/03/2015

2
Xếp hạng PG và G và đó là một lựa chọn phân loại tốt, ngoại trừ việc chúng là dữ liệu về các bộ phim cụ thể. Vì vậy, họ là meta. Chúng là dữ liệu, không phải danh mục. Chỉ có một số lượng lựa chọn hạn chế không phải là một nguyên tắc phân loại. Nếu nó cần sắp xếp theo, thì làm cho nó trở thành meta hoặc buộc sắp xếp theo phân loại thông qua mã cụ thể phân loại. BTW, NC17 đến sau PG. Vì vậy, bạn cần mã để thực hiện việc đặt hàng nào.
Otto

Tôi biết tôi đến bữa tiệc muộn với bình luận này, nhưng chỉ va vào điều này. Đặt hàng theo phân loại có thể có ý nghĩa trong một số tình huống. Chúng tôi có danh sách công việc trên một dự án dưới dạng bài đăng và sau đó là Bang và Thành phố, trong đó công việc là phân loại. Chúng tôi muốn họ có thể dễ dàng nhận được (hiển thị tất cả các công việc trong một tiểu bang hoặc hiển thị tất cả các công việc trong một thành phố) vì vậy phân loại học là giải pháp tốt nhất. Đồng thời có tìm kiếm công việc chung nơi chúng tôi muốn sắp xếp chúng theo tiêu đề, sau đó theo tiểu bang, sau đó theo thành phố.
Dennis Puzak

Một trường hợp sử dụng khác: Một khách hàng có một loạt các bài viết, mỗi bài viết có một thể loại. Khách hàng muốn có một trang liệt kê tất cả các bài viết, có thể được sắp xếp theo thứ tự abc, theo ngày hoặc theo thể loại. Danh mục cũng có thể được lọc, nhưng liệt kê tất cả các bài viết theo danh mục theo thứ tự bảng chữ cái không phải là một trường hợp sử dụng điên rồ và bạn thấy nó xuất hiện khá thường xuyên.
Wilson Bigss

15

Phải, nhưng nó khá liên quan ...

Thêm vào hàm.php trong chủ đề của bạn:

function orderby_tax_clauses( $clauses, $wp_query ) {
    global $wpdb;
    $taxonomies = get_taxonomies();
    foreach ($taxonomies as $taxonomy) {
        if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby'] ) {
            $clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
            $clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
            $clauses['groupby'] = "object_id";
            $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
            $clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
        }
    }
    return $clauses;
}

    add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );

Điều này được chứng minh từ một số thứ được tìm thấy và một số thứ tôi tự làm. Giải thích là khá khó khăn, nhưng điểm mấu chốt là với hoạt động này, bạn có thể đặt? Orderby = (truy vấn phân loại var) & order = ASC (hoặc DESC) và cô ấy sẽ bỏ đi ngay!


Cảm ơn bạn Drew, tôi sẽ thử và chạy SQL đó, cần chỉnh sửa một chút, nhưng nó có thể hoạt động. Vấn đề duy nhất của tôi bây giờ, là tôi có thể đang đi sai hướng như Otto đã chỉ. Cảm ơn bạn đã vẽ. EDIT- Không cần chỉnh sửa Tôi có thể thấy nơi cần chỉnh sửa :) Cảm ơn bạn
yeope

Nếu bạn lấy nó trong vòng hai phút cuối, nó sẽ không hoạt động, hãy tiếp tục và lấy nó ngay bây giờ, tôi đã sửa nó. Nó được đặt cho hai nguyên tắc phân loại cụ thể, tôi đã cải thiện mã để hoạt động trên tất cả các phân loại đã đăng ký.
Drew Gourley

cảm ơn bạn một lần nữa. Chỉ trong trường hợp tôi đã thử giải pháp của bạn và nó là loại công việc. Ngoài ra nếu người khác muốn sử dụng, bạn cần đổi add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );thành add_filter('posts_clauses', 'todo_tax_clauses', 10, 2 );Cảm ơn :)
yeope

Vâng, điều này hiện đã được sửa trong khối mã, tôi đã lấy nó từ một dự án tôi đang làm và quên thay đổi tên của hàm mặc dù tôi đã thay đổi nó trong hook.
Drew Gourley

1
Bạn có biết nếu có thể đặt hàng các nguyên tắc phân loại bằng ID thay vì tên không? Tôi đang cố gắng để có được kết quả tương tự khi đặt hàng các nhóm phân loại theo ID
Javier Villanueva

9

Tôi đến trò chơi muộn ở đây, nhưng có một cách đơn giản hơn WordPressy để làm điều này.

Xây dựng truy vấn thuế của bạn như bình thường.

$tax_query = array();
$tax_query['relation']="OR";
$tax_query[] = array(
    'taxonomy' => 'product_cat',
    'field'    => 'slug',
    'terms'    => $cat_terms,
);
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

Thiết lập đối số của bạn cho query_posts hoặc WP_Query

$args = array(
    'post_type'=>'post',
    'posts_per_page'=>12,
    'paged'=>$paged,
    'tax_query' => $tax_query,
);

Trước khi bạn thực hiện cuộc gọi query_posts / WP_Query, hãy móc vào bộ lọc theo thứ tự và ghi đè lên nó

add_filter('posts_orderby', 'edit_posts_orderby');
function edit_posts_orderby($orderby_statement) {
    $orderby_statement = " term_taxonomy_id ASC ";
    return $orderby_statement;
}
query_posts($args);
remove_filter('posts_orderby', 'edit_posts_orderby');

đừng quên xóa bộ lọc sau đó ...

điều này hoạt động b / c tax_query tạo ra các phép nối vv cho bạn, bạn chỉ cần đặt hàng theo một trong các trường từ liên kết.


2
Bất kỳ ý tưởng về cách đặt hàng theo tên thay vì term_taxonomy_id? thay đổi term_taxonomy_id trong orderby_statement sẽ gây ra lỗi
tehlivi

Đây là câu trả lời chính xác cho bất cứ ai quan tâm!
Mayra M

2

Chà, tôi muốn tiết lộ kinh nghiệm của mình trong việc sắp xếp các loại bài đăng tùy chỉnh theo danh mục / phân loại.

TRANG WEB

  1. Một trang web của công ty du lịch chạy trên WordPress
  2. Nội dung chính về loại bài đăng tùy chỉnh được gọi là 'ruta'
  3. Phân loại theo cấu trúc này Loại hình du lịch> lục địa> quốc gia

TRƯỜNG HỢP

Trong các trang danh sách danh mục lưu trữ, khách hàng muốn các bài đăng được sắp xếp theo

  1. Các lục địa, được sắp xếp theo số lượng tuyến đường trên mỗi một.
  2. Đất nước, được sắp xếp theo thứ tự abc.

CÁC BƯỚC

Đầu tiên , tôi bắt được yêu cầu từ truy vấn trang lưu trữ chưa sửa đổi xảy ra như sau:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE 1=1 
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) )
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 20

Thứ hai , tôi đã chỉnh sửa mã sql trong Sequel Pro dựa trên cơ sở dữ liệu để phù hợp với nhu cầu của tôi. Tôi đi ra với điều này (vâng, có lẽ nó có thể được cải thiện: kiến ​​thức của tôi về MySQL không nổi bật):

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id =  tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    ) AS Total
FROM  wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )
WHERE 1=1  
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) ) 
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY
total DESC,
wp_terms.name  

Thứ ba , tôi đã nối truy vấn trên tệp tin.php với ba bộ lọc: post_fields, Post_join và Post_orderby

Mã trong hàm.php:

function xc_query_fields( $fields ) {

   $fields = "wp_posts.ID, wp_posts.post_title, wp_terms.name, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id = tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    )
    AS Total";
     return $fields;
}


function xc_query_joins( $join ) {
$join .= "INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
   INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
   INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )";
 return $join;
}


function xc_query_orderby( $join ) {
    $join = "total DESC, wp_terms.name ";
    return $join;
 }

Cuối cùng, tôi đã kích hoạt các bộ lọc từ hook pre_get_post theo một số điều kiện

function filtra_queries( $query )
{

  if (  is_archive()  && $query->is_main_query() && !is_admin()  ) {

$rutes = array('viajes-privados', 'asia', 'africa', 'oceania', 'america', 'oriente-proximo');

if  ( in_array( $query->get('category_name'), $rutes ) ) 
  {
  add_filter( 'posts_fields', 'xc_query_fields' );
  add_filter( 'posts_join', 'xc_query_joins' );
  add_filter( 'posts_orderby', 'xc_query_orderby' );
}// end if in_array

  }// end if is_archive

}
 add_filter('pre_get_posts', 'filtra_queries');

Hy vọng điều này có thể giúp ai đó


Công việc tốt, nực cười là lấy số lượng mã này để sắp xếp một cái gì đó theo phân loại. Vấn đề lớn với WP.
huyết thanh

2

Tôi đã có một vấn đề tương tự mà tôi đã giải quyết: Tôi muốn đặt một kho lưu trữ bài loại tùy chỉnh (bài báo trên tạp chí) bởi một phân loại tùy chỉnh (các vấn đề). Tôi không bao giờ thực hiện các truy vấn SQL trực tiếp trên trang web của mình - và thông thường nếu bạn giống như những câu trả lời khác - bạn cần suy nghĩ lại về cách tiếp cận của mình.

CÁC VẤN ĐỀ:

1) Wordpress không cho phép bạn đặt hàng các nguyên tắc phân loại theo bất kỳ cách thông minh nào.

2) Wordpress chỉ không cho phép orderbysử dụng các nguyên tắc phân loại trên WP_Query sau loại (như được phát âm bởi Otto).

CÁC GIẢI PHÁP:

1) Sắp xếp các nguyên tắc phân loại được hoàn thành tốt nhất bằng plugin NE Order Taxonomy Order Order vào lúc này. Nó cho phép bạn đặt hàng phân loại thông qua WYSIWYG, trong wp-adminđó không phải là cách tôi sẽ làm nhưng tôi không tìm thấy gì tốt hơn.

Khi bạn thiết lập plugin, bạn sẽ nhận được một cái gì đó tương tự như những gì tôi đã làm ở đây. Ghi chú của tùy chọn Auto-sort Queries of this Taxonomy- đặt cái này thành Custom Order as Defined Above; Điều này giúp bạn có được thứ tự bạn cần. Ảnh chụp màn hình:

Hiển thị đơn hàng phân loại tùy chỉnh NE

2) Với một phân loại được sắp xếp sẵn, giờ đây bạn có thể tạo một loạt các lệnh gọi WP_Query chạy qua từng thuật ngữ, tạo hiệu quả một kho lưu trữ theo phân loại. Sử dụng get_terms()để tạo một mảng của tất cả các điều khoản thuế, sau đó chạy foreachqua từng điều khoản. Điều này tạo ra một WP_Querymục cho mỗi thuật ngữ sẽ trả về tất cả các bài đăng cho một thuật ngữ nhất định, tạo hiệu quả một kho lưu trữ theo thứ tự phân loại. Mã để thực hiện điều này:

  // Get your terms and put them into an array
  $issue_terms = get_terms([
    'taxonomy' => 'issues',
    'hide_empty' => false,
  ]);

  // Run foreach over each term to setup query and display for posts
  foreach ($issue_terms as $issue_term) {
    $the_query = new WP_Query( array(
      'post_type' => 'post',
      'tax_query' => array(
        array(
          'taxonomy' => 'issues',
          'field' => 'slug',
          'terms' => array( $issue_term->slug ),
          'operator' => 'IN'
        )
      )
    ) );

    // Run loop over each query
    while($the_query->have_posts()) :
      $the_query->the_post();

      // YOUR TEMPLATE OUTPUT FOR EACH POST

    endwhile;
  }

Đọc liên quan trên trang web này: Hiển thị tất cả các bài đăng trong một loại bài đăng tùy chỉnh, được nhóm theo phân loại tùy chỉnh


2

Tôi không chắc tại sao tất cả các giải pháp ở đây lại quá mức cần thiết. OK, cách đây nửa thập kỷ, nhưng hiện tại tôi chỉ đang chạy đoạn mã sau và nó hoạt động:

   <?php // Default
    $wheels_args = array(
        'post_type' => 'wheels',
        'posts_per_page' => '96',
        'orderby' => 'taxonomy, name', // Just enter 2 parameters here, seprated by comma
        'order'=>'ASC'
    );
    $loop = new WP_Query($wheels_args);
    ?>

Điều này sẽ sắp xếp các nguyên tắc phân loại CPT của bạn trước tiên bằng cách phân loại theo thứ tự bảng chữ cái và trong các nhóm phân loại này theo thứ tự bảng chữ cái.


@yeope Tại sao đây là câu trả lời được chấp nhận!? cảm ơn chúa tôi đã cuộn
Juan Solano

1

Đây là giải pháp tôi đã sử dụng cho vấn đề đặc biệt này. Giải pháp này dành cho các trường hợp cực đoan khi cả hai đều không thể sử dụng pre_get_postsbộ lọc và có phân trang hiện có trên truy vấn (ví dụ: WooC Commerce):

global $wpdb;

$taxonomies = array('my-tax-1', 'my-tax-2', 'my-tax-3');

$orderby = "'".implode("', '", array_keys($taxonomies))."'";
$id_sql = $GLOBALS['wp_query']->request;

$id_sql = preg_replace('/LIMIT\s+\d+\s?,?\s\d*/', '', $id_sql);
$id_sql = str_replace('SQL_CALC_FOUND_ROWS', '', $id_sql);

$term_sql = "SELECT
  tt.taxonomy AS `taxonomy`,
  t.name AS `term_name`,
  t.slug AS `term_slug`,
  count(*) AS `term_count`
FROM ({$id_sql}) p 
JOIN wp_term_relationships tr
  ON p.ID = tr.object_id
JOIN wp_term_taxonomy tt
  ON tr.term_taxonomy_id = tt.term_taxonomy_id
JOIN wp_terms t
  ON tt.term_id = t.term_id
WHERE tt.taxonomy IN ({$orderby})
GROUP BY t.slug
ORDER BY
  FIELD(tt.taxonomy, {$orderby})"; // Add further specific ordering here

$results = $wpdb->get_results($term_sql, ARRAY_A);

Tôi đã sử dụng điều này để tạo một menu điều hướng theo thứ tự phân loại, thuật ngữ và số lượng bài đăng mỗi kỳ.

Nếu bạn chỉ muốn bài viết thì hãy thay đổi truy vấn thành SELECT p.*GROUP BY p.ID


0

Nó giống như một truy vấn trước truy vấn, nhưng sẽ không phiền nếu chúng ta không truy vấn quá nhiều bài viết ... Ý tưởng là sửa đổi truy vấn chính vì vậy chúng ta thậm chí không cần phải đi đến các mẫu và tạo các truy vấn mới và vòng lặp ...

function grouped_by_taxonomy_main_query( $query ) {

    if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage

        $post_ids = array();

        $terms = get_terms('my_custom_taxonomy');

        foreach ( $terms as $term ) {
            $post_ids = array_merge( $post_ids, get_posts( array( 
                'posts_per_page' => 4, // as you wish...
                'post_type' => 'my_custom_post_type', // If needed... Default is posts
                'fields' => 'ids', // we only want the ids to use later in 'post__in'
                'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, )))) // getting posts in the current term
            );
        }

        $query->query_vars['post_type'] = 'my_custom_post_type'; // Again, if needed... Default is posts
        $query->query_vars['posts_per_page'] = 16; // If needed...
        $query->query_vars['post__in'] = $post_ids; // Filtering with the post ids we've obtained above
        $query->query_vars['orderby'] = 'post__in'; // Here we keep the order we generated in the terms loop
        $query->query_vars['ignore_sticky_posts'] = 1; // If you dont want your sticky posts to change the order

    }
}

// Hook my above function to the pre_get_posts action
add_action( 'pre_get_posts', 'grouped_by_taxonomy_main_query' );
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.