Tüm gönderileri özel bir sınıflandırma ile gruplandırılmış özel bir gönderi türünde görüntüle


18

Özel bir sınıflandırma ile özel bir yazı türü kullandığım bir üye sayfasında çalışıyorum. Özel gönderi membertürüm ve özel sınıflandırmam denir member_groups.

Tüm üyeleri listelemek, ancak kendi gruplarında gruplandırmak istiyorum.

Açık olmak gerekirse, 35 üyem 9 gruba ayrıldım - bu yüzden aynı sorguyu dokuz kez yapmak yerine bir kez yapmak ama onları birlikte gruplamak istiyorum, böylece Üye1, Üye4 ve Üye 11 bir grupta birlikte gruplanıyor, "Pazarlama".

Ben WP_Queryyazı tipi üye altında tüm mesajları almak için kullanıyorum . Farklı denemeler denedim ama başarılı sonuç alınamadı.

Bunu nasıl başarabilirim?

Yanıtlar:


29

Bu nedenle, birden çok sorguyu otomatikleştirmeyi düşünebilirsiniz.

İlk olarak, aşağıdakileri kullanarak özel sınıflandırmanızdaki terimlerin listesini alın get_terms():

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

Ardından, her seferinde yeni bir sorgu çalıştırarak her biri arasında gezinin:

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

Bu yaklaşımla özellikle yanlış bir şey göremiyorum , ancak sınırlı bir yetenek yeteneğine sahip olabilir (yani yüzlerce veya binlerce üyeniz veya üye_grubu terimleriniz varsa, performans sorunları görebilirsiniz).


Evet mükemmel bir şekilde wordks.Yalnızca bir sorun var.Bu gibi cutom alanları görüntülemek istiyorum <? Php get_post_meta ($ member_group_term-> ID, 'job_title', true);?> Ama işe yaramadı. $ Post- > Kimlik ama işe yaramadı, @Chip Bennett'e yardım eder misin lütfen?
Anahit DEV

6

Özel bir sorgu kullanarak ve daha sonra terim adı ile gruplandırma kullanarak bir çözüm buldum:

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'

Sonra sadece düzenli bir foreach sorgusu kullanarak sadece istediğim bilgileri ayıklayabilirsiniz.

Ama yine de, belki de Wordpress'in kendi işlevlerini kullanarak başka bir yolla ilgileniyorum.


Az önce alternatif bir yöntem ekledim. Ben ham SQL sorguları gerektiren bir şey uzak utangaç eğilimindedir.
Chip Bennett

2
Şema bir noktada değişiyorsa, sorgu wordpress'te çalışmayı durdursa bile, bu doğru yanıt olarak işaretlenmiş görmekten memnunum ... Hepsini tek bir sorguda toplama kavramı doğru cevaptır. Taksonomileri php ölçeğinde gruplamak için yineleme neredeyse aynı olacaktır.
wowo_999

4

daha da basit:

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

Sonuçta elde edilen $ posts dizisi içinde, her vergi terimi, yazılarını içeren iç içe bir dizinin anahtarıdır.


4

Tam ihtiyacım vardı ve Chip'in çözümü bir şey dışında çalıştı: 'field' => 'slug'gerekli.

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

Ayrıca ortaya çıkan ekranın düz olması gerekiyordu, bu yüzden 'get' => 'all'burada ayarlanır.

Umarım bu başka birine yardım eder.


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

Sonra bu sorgu üzerinden döngü zaman sadece bu satırlar boyunca bir if kullanabilirsiniz (php sözde kodu)

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

Umarım bu yardımcı olur. Bence bunu olması gerekenden çok daha karmaşık hale getirmiştiniz.

Daha fazla bilgi: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters


3

Bunu yıllar önce bir projede yapmak zorunda kaldım. Djb'ye benzer cevap, sadece biraz daha ayrıntı ile. Bu, tüm sınıflandırma adlarınızı bir h3 olarak çıktılar ve ayrıntı sayfalarına bağlı her yazı başlığının madde işaretli bir listesini içerir.

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

Eski bir iplik, ama birisi benim yaptığım gibi geçerse, bu yardımcı olabilir. Fikir, ana sorguyu değiştirmek, böylece şablonlara gitmemize ve yeni sorgular ve döngüler oluşturmamıza gerek yok ...

PS: Henüz büyük dbs test edilmedi. Benim durumumda tatmin ediciydi.

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' );
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.