WordPress : Renvoi de la taxonomie personnalisée dans l’ordre des limaces
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 :
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_terms
ne 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_terms
n’a aucune option de tri. Mais, vous pouvez utiliser usort
pour 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_alphabetically
La 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_terms
renvoie un objet. Donc, l’utilisation $a['slug']
provoquait l’erreur.
Ici, so980_sort_terms_alphabetically
devrait ê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/>';
}
0 commentaire