it-swarm.com.de

Bestellen Sie get_terms mit einem benutzerdefinierten Feld

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 Jahresmonat "20140601" ähnelt.

Ich versuche, alle Taxonomies-Begriffe mit get_terms zu setzen und sie nach diesem benutzerdefinierten Feld zu ordnen. Unten ist der Code, an dem ich gearbeitet habe und der den Terms-Namen 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.

6
Phil Hoyt

Anstatt Ihre Terme in dieser ersten 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.

4
vancoder

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

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

Danke Vancoder für deine Hilfe !!! Ich habe mir den ganzen Tag die Haare ausgerissen, 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 man ein Array mit diesem Schlüssel erstellt. 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 für diesen Code hat, lass es mich wissen oder bessere Möglichkeiten, mit etwas umzugehen. Aber ich denke, das ist eine ziemlich großartige Lösung.

3
Phil Hoyt

Ich habe eine ähnliche Methode verwendet, aber ich wollte mehr Werte aus der Taxonomie als den von mir angegebenen Namen und benutzerdefinierten Feldwert speichern. Deshalb habe ich sie als object gespeichert und eine array erstellt, ähnlich wie das, was tatsächlich zurückgegeben wird, wenn Sie die Funktion verwenden get_terms.

Holen Sie sich Ihre Bedingungen:

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

Dann erstelle ein neues Array und speichere sie nach meinem benutzerdefinierten Feldwert, der in diesem Fall zufällig numerisch ist:

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

Sortiere sie numerisch:

ksort( $newterms, SORT_NUMERIC );

Verwenden Sie dann die foreach-Schleife, um die Werte der einzelnen Objekte abzurufen:

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

Im Grunde genommen 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 gespeichert habe.

Mein Endziel war es, ein erweitertes benutzerdefiniertes Feld einzurichten - als ein Taxonomiebegriff erstellt wurde, konnte ihm eine numerische Reihenfolge vom Benutzer zugewiesen werden, und dann konnte ich die Begriffe basierend auf der gewünschten Reihenfolge durchlaufen.

Hoffe das hilft jemandem!

2
RCNeil

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

$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

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

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

0
tigre