Đọc Get categories for custom post type với custom taxonomy attached
16th Nov 2021Nếu bạn muốn liệt kê tất cả các danh mục có sẵn cho một loại bài đăng tùy chỉnh, đoạn mã này có thể giúp bạn.
>> Học ví dụ nhỏ thêm a Popup Slider to Your Website
>> Tự tìm hiểu mở rộng WP_Query with Custom Queries and Tables
Chỉ cần sử dụng hàm get_categories () tiêu chuẩn và chuyển $ args liên quan đến phân loại bạn đã đăng ký cho CPT của mình. Vì vậy, nếu bạn đã xác định phân loại của mình như thế này:
register_taxonomy( 'the_taxonomy_named_in_your_CPT' );
Then you'd show the taxonomy to front end users via:
$args = array( 'taxonomy' => 'the_taxonomy_named_in_your_CPT', 'orderby' => 'name', 'show_count' => 1, 'pad_counts' => 1, 'hierarchical' => 1, 'echo' => 0 ); $allthecats = get_categories( $args ); echo ( '<pre>' ); print_r( $allthecats ); echo ( '</pre>' );
What you want to do is common but not well handled in WordPress core. There are probably ways to do it without custom SQL but I don't think they would scale for a large number of posts. Below is a function I wrote called get_cross_referenced_terms() that will get what you want, complete with an example how to use it.
This following code can be placed in the root of your WordPress site in a test.php file to see it work. You can then copy the function get_cross_referenced_terms() into your theme's functions.php file or into a .php file of a plugin you might be working on:
<?php include('wp-load.php'); $nike = get_term_by('slug','nike','brand'); // This here just to illustrate $terms = get_cross_referenced_terms(array( 'post_type' => 'product', 'related_taxonomy' => 'brand', 'term_id' => $nike->term_id, )); foreach($terms as $term) { echo "<p>{$term->name}</p>"; } function get_cross_referenced_terms($args) { global $wpdb; $args = wp_parse_args($args,array( 'post_type' => 'post', 'taxonomy' => 'category', 'related_taxonomy' => 'post_tag', 'term_id' => 0, )); extract($args); $sql = <<<SQL SELECT DISTINCT {$wpdb->terms}.*, COUNT(*) AS post_count FROM {$wpdb->terms} INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->terms}.term_id={$wpdb->term_taxonomy}.term_id INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id INNER JOIN {$wpdb->posts} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID INNER JOIN {$wpdb->term_relationships} related_relationship ON {$wpdb->posts}.ID=related_relationship.object_id INNER JOIN {$wpdb->term_taxonomy} related_term_taxonomy ON related_relationship.term_taxonomy_id=related_term_taxonomy.term_taxonomy_id INNER JOIN {$wpdb->terms} related_terms ON related_term_taxonomy.term_id=related_terms.term_id WHERE 1=1 AND (related_term_taxonomy.taxonomy<>{$wpdb->term_taxonomy}.taxonomy OR related_terms.term_id<>{$wpdb->terms}.term_id) AND {$wpdb->posts}.post_type='%s' AND {$wpdb->term_taxonomy}.taxonomy='%s' AND related_term_taxonomy.taxonomy='%s' AND related_terms.term_id=%d GROUP BY {$wpdb->terms}.term_id SQL; $sql = $wpdb->prepare($sql,$post_type,$taxonomy,$related_taxonomy,$term_id); $terms = $wpdb->get_results($sql); return $terms; }
Add new comment