Vì vậy, nó xảy ra rằng tôi cần một cái gì đó như thế cho một dự án tôi đang làm. Tôi chỉ đơn giản là viết một truy vấn để chọn tất cả các bài đăng thuộc loại tùy chỉnh, sau đó tôi kiểm tra các điều khoản thực tế trong phân loại của chúng mà chúng đang sử dụng là gì.
Sau đó, tôi đã sử dụng tất cả các điều khoản của phân loại đó bằng cách sử dụng get_terms()
và sau đó tôi chỉ sử dụng những điều khoản trong cả hai danh sách, gói nó trong một chức năng và tôi đã hoàn thành.
Nhưng sau đó tôi cần nhiều hơn chỉ là ID: Tôi cần tên nên tôi đã thêm một đối số mới có tên $fields
để tôi có thể nói cho hàm biết phải trả về cái gì. Sau đó, tôi hình dung rằng get_terms
chấp nhận nhiều đối số và chức năng của tôi bị giới hạn ở các thuật ngữ đơn giản đang được sử dụng bởi một loại bài đăng nên tôi đã thêm một if
tuyên bố nữa và bạn sẽ đi:
Chức năng:
/* get terms limited to post type
@ $taxonomies - (string|array) (required) The taxonomies to retrieve terms from.
@ $args - (string|array) all Possible Arguments of get_terms http://codex.wordpress.org/Function_Reference/get_terms
@ $post_type - (string|array) of post types to limit the terms to
@ $fields - (string) What to return (default all) accepts ID,name,all,get_terms.
if you want to use get_terms arguments then $fields must be set to 'get_terms'
*/
function get_terms_by_post_type($taxonomies,$args,$post_type,$fields = 'all'){
$args = array(
'post_type' => (array)$post_type,
'posts_per_page' => -1
);
$the_query = new WP_Query( $args );
$terms = array();
while ($the_query->have_posts()){
$the_query->the_post();
$curent_terms = wp_get_object_terms( $post->ID, $taxonomy);
foreach ($curent_terms as $t){
//avoid duplicates
if (!in_array($t,$terms)){
$terms[] = $c;
}
}
}
wp_reset_query();
//return array of term objects
if ($fields == "all")
return $terms;
//return array of term ID's
if ($fields == "ID"){
foreach ($terms as $t){
$re[] = $t->term_id;
}
return $re;
}
//return array of term names
if ($fields == "name"){
foreach ($terms as $t){
$re[] = $t->name;
}
return $re;
}
// get terms with get_terms arguments
if ($fields == "get_terms"){
$terms2 = get_terms( $taxonomies, $args );
foreach ($terms as $t){
if (in_array($t,$terms2)){
$re[] = $t;
}
}
return $re;
}
}
Sử dụng:
Nếu bạn chỉ cần một danh sách các id hạn thì:
$terms = get_terms_by_post_type('tag','','snippet','ID');
Nếu bạn chỉ cần một danh sách các tên hạn thì:
$terms = get_terms_by_post_type('tag','','snippet','name');
Nếu bạn chỉ cần một danh sách các đối tượng hạn thì:
$terms = get_terms_by_post_type('tag','','snippet');
Và nếu bạn cần sử dụng các đối số bổ sung của get_terms như: orderby, order, phân cấp ...
$args = array('orderby' => 'count', 'order' => 'DESC', 'hide_empty' => 1);
$terms = get_terms_by_post_type('tag',$args,'snippet','get_terms');
Thưởng thức!
Cập nhật:
Để sửa lỗi thuật ngữ để thay đổi loại bài cụ thể:
foreach ($current_terms as $t){
//avoid duplicates
if (!in_array($t,$terms)){
$terms[] = $t;
}
}
đến:
foreach ($current_terms as $t){
//avoid duplicates
if (!in_array($t,$terms)){
$t->count = 1;
$terms[] = $t;
}else{
$key = array_search($t, $terms);
$terms[$key]->count = $terms[$key]->count + 1;
}
}