Tôi sợ điều này không thể thực sự (chưa?). Xem trac này: http://core.trac.wordpress.org/ticket/18106
Tương tự trên trang quản trị phân loại, số lượng bài đăng phản ánh tất cả các loại bài đăng. ( Tôi khá chắc chắn rằng cũng có một vé trac cho điều đó )
http://core.trac.wordpress.org/ticket/14084
Xem thêm, bài này liên quan .
Giải pháp mới
Sau khi viết một đoạn dưới đây, tôi đã phát hành một cách tốt hơn nhiều (theo nghĩa là bạn có thể làm được nhiều hơn) là sử dụng các bộ lọc được cung cấp trong get_terms()
cuộc gọi. Bạn có thể tạo một hàm bao bọc sử dụng get_terms
và (có điều kiện) thêm bộ lọc để thao tác truy vấn SQL (để hạn chế theo loại bài đăng).
Hàm lấy các đối số tương tự như get_terms($taxonomies, $args)
. $args
lấy đối số bổ sung trong post_types
đó lấy một mảng | chuỗi các kiểu bài.
Nhưng tôi không thể đảm bảo rằng mọi thứ đều hoạt động 'như mong đợi' (tôi đang nghĩ đến việc đếm số). Nó dường như hoạt động bằng cách sử dụng chỉ mặc định $args
cho get_terms
.
function wpse57444_get_terms( $taxonomies, $args=array() ){
//Parse $args in case its a query string.
$args = wp_parse_args($args);
if( !empty($args['post_types']) ){
$args['post_types'] = (array) $args['post_types'];
add_filter( 'terms_clauses','wpse_filter_terms_by_cpt',10,3);
function wpse_filter_terms_by_cpt( $pieces, $tax, $args){
global $wpdb;
// Don't use db count
$pieces['fields'] .=", COUNT(*) " ;
//Join extra tables to restrict by post type.
$pieces['join'] .=" INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id ";
// Restrict by post type and Group by term_id for COUNTing.
$post_types_str = implode(',',$args['post_types']);
$pieces['where'].= $wpdb->prepare(" AND p.post_type IN(%s) GROUP BY t.term_id", $post_types_str);
remove_filter( current_filter(), __FUNCTION__ );
return $pieces;
}
} // endif post_types set
return get_terms($taxonomies, $args);
}
Sử dụng
$args =array(
'hide_empty' => 0,
'post_types' =>array('country','city'),
);
$terms = wpse57444_get_terms('flag',$args);
Công việc ban đầu
Lấy cảm hứng từ vé trac ở trên, (đã thử nghiệm và nó hoạt động với tôi)
function wpse57444_filter_terms_by_cpt($taxonomy, $post_types=array() ){
global $wpdb;
$post_types=(array) $post_types;
$key = 'wpse_terms'.md5($taxonomy.serialize($post_types));
$results = wp_cache_get($key);
if ( false === $results ) {
$where =" WHERE 1=1";
if( !empty($post_types) ){
$post_types_str = implode(',',$post_types);
$where.= $wpdb->prepare(" AND p.post_type IN(%s)", $post_types_str);
}
$where .= $wpdb->prepare(" AND tt.taxonomy = %s",$taxonomy);
$query = "
SELECT t.*, COUNT(*)
FROM $wpdb->terms AS t
INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id
INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id
$where
GROUP BY t.term_id";
$results = $wpdb->get_results( $query );
wp_cache_set( $key, $results );
}
return $results;
}
Sử dụng
$terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));
hoặc là
$terms = wpse57444_filter_terms_by_cpt('flag','country');