Đặt hàng get_terms bằng Trường tùy chỉnh


7

Tôi có một phân loại tùy chỉnh của "crb_issues" có trường tùy chỉnh được liên kết với nó là "vấn đề", tạo ra giá trị ngày cho mỗi thuật ngữ trông giống như "20140601" mỗi năm.

Tôi đang cố gắng đưa ra tất cả các thuật ngữ Phân loại bằng cách sử dụng get_terms và đặt hàng chúng theo trường tùy chỉnh đó. Dưới đây là mã tôi đã làm việc để xuất ra Tên điều khoản và giá trị của "vấn đề". Nhưng tôi đang có một thời gian khó khăn để có được những gì xuất ra để đặt hàng theo lĩnh vực tùy chỉnh đó.

$args = array(
    'meta_key'          => 'issue_date',
    'orderby'           => 'meta_value_num', 
    'order'             => 'DESC',
    'hide_empty'        => true,
    'number'            => '4', 
    'fields'            => 'all', 
); 

$terms = get_terms("crb_issues", $args);

 if ( !empty( $terms ) && !is_wp_error( $terms ) ){
    echo "<ul>";
    foreach ( $terms as $term ) {
        echo "<li>" . $term->name . "</li>";
        the_field('issue_date', $term);
    }
    echo "</ul>";
 }

Bất kì sự trợ giúp nào đều được đánh giá cao.


Lưu ý: Tôi đã tìm thấy các giải pháp plugin như Thứ tự phân loại nâng cao, cho phép tôi kéo và thả chúng vào đúng thứ tự, nhưng tôi muốn điều này được xử lý thông qua một đơn đặt hàng hoặc một số cách sắp xếp tự động.
Phil Hoyt

Bạn có thể tham khảo chủ đề sau: wordpress.stackexchange.com/questions/117147/ Khăn Hoặc liên kết này: wphub.com/sorting-c chuyên mục-custom-sort-order Hy vọng nó sẽ giúp bạn.
WisdmLabs

Câu trả lời:


4

Thay vì xuất các thuật ngữ của bạn trong vòng lặp ban đầu đó, tôi sẽ sử dụng nó để thay thế cho một mảng mới, với vấn đề của bạn là khóa:

$my_new_array = array( );
foreach ( $terms as $term ) {
    $issue_date = get_field( 'issue_date', $term );
    $my_new_array[$issue_date] = $term->name;
}

Sau đó, bạn có thể lặp qua mảng mới này theo thứ tự:

ksort( $my_new_array, SORT_NUMERIC );

foreach ( $my_new_array as $issue_date => $term_name ) {
   echo "<li>" . $term_name . " " . $issue_date . "</li>";
}

Điều này chưa được kiểm tra.


Tôi thích ý tưởng này, thật không may là tôi không đủ thông minh để làm cho nó hoạt động tốt, điều này chắc chắn đưa ra tất cả các điều khoản và những gì không, không theo thứ tự của vấn đề.
Phil Hoyt

Hãy thử phiên bản sửa đổi ở trên. Bạn có thể phải buộc mảng mới theo đúng thứ tự
vancoder

Đó chính xác là những gì tôi đã googling khi tôi thấy bạn đăng nó! Hah Tôi đã làm cho nó hoạt động chỉ cần sửa đổi một chút để làm việc theo cách tôi cần và sẽ đăng mã của tôi.
Phil Hoyt

Thật tốt ... lạ là get_terms () có thứ tự meta_value_num ... nhưng tôi đã không cho nó chạy
GDY

1
Xin lưu ý rằng nếu một hoặc nhiều điều khoản có cùng ngày phát hành, thì các điều khoản sẽ ghi đè lên nhau
uruk

6

Một giải pháp ngắn hơn nhiều, chỉ cần thêm điều này trước foreach:

usort($terms, function($a, $b) {
    return get_field('issue_date', $a) - get_field('issue_date', $b);
});

4

Tôi đã sử dụng một phương pháp tương tự, nhưng tôi muốn lưu trữ nhiều giá trị từ phân loại hơn tên và giá trị trường tùy chỉnh mà tôi đã cung cấp, vì vậy cuối cùng tôi đã lưu trữ nó dưới dạng objectvà tạo ra mộtarray thứ giống như những gì thực sự được trả về khi bạn sử dụng hàm get_terms.

Nhận điều khoản của bạn:

$terms = get_terms('your-taxonomy');

Sau đó, tạo một mảng mới, lưu trữ chúng theo giá trị trường tùy chỉnh của tôi, tình cờ là số trong trường hợp này:

$newterms = array(); 
foreach($terms as $term) {
    $order = get_field('order', $term); //THIS MY CUSTOM FIELD VALUE                
    $newterms[$order] = (object) array(
            'name' => $term->name,
            'slug' => $term->slug,
            'term_id' => $term->term_id
    );
}

