मुझे डर है कि यह देशी (अभी तक?) संभव नहीं है। यह ट्रेक देखें: http://core.trac.wordpress.org/ticket/18106
इसी तरह टैक्सोनॉमी एडमिन पेज पर पोस्ट की गिनती सभी पोस्ट प्रकारों को दर्शाती है । ( मुझे पूरा यकीन है कि इसके लिए एक टीआरसी टिकट भी है )
http://core.trac.wordpress.org/ticket/14084
इस संबंधित पोस्ट को भी देखें ।
नया उपाय
नीचे एक लिखा होने के बाद, मैंने एक बेहतर तरीका जारी किया है (इस अर्थ में ऊंचाई कि आप अधिक कर सकते हैं) get_terms()
कॉल में प्रदान किए गए फ़िल्टर का उपयोग करना है । आप एक आवरण फ़ंक्शन का उपयोग कर सकते हैं get_terms
और (सशर्त रूप से) SQL क्वेरी में हेरफेर करने के लिए (पोस्ट प्रकार द्वारा प्रतिबंधित करने के लिए) एक फिल्टर जोड़ता है।
फ़ंक्शन के रूप में एक ही तर्क लेता है get_terms($taxonomies, $args)
। $args
अतिरिक्त तर्क लेता है, post_types
जिसमें एक सरणी होती है। पोस्ट प्रकारों की स्ट्रिंग।
लेकिन मैं इस बात पर ज़ोर नहीं दे सकता कि सब कुछ 'उम्मीद के मुताबिक' काम कर रहा है (मैं सोच रहा हूं कि गिनती गिन रहा हूं)। यह केवल डिफ़ॉल्ट के $args
लिए काम करते हुए दिखाई देता है 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);
}
प्रयोग
$args =array(
'hide_empty' => 0,
'post_types' =>array('country','city'),
);
$terms = wpse57444_get_terms('flag',$args);
मूल काम-काज
उपरोक्त टीआरसी टिकट से प्रेरित, (परीक्षण, और यह मेरे लिए काम करता है)
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;
}
प्रयोग
$terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));
या
$terms = wpse57444_filter_terms_by_cpt('flag','country');