Wordpress - таксономия, используемая для нескольких типов записей - как получить get_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') );
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;
}
}
?>
Я нашел следующий код, который работает как шарм:)
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 );
$terms = get_terms( 'animal_cat', array(
'orderby' => 'count',
'hide_empty' => 0
) );
foreach( $terms as $term ) {
// Define the query
$args = array(
'post_type' => 'animal',
'animal_cat' => $term->slug
);
$query = new WP_Query( $args );
}