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

https://www.it-swarm-vi.tech/vi/custom-post-types/hien-thi-tat-ca-cac-bai-dang-trong-mot-loai-bai-tuy-chinh-duoc-nhom-theo-phan-loai-tuy-chinh/956791654/

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.

Làm thế nào tôi có thể đạt được điều đó?custom-post-typescustom-taxonomywp-queryloop 164 thg 11, 2011Mestika

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() :

<?php
$member_group_terms = get_terms( 'member_group' );
?>

Sau đó, lặp qua từng cái, chạy một truy vấn mới mỗi lần:

<?php
foreach ( $member_group_terms as $member_group_term ) {
    $member_group_query = new WP_Query( array(
        'post_type' => 'member',
        'tax_query' => array(
            array(
                'taxonomy' => 'member_group',
                'field' => 'slug',
                'terms' => array( $member_group_term->slug ),
                'operator' => 'IN'
            )
        )
    ) );
    ?>
    <h2><?php echo $member_group_term->name; ?></h2>
    <ul>
    <?php
    if ( $member_group_query->have_posts() ) : while ( $member_group_query->have_posts() ) : $member_group_query->the_post(); ?>
        <li><?php echo the_title(); ?></li>
    <?php endwhile; endif; ?>
    </ul>
    <?php
    // Reset things, for good measure
    $member_group_query = null;
    wp_reset_postdata();
}
?>

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

thậm chí đơn giản hơn:

$terms = get_terms('tax_name');
$posts = array();
foreach ( $terms as $term ) {
    $posts[$term->name] = get_posts(array( 'posts_per_page' => -1, 'post_type' => 'post_type', 'tax_name' => $term->name ));
}

Trong mảng $ bài viết kết quả, mỗi thuật ngữ thuế là chìa khóa cho một mảng lồng nhau chứa các bài đăng của nó. 44 thg 4, 2012djb

Tôi đã có nhu cầu chính xác này và Giải pháp của Chip đã hoạt động, ngoại trừ một điều: bắt buộc phải có 'field' => 'slug'.

    foreach ( $service_categories as $category ) {
        $services = new WP_Query( 
            array(
                'post_type'     => 'service',
                'tax_query'     => array(
                    array(
                        'taxonomy'  => 'service_category',
                        'terms'     => array( $category->slug ),
                        'operator'  => 'IN',
                        'get'       => 'all',
                        'field'     => 'slug'
                    )
                )
            ) 
        ); ?>
        <h2><?php echo $category->slug; ?></h2>
        <?php if ( $services->have_posts() ) {  // loop stuff goes here ?>

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

311 thg 2, 201561Pixels

$query = new WP_Query( 
   array ( 
      'post_type' => 'member', 
      'orderby'   => 'meta_value', 
      'meta_key'  => 'member_group' 
   ) 
);

Sau đó, khi bạn lặp qua truy vấn này, bạn chỉ có thể sử dụng một if dọc theo các dòng này (trong mã giả php)

$groupName = "";
$counter = 0;
if havePosts: while havePosts: thePost

if( $groupName != post->meta_value )
{
if ($counter > 0)
{
</ul>
}
<h1>A group name</h1>
<ul>
<li>member name</li>
}
else
{
<li>member name</li>
}

endwhile;endif

</ul>

Tôi hy vọng điều đó sẽ giúp. Tôi nghĩ rằng bạn đã làm cho điều này phức tạp hơn nhiều so với nó cần phải được.

Thêm thông tin: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameter 35 thg 11, 2011AKnox

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

Last updated