Bestellen Sie get_terms über ein benutzerdefiniertes Feld

7

Ich habe eine benutzerdefinierte Taxonomie von "crb_issues", der ein benutzerdefiniertes Feld zugeordnet ist, nämlich "issue_date", das einen Datumswert für jeden Begriff ausgibt, der dem Jahrmonatstag "20140601" sehr ähnlich sieht.

Ich versuche, alle Taxonomies-Begriffe mit get_terms auszugeben und sie nach diesem benutzerdefinierten Feld zu ordnen. Unten ist der Code, an dem ich gearbeitet habe, der den Namen der Begriffe und den Wert des "issue_date" ausgibt. Es fällt mir jedoch schwer, die Ausgabe nach diesem benutzerdefinierten Feld zu ordnen.

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

Jede Hilfe wäre sehr dankbar.

Phil Hoyt
quelle
Hinweis: Ich habe Plugin-Lösungen wie Advanced Taxonomy Terms Order gefunden, mit denen ich sie in die richtige Reihenfolge ziehen und ablegen kann. Ich würde dies jedoch lieber über eine Orderby-Methode oder eine automatische Sortiermethode erledigen.
Phil Hoyt
Sie können auf folgenden Thread verweisen: wordpress.stackexchange.com/questions/117147/… Oder diesen Link: wphub.com/sorting-categories-custom-sort-order Hoffe, es hilft Ihnen.
WisdmLabs

Antworten:

4

Anstatt Ihre Begriffe in dieser anfänglichen Schleife auszugeben, würde ich sie stattdessen verwenden, um ein neues Array mit Ihrem issue_date als Schlüssel zu erstellen:

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

Sie können dieses neue Array dann in der folgenden Reihenfolge durchlaufen:

ksort( $my_new_array, SORT_NUMERIC );

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

Dies ist ungetestet.

Vancoder
quelle
Ich mag die Idee, leider bin ich nicht klug genug, um sie richtig zum Laufen zu bringen. Dies gibt definitiv alle Begriffe aus und was nicht, allerdings nicht in der Reihenfolge des Ausgabedatums.
Phil Hoyt
Probieren Sie die oben geänderte Version aus. Möglicherweise müssen Sie das neue Array in die richtige Reihenfolge
zwingen
Genau das habe ich gegoogelt, als ich sah, dass du das postest! Hah. Ich habe es zum Laufen gebracht, nur ein bisschen modifiziert, um zu funktionieren, wie ich es brauche, und werde meinen Code veröffentlichen.
Phil Hoyt
Gut ... seltsam ist, dass get_terms () orderby meta_value_num hat ... aber ich habe es nicht zum Laufen gebracht
GDY
1
Beachten Sie, dass sich ein oder mehrere Begriffe, die genau das gleiche Ausgabedatum haben, gegenseitig überschreiben
uruk
6

Eine viel kürzere Lösung, fügen Sie diese einfach vorher hinzu foreach:

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

Ich habe eine ähnliche Methode verwendet, wollte aber mehr Werte aus der Taxonomie speichern als den Namen und den benutzerdefinierten Feldwert, die ich angegeben habe. Daher habe ich sie als gespeichert objectund eine ähnliche Methode erstellt, arraywie sie tatsächlich zurückgegeben wird, wenn Sie die Funktion verwenden get_terms.

Holen Sie sich Ihre Bedingungen:

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

Erstellen Sie dann ein neues Array und speichern Sie es anhand meines benutzerdefinierten Feldwerts, der in diesem Fall numerisch war:

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

Sortieren Sie sie numerisch:

ksort( $newterms, SORT_NUMERIC );

Verwenden Sie dann die foreachSchleife, um die Werte der einzelnen Objekte abzurufen:

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

Im Wesentlichen schreibe ich das Array neu, um den Schlüssel meiner benutzerdefinierten Bestellung zu verwenden. In diesem Fall benötigte ich jedoch den Slug, den Namen und die ID des Begriffs, sodass ich ihn als Objekt und nicht wie oben beschrieben speicherte.

Mein Endziel war es, ein erweitertes benutzerdefiniertes Feld einzurichten, damit beim Erstellen eines Taxonomiebegriffs vom Benutzer eine numerische Reihenfolge angegeben und die Begriffe dann anhand der gewünschten Reihenfolge durchlaufen werden konnten.

Hoffe das hilft jemandem!

RCNeil
quelle
2
Dies sollte die akzeptierte Antwort sein. Gut gemacht.
Christine Cooper
Ich kann damit arbeiten, aber wie uruk die Lösung von vancoder kommentierte, überschreiben sich zwei oder mehr Elemente, die den gleichen Wert im orderFeld haben, gegenseitig und nur das letzte wird angezeigt.
David Rhoden
3

Danke Vancoder für deine Hilfe !!! Ich habe mir den ganzen Tag die Haare herausgerissen, um es herauszufinden. Komischerweise war Ihre Lösung eine von einem halben Dutzend, die ich auf mein Whiteboard geschrieben habe, ABER ich hatte keine Ahnung, wie ich tatsächlich ein Array mit diesem als Schlüssel erstellen sollte. Ich bin so ein Noob. Unten ist der Code, den ich letztendlich mit einigen Kommentaren für alle anderen verwendet habe, die dies versuchen!

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

Wenn jemand bessere Kommentare zu diesem Code hat, lass es mich wissen oder bessere Möglichkeiten, mit irgendetwas umzugehen. Aber ich denke, das ist eine ziemlich großartige Lösung.

Phil Hoyt
quelle
0

Danke Phil Hoyt, genau das habe ich gesucht. Aber leider konnte ich es nicht mit meinem Setup zum Laufen bringen. Was funktioniert, ist Folgendes:

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

Prost

Tiger
quelle
0

Sortieren Sie Begriffe nach dem Array-Wert 'order' anstelle des Array-Schlüssels. Wenn Sie 2 Elemente mit demselben Schlüssel haben, überschreibt das letzte das erste. Dies verhindert dies und macht sie alle sichtbar:

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