Làm thế nào để chỉ liệt kê các điều khoản con của một nguyên tắc phân loại và không phải cha mẹ của họ?


9

Tôi đang tạo một menu chọn tuổi trong quản trị viên, được điền từ phân loại age. Phân loại theo thứ bậc như sau:

  • 18-25 (cha mẹ, ID 183)
    • 18 (con)
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 26-30 (cha mẹ, ID 184)
    • 26
    • 27
    • 28
    • 29
    • 30

Tôi chỉ muốn liệt kê các con (18, 19, v.v.) chứ không phải cha mẹ (18-25, 26-30), v.v. Hiện tại tôi đang sử dụng get_termsvới parentđối số, nhưng nó không chấp nhận nhiều hơn 1 ID cha. Đây là những gì tôi có cho đến nay, cho thấy những đứa trẻ từ 18-25.

    $ages = get_terms( 'age', array(
        'hide_empty' => 0,
        'parent' => '183',
    ));

Đây là những gì tôi muốn nó làm, nhưng không được hỗ trợ. Tôi cũng đã thử nó với một mảng nhưng nó cũng không hoạt động.

    $ages = get_terms( 'age', array(
        'hide_empty' => 0,
        'parent' => '183,184',
    ));

Tôi thấy có một hàm get_term_children nhưng tôi không chắc về cách sử dụng hàm này vì có vẻ như nó chỉ chấp nhận một giá trị. Ví dụ: Trong ví dụ này, nó sẽ xây dựng một danh sách không có thứ tự nhưng tôi có thể sửa đổi cho menu chọn.

<?php
    $termID = 183;
    $taxonomyName = "age";
    $termchildren = get_term_children( $termID, $taxonomyName );

    echo '<ul>';
    foreach ($termchildren as $child) {
    $term = get_term_by( 'id', $child, $taxonomyName );
    echo '<li><a href="' . get_term_link( $term->name, $taxonomyName ) . '">' . $term->name . '</a></li>';
    }
    echo '</ul>';
?> 

Gọi get_termshai lần và hợp nhất hai mảng kết quả?
Đánh dấu Duncan

@Mark Cảm ơn, tôi đã nghĩ làm theo cách này, nhưng ngay cả khi tôi hợp nhất ID thành một mảng, tôi không thể thấy nó hoạt động như thế nào vì nó sẽ giống như liệt kê chúng theo cách thủ công - 183, 184, không ' t làm việc
Andrew

Đọc xong câu trả lời được chấp nhận, bây giờ tôi nhận ra câu hỏi của bạn không hoàn toàn rõ ràng, từ vẻ ngoài của những điều bạn muốn tất cả các điều khoản, ngoại trừ những điều cấp cao nhất .. (mà bạn có thể làm với một get_termscuộc gọi). Câu hỏi của bạn đọc như thể bạn đang muốn tất cả trẻ em của 2 điều khoản phụ huynh cụ thể ..
Mark Duncan

Câu trả lời:


14

Điều này sẽ làm việc cho bạn:

$taxonomyName = "age";
//This gets top layer terms only.  This is done by setting parent to 0.  
$parent_terms = get_terms( $taxonomyName, array( 'parent' => 0, 'orderby' => 'slug', 'hide_empty' => false ) );   
echo '<ul>';
foreach ( $parent_terms as $pterm ) {
    //Get the Child terms
    $terms = get_terms( $taxonomyName, array( 'parent' => $pterm->term_id, 'orderby' => 'slug', 'hide_empty' => false ) );
    foreach ( $terms as $term ) {
        echo '<li><a href="' . get_term_link( $term ) . '">' . $term->name . '</a></li>';   
    }
}
echo '</ul>';

Cảm ơn @Manny, đã làm việc một điều trị. Tôi lấy những gì bạn cung cấp và nghiền nó vào menu chọn sau. Công cụ tuyệt vời.
Andrew

Không vấn đề gì. Mừng vì việc này giúp ích được cho bạn.
Manny Fleurmond

1
Xem câu trả lời của karimhossenbux dưới đây để có câu trả lời hiệu quả hơn nhiều.
dotancohen 15/03/2016

$term->namekhông hợp lệ trong get_term_link(), nó chỉ chấp nhận thuật ngữ ID, sên hoặc đối tượng
Pieter Goosen

14

Bạn cũng có thể làm:

$terms = get_terms($taxonomyName);
foreach($terms as $term) {
    if ($term->parent != 0) { // avoid parent categories
        //your instructions here
    }
}

Tôi đã lưu ý rằng cha mẹ có trường "cha mẹ" bằng 0 và một đứa trẻ có id cha mẹ trong đó.


