問題描述

我在一個會員頁面上,我使用自定義帖子型別與自定義分類法。我的自定義帖子型別稱為 member,我的自定義分類法稱為 member_groups

我想列出所有成員,但將它們組合在一起成為他們各自的組。

所以要清楚,我有 35 個成員分為 9 組 – 所以我不想做同樣的查詢九次,我想做一次,但將它們組合在一起,使 Member1,Member4 和 Member 11 組合在一起,稱為 「Marketing」 。

我正在使用 WP_Query 檢索帖子型別成員下的所有帖子。我嘗試了不同的嘗試,但沒有成功的結果。

我該如何實現呢?

最佳解決方案

因此,您可能會考慮自動執行多個查詢。

首先,讓您的自定義分類術語列表,使用 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 術語,你可能會看到效能問題) 。

次佳解決方案

我透過使用自定義查詢找到一個解決方案,然後將其與術語名稱進行分組:

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 自己的功能。

第三種解決方案

更簡單:

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

在所得到的 $ posts 陣列中,每個稅項是包含其帖子的巢狀陣列的關鍵。

第四種方案

我有這個確切的需要,Chip’s solution 工作,除了一件事:'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'設定在這裡。

希望這可以幫助別人。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。