Tampilkan semua posting dalam jenis posting khusus, dikelompokkan berdasarkan taksonomi khusus

18

Saya sedang mengerjakan halaman anggota tempat saya menggunakan jenis posting khusus dengan taksonomi khusus. Jenis pos kustom saya disebut memberdan taksonomi kustom saya disebut member_groups.

Saya ingin membuat daftar semua anggota tetapi mengelompokkan mereka menjadi kelompok masing-masing.

Jadi untuk lebih jelasnya, saya memiliki 35 anggota yang dibagi menjadi 9 kelompok - jadi alih-alih membuat kueri yang sama sembilan kali saya ingin melakukannya sekali tetapi kelompokkan mereka bersama-sama, sehingga Anggota1, Anggota4 dan Anggota 11 dikelompokkan bersama dalam satu kelompok, disebut "Pemasaran".

Saya menggunakan WP_Queryuntuk mengambil semua posting di bawah anggota tipe posting. Saya sudah mencoba berbagai upaya tetapi tanpa hasil yang sukses.

Bagaimana saya bisa mencapainya?

Mestika
sumber

Jawaban:

29

Jadi, Anda dapat mempertimbangkan untuk mengotomatiskan beberapa kueri.

Pertama, dapatkan daftar istilah dalam taksonomi khusus Anda, menggunakan get_terms():

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

Lalu, lewati masing-masing, jalankan kueri baru setiap kali:

<?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();
}
?>

Saya tidak dapat melihat ada yang salah dengan pendekatan ini, meskipun mungkin memiliki kemampuan terbatas untuk skala (yaitu jika Anda memiliki ratusan atau ribuan anggota, atau istilah member_group, Anda mungkin melihat masalah kinerja).

Chip Bennett
sumber
Ya itu wordks sempurna. Hanya satu masalah yang saya miliki. Saya ingin menampilkan bidang cutom seperti ini <? Php get_post_meta ($ member_group_term-> ID, 'job_title', true);?> Tetapi tidak berhasil. Saya juga mencoba dengan $ post- > ID tetapi tidak berhasil, bisakah Anda membantu @Chip Bennett?
Anahit DEV
6

Saya menemukan solusi dengan menggunakan kueri khusus dan kemudian mengelompokkannya dengan nama istilah:

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'

Kemudian dengan hanya menggunakan kueri foreach biasa saya bisa mengekstrak informasi yang saya inginkan.

Tapi saya masih tertarik dengan cara lain jika ada, mungkin dengan menggunakan fungsi Wordpress sendiri.

Mestika
sumber
Saya baru saja menambahkan metode alternatif. Saya cenderung menghindar dari apa pun yang membutuhkan query SQL mentah.
Chip Bennett
2
Saya senang melihat ini ditandai sebagai jawaban yang benar, bahkan jika kueri berhenti bekerja di wordpress jika skema berubah di beberapa titik ... Konsep mengumpulkan semuanya dalam satu permintaan adalah jawaban yang benar. Iterasi untuk mengelompokkan taksonomi dalam skala php hampir tidak akan sebaik ini.
wowo_999
4

lebih sederhana:

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

Di dalam array $ kiriman yang dihasilkan, setiap istilah pajak adalah kunci untuk array bersarang yang berisi kirimannya.

djb
sumber
4

Saya memiliki kebutuhan yang tepat ini, dan solusi Chip bekerja, kecuali untuk satu hal: 'field' => 'slug'diperlukan.

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

Saya juga membutuhkan tampilan yang dihasilkan datar, jadi 'get' => 'all'sudah diatur di sini.

Semoga ini bisa membantu orang lain keluar.

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

Kemudian ketika Anda mengulangi query ini, Anda bisa menggunakan if di sepanjang baris ini (dalam php pseudocode)

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

Saya harap itu membantu. Saya pikir Anda membuat ini jauh lebih rumit daripada yang seharusnya.

Informasi lebih lanjut: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

AKnox
sumber
3

Saya harus melakukan ini pada proyek bertahun-tahun yang lalu. Jawaban yang mirip dengan djb, hanya dengan sedikit lebih detail. Ini akan menampilkan semua nama taksonomi Anda sebagai h3, dengan daftar bullet dari setiap judul posting yang terhubung ke halaman detailnya.

<?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; ?>
61Pixels
sumber
1

Ya, itu utas lama, tetapi jika seseorang lewat seperti saya, ini mungkin membantu. Idenya adalah mengubah kueri utama sehingga kita tidak perlu membuka templat dan menghasilkan kueri dan loop baru ...

PS: Belum diuji dalam db besar. Itu memuaskan dalam kasus saya.

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' );
Marcelo Viana
sumber