Sắp xếp chúng theo số lượng:

ksort( $newterms, SORT_NUMERIC );

Sau đó sử dụng foreachvòng lặp để lấy các giá trị của từng đối tượng:

foreach ( $newterms as $newterm ) {     
        echo '<a href="#' . $newterm->slug . '">' . $newterm->name . '</a>';
}

Vì vậy, về cơ bản, tôi đang viết lại mảng để sử dụng khóa của thứ tự tùy chỉnh của mình, nhưng trong trường hợp này tôi cần sên, tên và ID của thuật ngữ, vì vậy tôi đã lưu trữ nó dưới dạng một đối tượng, thay vì phương thức ở trên.

Mục tiêu cuối cùng của tôi là tôi đã thiết lập Trường tùy chỉnh nâng cao để khi thuật ngữ phân loại được tạo, nó có thể được cung cấp một số thứ tự từ người dùng và sau đó tôi có thể lặp qua các thuật ngữ dựa trên thứ tự mong muốn của họ.

Hy vọng điều này sẽ giúp được ai đó!


2
Đây phải là câu trả lời được chấp nhận. Làm tốt lắm.
Christine Cooper

Tôi có thể làm việc với điều này, nhưng như uruk nhận xét về giải pháp của vancoder, nếu 2 hoặc nhiều phần tử có cùng giá trị trong ordertrường, chúng sẽ ghi đè lên nhau và chỉ phần tử cuối cùng sẽ hiển thị.
David Rhoden

3

Cảm ơn Wrapsoder vì sự giúp đỡ của bạn !!! Tôi đã xé tóc ra cả ngày để cố gắng tìm ra nó. Thật thú vị, giải pháp của bạn là một trong nửa tá tôi đã viết trên bảng trắng của mình, NHƯNG tôi không biết làm thế nào để thực sự tạo ra một mảng với đó là một chìa khóa. Tôi là một người như thế. Dưới đây là mã tôi đã kết thúc bằng một số bình luận cho bất cứ ai khác đang cố gắng làm điều này!

<?php
$terms = get_terms("crb_issues");
$issue_archive = array( ); // creates an array for all terms inside of crb_issues tax using the custom field "issue_date" as the key
foreach ( $terms as $term ) {
    $issue_date = get_field( 'issue_date', $term );
    $issue_archive[$issue_date] = $term->name;
}

krsort( $issue_archive, SORT_NUMERIC ); //sorts the issue_archive array from high to low

foreach ( $issue_archive as $issue_date => $term_name ) {
    echo "<li>" . $term_name . " " . $issue_date . "</li>"; //displays the term name and customfield issue_date
    if (++$i == 4) break; //Stops the foreach after 4
}
?>

Nếu bất cứ ai có ý kiến ​​tốt hơn cho mã này xin vui lòng cho tôi biết, hoặc cách tốt hơn để xử lý bất cứ điều gì. Nhưng tôi nghĩ rằng đây là một giải pháp khá tuyệt vời.


0

Cảm ơn Phil Hoyt, đây chính xác là những gì tôi đang tìm kiếm. Nhưng, than ôi, tôi không thể làm cho nó hoạt động với thiết lập của tôi. Những gì làm việc là như sau:

    <?php
    // Solution for sorting by ACF custom-field for tracks categories
    // http://support.advancedcustomfields.com/forums/topic/sorting-categories-list-by-custom-field/
    $categories = get_categories('taxonomy=tracks');
    $sorted_cats = array();
    foreach($categories as $cat){
    //$ordr = get_field('track_order', 'tracks_'.$cat>term_id); //wasn't working so used the line below
        $ordr = get_field( 'track_order', $cat );
        $sorted_cats[$ordr] = $cat;
    }
    krsort($sorted_cats);//ksort orders ascending, krsort reverses order (i.e. biggest to smallest)
    ?>

Chúc mừng


0

Sắp xếp các thuật ngữ theo giá trị mảng 'thứ tự' thay vì khóa mảng. Nếu bạn có 2 mục có cùng khóa, mục cuối cùng sẽ ghi đè lên mục đầu tiên. Điều này sẽ ngăn chặn điều đó và làm cho tất cả chúng hiển thị:

$sorted = array();
$args   = array( 'hide_empty' => false );
$terms  = get_terms( 'my-tax', $args );

if( $terms ) : 

    foreach ( $terms as $term ) {

        $sorted[]  = array(
            'order' => get_field( 'order', $term ), // Get field from ACF
            'name'  => $term->name,
        );
    }

    function sortByOrder($a, $b) {
        return $a['order'] - $b['order'];
    }

    usort($sorted, 'sortByOrder');

    foreach( $sorted as $t ) :?>
        <span>
            <?php echo $t['name']; ?>
        </span>
    <?php endforeach;
endif;
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.