แสดงโพสต์ทั้งหมดในประเภทโพสต์ที่กำหนดเองจัดกลุ่มตามอนุกรมวิธานที่กำหนดเอง


18

ฉันกำลังทำงานในหน้าสมาชิกที่ฉันใช้ประเภทโพสต์ที่กำหนดเองกับ taxonomy ที่กำหนดเอง ฉันประเภทโพสต์ที่กำหนดเองที่เรียกว่าและอนุกรมวิธานของฉันเองที่เรียกว่าmembermember_groups

ฉันต้องการแสดงรายการสมาชิกทั้งหมด แต่จัดกลุ่มเข้าด้วยกันเป็นกลุ่มตามลำดับ

เพื่อให้ชัดเจนฉันมีสมาชิก 35 คนแบ่งออกเป็น 9 กลุ่ม - ดังนั้นแทนที่จะทำแบบสอบถามเดียวกันเก้าครั้งที่ฉันต้องการทำเพียงครั้งเดียว แต่รวมกลุ่มเข้าด้วยกันเพื่อให้ Member1, Member4 และสมาชิก 11 รวมกลุ่มกันในกลุ่มเดียว เรียกว่า "การตลาด"

ฉันใช้WP_Queryเพื่อดึงโพสต์ทั้งหมดภายใต้สมาชิกประเภทโพสต์ ฉันได้ลองแล้ว แต่ก็ไม่ประสบความสำเร็จ

ฉันจะบรรลุสิ่งนั้นได้อย่างไร

คำตอบ:


29

ดังนั้นคุณอาจพิจารณาการค้นหาหลายรายการโดยอัตโนมัติ

ขั้นแรกรับรายการเงื่อนไขในอนุกรมวิธานที่กำหนดเองของคุณโดยใช้get_terms():

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

จากนั้นวนซ้ำแต่ละแบบสอบถามเรียกใช้แบบสอบถามใหม่ในแต่ละครั้ง:

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

ฉันไม่เห็นอะไรผิดปกติโดยเฉพาะอย่างยิ่งกับวิธีการนี้ถึงแม้ว่ามันอาจมีความสามารถ จำกัด ในการขยายขนาด (เช่นถ้าคุณมีสมาชิกเป็นร้อยหรือพันหรือสมาชิก member_group คุณอาจเห็นปัญหาด้านประสิทธิภาพ)


ใช่มันเป็นคำที่สมบูรณ์แบบปัญหาเดียวที่ฉันมีฉันต้องการแสดงเขตข้อมูล cutom เช่น <? php get_post_meta ($ member_group_term-> ID, 'job_title', จริง);?> แต่มันไม่ได้ผล > ID แต่ไม่ทำงานไม่ได้คุณช่วย @Chip Bennett ได้ไหม
Anahit DEV

6

ฉันพบวิธีแก้ปัญหาโดยใช้แบบสอบถามที่กำหนดเองแล้วจัดกลุ่มด้วยชื่อคำ:

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'

จากนั้นเพียงแค่ใช้แบบสอบถาม foreach ปกติฉันสามารถดึงข้อมูลที่ฉันต้องการ

แต่ฉันยังคงสนใจในวิธีอื่นถ้ามีอาจโดยใช้ฟังก์ชันของ Wordpress


ฉันเพิ่งเพิ่มวิธีอื่น ฉันมักจะอายจากสิ่งที่ต้องใช้แบบสอบถาม SQL ดิบ
Chip Bennett

2
ฉันดีใจที่เห็นว่านี่เป็นคำตอบที่ถูกต้องแม้ว่าคิวรีจะหยุดทำงานใน wordpress หากสคีมามีการเปลี่ยนแปลงในบางจุด ... แนวคิดของการรวบรวมพวกเขาทั้งหมดในแบบสอบถามเดียวคือคำตอบที่ถูกต้อง ทำซ้ำเพื่อจัดกลุ่ม taxonomies ใน php เคยชินขนาดเกือบจะเช่นนี้
wowo_999

4

ง่ายยิ่งขึ้น:

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

ภายในอาร์เรย์โพสต์ $ ผลลัพธ์แต่ละคำศัพท์ด้านภาษีเป็นกุญแจสำคัญในอาร์เรย์ที่ซ้อนกันที่มีการโพสต์


4

ฉันมีความต้องการที่แน่นอนและโซลูชันของ Chipทำงานได้ยกเว้นสิ่งหนึ่ง: '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 ?>

ฉันต้องการจอแสดงผลที่ได้ก็จะแบนดังนั้นจึง'get' => 'all'ตั้งไว้ที่นี่

หวังว่านี่จะช่วยคนอื่นได้


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

จากนั้นเมื่อคุณวนลูปผ่านแบบสอบถามนี้คุณสามารถใช้ if ตามบรรทัดเหล่านี้ (ใน 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>

ฉันหวังว่าจะช่วย ฉันคิดว่าคุณกำลังทำให้สิ่งนี้ซับซ้อนเกินกว่าที่จะเป็น

ข้อมูลเพิ่มเติม: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters


3

ฉันต้องทำสิ่งนี้ในโครงการเมื่อหลายปีก่อน คำตอบคล้ายกับ djb เพียงมีรายละเอียดเพิ่มเติมเล็กน้อย สิ่งนี้จะส่งออกชื่อ taxonomy ทั้งหมดของคุณเป็น h3 โดยมีสัญลักษณ์แสดงหัวข้อย่อยของแต่ละชื่อโพสต์ที่เชื่อมโยงกับหน้ารายละเอียด

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

มันเป็นเรื่องเก่า แต่ถ้ามีคนผ่านไปอย่างที่ฉันทำนี่อาจช่วยได้ แนวคิดคือการแก้ไขคิวรีหลักดังนั้นเราไม่จำเป็นต้องไปที่เทมเพลตและสร้างคิวรีและลูปใหม่ ...

PS: ยังไม่ได้รับการทดสอบใน dbs ขนาดใหญ่ เป็นที่น่าพอใจในกรณีของฉัน

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' );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.