Saya khawatir ini tidak mungkin dilakukan secara asli (belum?). Lihat trac ini: http://core.trac.wordpress.org/ticket/18106
Demikian pula pada halaman admin taksonomi jumlah posting mencerminkan semua jenis posting. ( Saya cukup yakin ada tiket trac untuk itu juga )
http://core.trac.wordpress.org/ticket/14084
Lihat juga, posting terkait ini .
Solusi baru
Setelah menulis yang di bawah ini, saya telah merilis cara yang lebih baik (alteast dalam arti bahwa Anda dapat melakukan lebih banyak) adalah dengan menggunakan filter yang disediakan dalam get_terms()
panggilan. Anda dapat membuat fungsi pembungkus yang menggunakan get_terms
dan (secara kondisional) menambahkan filter untuk memanipulasi kueri SQL (untuk membatasi menurut jenis posting).
Fungsi ini mengambil argumen yang sama dengan get_terms($taxonomies, $args)
. $args
mengambil argumen tambahan post_types
yang membutuhkan array | string tipe posting.
Tetapi saya tidak dapat menjamin bahwa semuanya berfungsi 'seperti yang diharapkan' (saya berpikir untuk menghitungnya). Tampaknya berfungsi hanya dengan default $args
untuk 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);
}
Pemakaian
$args =array(
'hide_empty' => 0,
'post_types' =>array('country','city'),
);
$terms = wpse57444_get_terms('flag',$args);
Bekerja di sekitar
Terinspirasi dari tiket trac di atas, (diuji, dan berhasil untuk saya)
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;
}
Pemakaian
$terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));
atau
$terms = wpse57444_filter_terms_by_cpt('flag','country');