4
Câu trả lời được chấp nhận chạy N cuộc gọi get_terms () và chạy trong thời gian đa thức. Câu trả lời này chạy một lệnh gọi get_terms () và chạy trong thời gian tuyến tính. Đây là một câu trả lời tốt hơn nhiều.
dotancohen 15/03/2016

@dotancohen Bạn có thể làm điều này mà không phải loại trừ các thuật ngữ cấp cao nhất trên đầu ra, bạn có thể xóa các thuật ngữ cấp cao nhất với wpse_exclude_toptham số được thêm vào các đối số truy vấn ;-). Tuy nhiên, tôi đồng ý, điều này nhanh hơn câu trả lời được chấp nhận
Pieter Goosen

1
@PieterGoosen: Cảm ơn bạn. Tôi chỉ lấy mã nguồn 4.4.2 cho các chuỗi wpse_exclude_topexclude_topkhông tìm thấy chúng. Google cũng không biết về điều đó. Nó được ghi nhận ở đâu?
dotancohen

1
@dotancohen trong câu trả lời của tôi ;-)
Pieter Goosen

4

Chúng tôi có thể loại trừ các bậc cha mẹ cấp cao nhất bằng cách lọc chúng ra bằng cách sử dụng terms_clausesbộ lọc để thay đổi truy vấn SQL trước khi thực thi. Bằng cách này, chúng ta không cần bỏ qua các bậc cha mẹ trong foreachvòng lặp cuối cùng vì họ không nằm trong mảng các điều khoản được trả về, điều này giúp chúng ta tiết kiệm công việc và mã hóa không cần thiết

Bạn có thể thử như sau:

add_filter( 'terms_clauses', function (  $pieces, $taxonomies, $args )
{
    // Check if our custom arguments is set and set to 1, if not bail
    if (    !isset( $args['wpse_exclude_top'] ) 
         || 1 !== $args['wpse_exclude_top']
    )
        return $pieces;

    // Everything checks out, lets remove parents
    $pieces['where'] .= ' AND tt.parent > 0';

    return $pieces;
}, 10, 3 );

Để loại trừ cha mẹ cấp cao nhất, bây giờ chúng ta có thể vượt qua 'wpse_exclude_top' => 1với các đối số của chúng tôi. wpse_exclude_topTham số mới được hỗ trợ bởi bộ lọc ở trên

$terms = get_terms( 'category', ['wpse_exclude_top' => 1] );
if (    $terms
     && !is_wp_error( $terms )
) {
    echo '<ul>';
        foreach ($terms as $term) {
            echo '<li><a href="' . get_term_link( $term ) . '">' . $term->name . '</a></li>';  
        }
    echo '</ul>';
}

Chỉ cần một lưu ý, get_term_link()không không chấp nhận tên thuật ngữ, chỉ, sên, ID hoặc đối tượng thuật ngữ hoàn chỉnh. Đối với hiệu suất, luôn luôn chuyển đối tượng hạn đến get_term_link()nếu đối tượng hạn có sẵn ( như trong trường hợp này )


2

Tại sao bạn không thể đặt childlessđối số thành đúng?

$ages = get_terms( array(
    'taxonomy' => 'age',
    'childless' => true
    )
);

đặt childlessđối số thành đúng nghĩa là bạn chỉ có thể đi sâu 1 cấp, do đó, điều này không hiệu quả đối với các nguyên tắc phân loại có 3 cấp trở lên.
GeckoSEO

-1

Nếu bạn hiển thị nhiều con của cha mẹ, bạn có thể thử điều này. Hiển thị đề cập đến thuật ngữ id thuật ngữ con.

$termIds = array(367, 366, 365, 364, 363, 362);
$taxonomyName = "age";

$args = array(
    'orderby'           => 'term_id', 
    'order'             => 'DESC',                      
    'hide_empty'        => false,                       
    'childless'         => false,
); 

$terms = get_terms( $taxonomyName, $args );

if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
$inc = 1;
foreach ( $terms as $term ) {                           
 if (in_array($term->parent, $termIds)) {
  echo '<option value="'.$term->term_id.'"><font><font>'.$term->name.'</font></font></option>';
    }
  }
}

1
Vui lòng giải thích lý do tại sao bạn nghĩ mã này nên hoạt động. Ngoài ra, tôi khá chắc chắn rằng một giải pháp mã hóa cứng không phải là cách tốt nhất.
s_ha_dum

Câu hỏi đề cập với id, vì lý do này tôi đã trả lời suy nghĩ liên quan.
Jakir Hossain
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.