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


18

Tôi đang 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 tùy chỉnh của tôi được gọi membervà phân loại tùy chỉnh của tôi được gọi 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 có 35 thành viên được chia 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 đang sử dụng WP_Queryđể truy xuất tất cả các bài viết dưới loại thành viên bài. 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 đó?

Câu trả lời:


29

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 nhóm, bạn có thể thấy các vấn đề về hiệu suất).


Vâng, nó hoạt động hoàn hảo. Chỉ có một vấn đề tôi có. Tôi muốn hiển thị các trường cutom như thế này <? Php get_post_meta ($ Member_group_term-> ID, 'job_title', true);?> Nhưng nó không hoạt động. Tôi cũng đã thử với $ post- > ID nhưng không hoạt động didnbt, bạn có thể giúp @Chip Bennett không?
Anahit DEV

6

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.


Tôi vừa mới thêm một phương pháp thay thế. Tôi có xu hướng né tránh mọi thứ đòi hỏi các truy vấn SQL thô.
Chip Bennett

2
Tôi rất vui khi thấy điều này được đánh dấu là câu trả lời đúng, ngay cả khi truy vấn ngừng hoạt động trong wordpress nếu lược đồ thay đổi tại một số điểm ... Khái niệm thu thập tất cả chúng trong một truy vấn là câu trả lời đúng. Lặp lại để nhóm các nguyên tắc phân loại trong php sẽ không mở rộng gần như điều này sẽ.
wowo_999

4

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ó.


4

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: 'field' => 'slug'là bắt buộc.

    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.


3
$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


3

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

1

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 các 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' );
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.