আমি আশঙ্কা করছি যে এটি স্থানীয়ভাবে সম্ভব নয় (এখনও?) এই ট্র্যাকটি দেখুন: http://core.trac.wordpress.org/ticket/18106
একইভাবে ট্যাক্সনমি অ্যাডমিন পৃষ্ঠায় পোস্ট গণনা সমস্ত পোস্টের প্রতিফলন ঘটায় । ( আমি নিশ্চিত যে এর জন্যও ট্র্যাকের টিকিট আছে )
http://core.trac.wordpress.org/ticket/14084
এছাড়াও দেখুন, এই সম্পর্কিত পোস্ট ।
নতুন সমাধান
নীচের লিখিতটি লেখার পরে, আমি একটি আরও ভাল উপায়ে প্রকাশ করেছি (আপনি আরও কিছু করতে পারেন সেই দিক থেকে) get_terms()
কলটিতে প্রদত্ত ফিল্টারগুলি ব্যবহার করা । আপনি একটি মোড়ক ফাংশন তৈরি করতে পারেন যা ব্যবহার করে get_terms
এবং (শর্তাধীন) এসকিউএল কোয়েরি (পোস্টের ধরণের মাধ্যমে সীমাবদ্ধ করতে) পরিচালনা করতে একটি ফিল্টার যুক্ত করে।
ফাংশন হিসাবে একই আর্গুমেন্ট লাগে 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');