web-dev-qa-db-fra.com

get_terms orderby numérique

J'essaie de commander mes termes numériques. Mais le problème est que nog chaque terme est numérique. J'ai donc les termes suivants (vérifier l'image ci-dessous) dont certains sont des dimensions et d'autres sont. Comme vous pouvez le constater, ma fonction get_terms() les ordonne par nom, mais si elles sont numériques, elle ne regarde que le premier caractère. Donc 1400mm est inférieur à 500mm.

Je ne sais pas par où commencer. Devrais-je essayer de modifier le résultat de get_terms() ou de l’accrocher à la fonction get_terms_orderby () . Mais je ne sais pas comment faire ça.

Mon code pour afficher les termes:

<?php
$taxonomy = 'product-filter';
$parents = get_terms( $taxonomy, array( 'hide_empty' => false, 'parent' => 0, 'orderby' => 'id' ) );
if( ! empty( $parents ) ) {
    foreach( $parents as $parent ) {
        echo '<ul>';
        echo '<h2>' . $parent->name . '</h2>';
        $children = get_terms( $taxonomy, array( 'hide_empty' => false, 'child_of' => $parent->term_id ) );
        foreach( $children as $child ) {
            echo '<li><label><input type="checkbox">' . $child->name . ' (' . $child->count . ')</label></li>'; 
        }
        echo '</ul>';
    }
}
?>

enter image description here

1
Robbert

Vous pouvez utiliser usort pour trier l'objet $children.

La fonction à trier après avoir obtenu l'objet $children peut ressembler à ceci:

usort( $children, function($a, $b) {
    $ai = filter_var($a->name, FILTER_SANITIZE_NUMBER_INT);
    $bi = filter_var($b->name, FILTER_SANITIZE_NUMBER_INT);
    if ($ai == $bi) {
        return 0;
    }
    return ($ai < $bi) ? -1 : 1;
});
1
Tung Du