web-dev-qa-db-fra.com

get_terms orderby name en tant que nombres

J'ai une taxonomie personnalisée contenant des termes tels que "volume 1", "volume 2", "numéro 1", "numéro 2", "numéro 10" et get_terms orderby name renvoie la liste sous la forme: numéro 1, numéro 10, numéro 2 bien que j'ai besoin que ce soit le numéro 1, numéro 2, numéro 10

J'ai essayé de rechercher wp.stackexchange et d'utiliser mon google-fu en vain. Toute aide serait grandement appréciée.

2
nepykstu

Je sais que ce message est très ancien mais qu'il répond toujours à d'autres qui arrivent ici.

Voici un filtre très simple pour trier les termes sous forme de nombres. Il vous suffit de définir la variable $taxonomy_to_sort avec taxonomy slug et de la placer dans functions.php de votre thème.

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

Il y a beaucoup de messages similaires sur le forum, si vous regardez autour de vous.

Vous n'avez pas de chiffres . Par conséquent, vous ne pouvez pas trier numériquement. Vous devez trier par ordre alphabétique et cela vous donnera le motif que vous voyez. Honnêtement, je ne suis même pas sûr si get_terms prend en charge un tri numérique (en un coup d'œil, je dirais que non), car je doute que de nombreux termes soient entièrement composé de chiffres.

Vous avez plusieurs options.

  1. Ecrivez votre propre requête SQL. Je pense, mais je ne suis pas sûr, que vous pouvez le faire en SQL pur, mais ce serait délicat - il vous faudrait substr le nom du terme et trier sur cela. Ce serait poilu et probablement pas très efficace.
  2. Si vous tirez quelques termes à la fois, vous pouvez les trier dans PHP avant de les afficher. Vous devez faire la même chose que dans le code SQL et substr le nom, le trier et le reconstituer. Toute pagination serait problématique avec cette approche.
1
s_ha_dum

Où sont ces problèmes racine?

Tout d'abord, vous demandez de trier une partie qui est dans une chaîne. Ceci est pas de fonctionnalité native dans aucun langage de programmation .

Deuxièmement, votre problème actuel n’est pas de "trier par numéro", mais de la façon dont vous avez construit ces nombres. Si vous aviez connu ce problème devant vous (et l'aviez pris en compte), vous auriez pu écrire un filtre qui compense ces zéros devant vos chiffres.

Comment ignorer le problème et le contourner.

Cela ne résout pas vraiment le problème , mais comme nous (et peut-être vous aussi) ne savons pas combien de "problèmes" vous pourriez rencontrer (10, 1k, 100k ?), nous ajoutons simplement le tri lors de son affichage. Voici une balise de modèle à utiliser:

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