WordPress : Renvoi de la taxonomie personnalisée dans l’ordre des limaces

Publié par Jean-Michel le

J’ai une boucle à extraire des termes de taxonomie personnalisés que j’aimerais commander par slug, mais lorsque j’ajoute la commande ‘orderby’, ma boucle est cassée et ne renvoie rien. J’utilise sans doute une syntaxe incorrecte, mais je ne vois pas où pour la vie de moi!

<?php

$loop = new WP_Query(
    array(
        'post_type'      => 'camp',
        'orderby'        => 'name',
        'order'          => 'ASC',
        'tax_query' => array(
            array(
                'taxonomy' => 'types',
                'field'    => 'slug',
                'terms'    => $term->slug,
            ),
        )
    )
);

if ($loop->have_posts()) :
while ($loop->have_posts()) : $loop->the_post();
$terms = get_lowest_taxonomy_terms(get_the_terms( get_the_ID(), array(
    'taxonomy' => 'destinations',
    'orderby' => 'slug',
    'order' => 'ASC'                                
)) );
?>

Toute aide serait très appréciée 🙂

Fonction supplémentaire ajoutée :

Le get_lowest_taxonomy_terms s’exécute comme suit :

get_lowest_taxonomy_terms( $terms ) {
    // if terms is not array or its empty don't proceed
    if ( ! is_array( $terms ) || empty( $terms ) ) {
        return false;
    }

    $filter = function($terms) use (&$filter) {

        $return_terms = array();
        $term_ids = array();

        foreach ($terms as $t){
            if( $t->parent == 0 ) {
                $term_ids[] = $t->term_id;
            }
        }

        foreach ( $terms as $t ) {
            if( $t->parent == false || !in_array($t->parent,$term_ids) )  {
                //remove this term
            }
            else{
                $return_terms[] = $t;
            }
        }

        if( count($return_terms) ){
            return $filter($return_terms);
        }
        else {
            return $terms;
        }

    };

    return $filter($terms);
}

Sortie désirée

La boucle doit interroger le type de taxonomie ‘destination’, où cette destination a la taxonomie supplémentaire de ‘type’.

Capture d’écran de la sortie actuelle :

entrez la description de l'image ici

Les résultats sont classés en 3 colonnes par CSS, mais comme vous pouvez le voir, pas de tri alphabétique.

Solution n°1 trouvée

get_the_termsne prend pas un tableau comme deuxième paramètre.

get_the_terms( int|object $post, string $taxonomy )

Paramètres:

$post(int|object) (Obligatoire) ID de publication ou objet.

$taxonomy(chaîne) (Obligatoire) Nom de la taxonomie.

Plus de détails surget_the_terms

Par défaut, get_the_termsn’a aucune option de tri. Mais, vous pouvez utiliser usortpour trier le tableau renvoyé.

Ainsi, votre dernière partie du code devrait être :

$terms = get_lowest_taxonomy_terms(get_the_terms( get_the_ID(), 'destinations' ));

Ceci est un exemple rapide de la façon dont vous pouvez le trier en utilisant usort:

$terms = get_the_terms( get_the_ID(), 'destinations' );
usort($terms,"so980_sort_terms_alphabetically");
function so980_sort_terms_alphabetically($a,$b) {
    return $a['slug'] > $b['slug'];//using 'slug' as sorting order
}

so980_sort_terms_alphabeticallyLa fonction doit être dans le fichier de votre thème functions.php.

Donc finalement, votre dernière partie deviendra :

$terms = get_the_terms( get_the_ID(), 'destinations' );
usort($terms,"so980_sort_terms_alphabetically");
$terms = get_lowest_taxonomy_terms($terms);

Mise à jour

Je viens de le tester, et il renvoie une erreur fatale, car j’ai fait une erreur. Message d’erreur : Fatal error: Cannot use object of type WP_Term as array.

get_the_termsrenvoie un objet. Donc, l’utilisation $a['slug']provoquait l’erreur.

Ici, so980_sort_terms_alphabeticallydevrait être mis en œuvre de la manière suivante :

function so980_sort_terms_alphabetically($a,$b) {
    return $a->slug > $b->slug;//using 'slug' as sorting order
}

** Ceci est testé et fonctionne.

Mise à jour 2

Étant donné que vos codes de sortie ne sont pas disponibles dans votre question, je supposerai que vous imprimez à l’intérieur de la boucle. Au lieu de faire cela, nous allons enregistrer les termes renvoyés dans un autre tableau et les trier en dehors de la boucle, afin que nous puissions obtenir tous les termes en même temps.

Voici un exemple rapide de la façon dont vous pouvez le faire :

if ($loop->have_posts()) :
    while ($loop->have_posts()) : $loop->the_post();
        $pre_terms = get_lowest_taxonomy_terms(get_the_terms(get_the_ID(), 'product_tag'));
        if ( $pre_terms ) {
            foreach ( $pre_terms as $pre_term ) {
                $terms[] = $pre_term;
            }
        }
    endwhile;
endif;
usort($terms,"so980_sort_terms_alphabetically");

//a quick test to see if it's working or not
foreach ( $terms as $term ) {
    echo $term->slug;
    echo '<br/>';
}

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *