Hiển thị tất cả các bài đăng trong một loại bài tùy chỉnh, được nhóm theo phân loại tùy chỉnh
Tôi làm việc trên một trang thành viên nơi tôi sử dụng loại bài đăng tùy chỉnh với phân loại tùy chỉnh. Loại bài đăng tùy chỉnh của tôi được gọi là member và phân loại tùy chỉnh của tôi được gọi là member_groups.
Tôi muốn liệt kê tất cả các thành viên nhưng nhóm chúng lại thành các nhóm tương ứng.
Vì vậy, để rõ ràng, tôi đã chia thành 35 nhóm thành 9 nhóm - vì vậy thay vì thực hiện cùng một truy vấn chín lần tôi muốn thực hiện một lần nhưng nhóm chúng lại với nhau, để Thành viên1, Thành viên4 và Thành viên 11 được nhóm lại thành một nhóm, được gọi là Marketing Marketing.
Tôi sử dụng WP_Query để lấy tất cả các bài đăng dưới dạng thành viên. Tôi đã thử nhiều cách khác nhau nhưng không có kết quả thành công.
Tôi đã tìm thấy một giải pháp bằng cách sử dụng một truy vấn tùy chỉnh và sau đó nhóm nó với tên thuật ngữ:
SELECT *
FROM wp_term_taxonomy AS cat_term_taxonomy
INNER JOIN wp_terms AS cat_terms ON cat_term_taxonomy.term_id = cat_terms.term_id
INNER JOIN wp_term_relationships AS cat_term_relationships ON cat_term_taxonomy.term_taxonomy_id = cat_term_relationships.term_taxonomy_id
INNER JOIN wp_posts AS cat_posts ON cat_term_relationships.object_id = cat_posts.ID
INNER JOIN wp_postmeta AS meta ON cat_posts.ID = meta.post_id
WHERE cat_posts.post_status = 'publish'
AND meta.meta_key = 'active'
AND meta.meta_value = 'active'
AND cat_posts.post_type = 'member'
AND cat_term_taxonomy.taxonomy = 'member_groups'
Sau đó, chỉ bằng cách sử dụng truy vấn foreach thông thường, tôi có thể trích xuất thông tin tôi muốn.
Nhưng tôi vẫn quan tâm đến một cách khác nếu có, có thể bằng cách sử dụng các chức năng riêng của Wordpress. 64 thg 11, 2011Mestika
Vì vậy, bạn có thể xem xét tự động hóa nhiều truy vấn.
Trước tiên, hãy lấy danh sách các thuật ngữ trong phân loại tùy chỉnh của bạn, sử dụng get_terms() :
Tôi không thể thấy bất cứ điều gì đặc biệt sai với cách tiếp cận này, mặc dù nó có thể có khả năng mở rộng hạn chế (nghĩa là nếu bạn có hàng trăm hoặc hàng ngàn thành viên, hoặc các điều khoản của thành viên, bạn có thể thấy các vấn đề về hiệu suất). 2725 thg 1, 2012Chip Bennett
Tôi cũng cần màn hình hiển thị kết quả là phẳng, vì vậy 'get' => 'all' được đặt ở đây.
Hy vọng điều này sẽ giúp người khác ra ngoài. 424 thg 1, 2013bigsweater
Tôi đã phải làm điều này trên một dự án nhiều năm trước. Câu trả lời tương tự với djb, chỉ với một chút chi tiết. Điều này sẽ xuất ra tất cả các tên phân loại của bạn dưới dạng h3, với một danh sách gạch đầu dòng của mỗi tiêu đề bài được liên kết với trang chi tiết của chúng.
<?php // Output all Taxonomies names with their respective items
$terms = get_terms('member_groups');
foreach( $terms as $term ):
?>
<h3><?php echo $term->name; // Print the term name ?></h3>
<ul>
<?php
$posts = get_posts(array(
'post_type' => 'member',
'taxonomy' => $term->taxonomy,
'term' => $term->slug,
'nopaging' => true, // to show all posts in this taxonomy, could also use 'numberposts' => -1 instead
));
foreach($posts as $post): // begin cycle through posts of this taxonmy
setup_postdata($post); //set up post data for use in the loop (enables the_title(), etc without specifying a post ID)
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>
<?php endforeach; ?>
Chà, đó là một chủ đề cũ, nhưng nếu ai đó đi ngang qua tôi, điều này có thể giúp ích. Ý tưởng là sửa đổi truy vấn chính vì vậy chúng tôi không cần phải đi mẫu và tạo các truy vấn và vòng lặp mới ...
PS: Chưa được thử nghiệm trong dbs lớn. Đó là thỏa đáng trong trường hợp của tôi.
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' );