Wordpress — таксономия, используемая для нескольких типов сообщений — как получить_terms/get_categories только для одного?

Я зарегистрировал таксономии для нескольких типов сообщений, думая, что это лучший способ настроить сайт, а не дублировать одни и те же таксономии.

Однако теперь я столкнулся с проблемой, когда мне нужно перечислить используемые таксономии для типа записи, но его перечисление таксономий для всех обоих типов. Как я могу решить эту проблему? Ни у get_categories, ни у get_terms нет возможности указать, для какого типа поста вы хотите получить таксономию.

РЕДАКТИРОВАТЬ ПРИМЕЧАНИЕ. Каждый тип записи также имеет несколько таксономий.

Кто-нибудь может помочь?

register_taxonomy( 
        'sectors',
        array('case-study', 'resource'),   //used in multiple post types
        [
            'labels' => [
                'name' => __( 'Sectors' ),
                'singular_name' => __( 'Sector' ),
            ],
            'hierarchical' => true,
            'show_admin_column' => true,
        ]
    );

    $sectors = get_categories( array('taxonomy' => 'sectors') );  //prints out selected taxonomies for both case studies and resources when I want just resources.

   $services = get_categories( array('taxonomy' => 'services') );  

person LeeTee    schedule 09.04.2018    source источник
comment
Я думаю, это могло бы помочь: заголовок wordpress.stackexchange.com/questions/96444/   -  person Alexis Vandepitte    schedule 09.04.2018
comment
Это не работает для меня, может быть, потому что он был построен с учетом одной категории для каждого типа сообщений, когда у меня было несколько категорий?   -  person LeeTee    schedule 09.04.2018


Ответы (3)


Попробуй это

<?php

     $custom_terms = get_terms('custom_taxonomy_name');

foreach($custom_terms as $custom_term) {
    wp_reset_query();
    $args = array('post_type' => 'custom_post_type_name',
        'tax_query' => array(
            array(
                'taxonomy' => 'custom_taxonomy_name',
                'field' => 'slug',
                'terms' => $custom_term->slug,
            ),
        ),
     );

     $loop = new WP_Query($args);
     if($loop->have_posts()) {
        echo '<h2>'.$custom_term->name.'</h2>';

        while($loop->have_posts()) : $loop->the_post();
            echo '<a href="'.get_permalink().'">'.get_the_title().'</a><br>';
        endwhile;
     }
}
?>
person Nitesh Gour    schedule 09.04.2018

Я нашел следующий код, который работает как шарм :)

function df_terms_clauses( $clauses, $taxonomy, $args ) {
    if ( isset( $args['post_type'] ) && ! empty( $args['post_type'] ) && $args['fields'] !== 'count' ) {
        global $wpdb;

        $post_types = array();

        if ( is_array( $args['post_type'] ) ) {
            foreach ( $args['post_type'] as $cpt ) {
                $post_types[] = "'" . $cpt . "'";
            }
        } else {
            $post_types[] = "'" . $args['post_type'] . "'";
        }

        if ( ! empty( $post_types ) ) {
            $clauses['fields'] = 'DISTINCT ' . str_replace( 'tt.*', 'tt.term_taxonomy_id, tt.taxonomy, tt.description, tt.parent', $clauses['fields'] ) . ', COUNT(p.post_type) AS count';
            $clauses['join'] .= ' LEFT JOIN ' . $wpdb->term_relationships . ' AS r ON r.term_taxonomy_id = tt.term_taxonomy_id LEFT JOIN ' . $wpdb->posts . ' AS p ON p.ID = r.object_id';
            $clauses['where'] .= ' AND (p.post_type IN (' . implode( ',', $post_types ) . ') OR p.post_type IS NULL)';
            $clauses['orderby'] = 'GROUP BY t.term_id ' . $clauses['orderby'];

            //print_r( $clauses );
        } 
    }
    return $clauses;
}

add_filter( 'terms_clauses', 'df_terms_clauses', 10, 3 );
person LeeTee    schedule 09.04.2018
comment
Это тот, который я тоже использую. Позор get_terms() не имеет встроенной поддержки для этого. - person powerbuoy; 09.04.2018
comment
Тьфу, это довольно уродливый запрос, непригодный для использования. - person Michael Rogers; 17.03.2019

person    schedule
comment
Это приводит к большому количеству постов. Я ищу массив категорий - person LeeTee; 09.04.2018