it-swarm.com.de

get_terms orderby name als Zahlen

Ich habe eine benutzerdefinierte Taxonomie, die mit Begriffen wie "Band 1", "Band 2", "Ausgabe 1", "Ausgabe 2", "Ausgabe 10" und "get_terms orderby name" gefüllt ist. Die Liste lautet: Ausgabe 1, Ausgabe 10, Ausgabe 2 obwohl ich es brauche, um Ausgabe 1, Ausgabe 2, Ausgabe 10 zu sein

Ich habe versucht, wp.stackexchange zu durchsuchen und mein google-fu ohne Erfolg zu verwenden. Jede Hilfe wäre sehr dankbar.

2
nepykstu

Ich weiß, dass dieser Beitrag sehr alt ist, aber immer noch für andere antwortet, die hier ankommen.

Das Folgende ist ein sehr einfacher Filter, um die Begriffe als Zahlen zu sortieren. Sie müssen nur die Variable $taxonomy_to_sort mit taxonomy slug setzen und in functions.php Ihres Themas einfügen.

add_filter( 'get_terms_orderby', 'terms_order_as_number', 10,  3);

function terms_order_as_number($order_by, $args, $taxonomies){

    $taxonomy_to_sort = "numbers";

    if(in_array($taxonomy_to_sort, $taxonomies)){
        $order_by .=  " * 1";
    }

    return $order_by;
}
1
Lalit Arora

Es gibt viele ähnliche Beiträge im Forum, wenn Sie sich umschauen.

Sie haben keine Zahlen . Daher können Sie nicht numerisch sortieren. Sie müssen alphabetisch sortieren, und das gibt Ihnen das Muster, das Sie sehen. Ich bin mir ehrlich gesagt nicht mal sicher, ob get_terms eine numerische Sortierung unterstützt (auf einen Blick würde ich sagen, dass dies nicht der Fall ist), da ich bezweifle, dass viele Begriffe vollständig sind aus Zahlen zusammengesetzt.

Sie haben mehrere Möglichkeiten.

  1. Schreiben Sie Ihre eigene SQL-Abfrage. Ich denke, aber ich bin nicht sicher, ob Sie dies in reinem SQL tun können, aber es wäre schwierig - Sie müssten substr den Termnamen und sortiere danach. Es wäre haarig und wahrscheinlich nicht sehr effizient.
  2. Wenn Sie mehrere Begriffe gleichzeitig abrufen, können Sie diese in PHP sortieren, bevor Sie sie anzeigen. Sie müssten dasselbe tun wie in SQL und substr den Namen, sortieren und wieder zusammensetzen. Jede Paginierung wäre bei diesem Ansatz problematisch.
1
s_ha_dum

Wo sind die Probleme begründet?

Zuerst möchten Sie nach einem Teil sortieren, derineiner Zeichenfolge ist. Dies ist keine native Funktionalität inirgendeinerProgrammiersprache .

Zweitens ist Ihr eigentliches Problem nicht "Sortieren nach Nummer", sondern die Art und Weise, wie Siediese Nummern konstruiert haben. Wenn Sie dieses Problem vorher gewusst hätten (und es berücksichtigt hätten), hätten Sie einen Filter schreiben können, der diese Nullen vor Ihren Zahlen auffüllt.

So ignorieren Sie das eigentliche Problem und umgehen es.

Dies ist nicht wirklichfixdas Problem, aber da wir (und vielleicht auch Sie) nicht wissen, wie viele "Probleme" Ihnen einfallen könnten (10, 1k , 100k?), Wir fügen nur die Sortierung hinzu, wenn wir sie anzeigen. Hier ist ein Vorlagen-Tag, das Sie verwenden können:

function wpse80063_numsorted_issues()
{
    $terms  = get_terms( 'issues', array( /* of possible args */ );
    $digits = strlen( count( $terms ) );
    $sorted_terms = array();
    foreach ( $terms as $term )
    {
        preg_match( "/\d+/", $term, $nr );
        $nr = sprintf( "%0{digits}d", $nr );
        // If the above line doesn't work, take this one:
        // $nr = str_pad( $nr, $digits, "0", STR_PAD_LEFT );
        $sorted_terms[ $nr ] = $term;
    }
    ! empty( $sorted_terms ) AND sort( $sorted_terms );

    return $sorted_terms;
}
0
kaiser