web-dev-qa-db-ja.com

カスタムフィールドを使用してget_termsを注文する

"crb_issues"というカスタム分類法があり、それに関連付けられたカスタムフィールド( "issue_date")があり、各用語の日付値が "20140601" yearmonthdayのように見えます。

私はget_termsを使用してすべての分類法用語を出力し、そのカスタムフィールドでそれらを順序付けようとしています。以下は私が取り組んできたコードで、Terms Nameと "issue_date"の値が正しく出力されています。しかし、そのカスタムフィールドで出力するものを注文するのに苦労しています。

$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>";
 }

どんな助けでも大いに感謝されるでしょう。

6
Phil Hoyt

最初のループであなたの用語を出力するのではなく、issue_dateをキーにして新しい配列を構築するために代わりにそれを使用します。

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

その後、この新しい配列を順番にループ処理できます。

ksort( $my_new_array, SORT_NUMERIC );

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

これは未検証です。

4
vancoder

もっと短い解決法は、これをforeachの前に追加するだけです。

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

あなたの助けをありがとうVancoder!私はそれを理解しようとして一日中私の髪をリッピングしています。あなたの解決策が私のホワイトボードに書いた半ダースのうちの1つであることに十分におもしろい、しかしそれをキーとして実際にどのように配列を作成するかについての手がかりがなかった。私はそのような野郎です。これをやろうとしている他の誰かのために私がいくつかのコメントを付けて使ってしまったコードは以下の通りです!

<?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
}
?>

誰かがこのコードに対するより良いコメントを持っているなら、私に知らせてください、または何かを処理するためのより良い方法を教えてください。しかし、これは非常に素晴らしい解決策だと思います。

3
Phil Hoyt

私は似たような方法を使いましたが、与えられた名前とカスタムフィールドの値よりも多くの分類法からの値を保存したいので、objectname__として保存し、arrayname__を作成しました。 get_terms

あなたの用語を入手:

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

それから新しい配列を作成し、私のカスタムフィールドの値でそれらを保存します。

$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
    );
}

番号順に並べ替えます。

ksort( $newterms, SORT_NUMERIC );

それからforeachname__ループを使用して各オブジェクトの値を取得します。

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

そのため、基本的にカスタムオーダーのキーを使用するように配列を書き換えますが、この場合はスラッグ、名前、および用語のIDが必要でした。そのため、上記の方法ではなくオブジェクトとして格納しました。

私の最終目標は、 Advanced Custom Fieldを設定することでした それで、分類学用語が作成されたとき、それはユーザーからの数字の順序を与えられ、そして私は彼らの望みの順序に基づいて用語をループすることができます。

これが誰かに役立つことを願っています!

2
RCNeil

配列キーではなく配列値 'order'で用語を並べ替えます。同じキーを持つアイテムが2つある場合、最後のアイテムが最初のアイテムを上書きします。これはそれを防ぎ、それらすべてを見えるようにします。

$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;
0
Bobz

Phil Hoytさん、ありがとうございました。しかし、あいにく、私はそれを私の設定でうまく動かすことができませんでした。機能は次のとおりです。

    <?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)
    ?>

乾杯

0
tigre