Dans la version 3.6.1 et inférieure, cela fonctionnait. Après la mise à jour de WordPress vers la version 3.9.1, ma liste de catégories est cassée.
Dans la version 3.6.1, ma liste de catégories ressemblait à ceci
A|B|C
(A) (B) (C)
Apple Bat Cat
Après la mise à niveau vers la version 3.9.1, cela ressemble à ceci
A|B|C
(A) (B) (C)
Apple Apple Apple
Bat Bat Bat
Cat Cat Cat
C'est le code qui a fonctionné en 3.6.1. Quelqu'un peut-il suggérer une solution pour que cela fonctionne dans la version 3.9.1?
<?php
$a = array('name__like' => "a", 'order' => 'ASC', 'title_li' => '0', 'use_desc_for_title' => '0');
$b = array('name__like' => "b", 'order' => 'ASC', 'title_li' => '0', 'use_desc_for_title' => '0');
?>
<div class="menu-alpha">
<ul>
<li><a href="#A">A</a></li>
<li><a href="#B">B</a></li>
</ul>
</div>
<div id="left-side">
<div class="alpha"><a name="A">A</a></div>
<ul>
<?php wp_list_categories($a); ?>
</ul>
<div class="alpha"><a name="B">B</a></div>
<ul>
<?php wp_list_categories($b); ?>
</ul>
Je viens de faire le même type de réponse sur SO et j'ai emprunté un autre itinéraire beaucoup plus rapide que ma réponse d'origine. J'ai pensé qu'il serait bien de revoir cette réponse et de publier ma nouvelle approche pour le bénéfice de ce site.
Le paramètre name__like
de get_terms
a été modifié dans Wordpress 3.7. Il ne récupère plus les noms de terme avec une première lettre spécifiée, mais récupère un nom de terme s'il contient la lettre spécifiée
En outre, si vous essayez d'exécuter votre code 26 fois, vous aurez des problèmes de temps de chargement de page.
Voici mon approche et les résultats du test
Résultats du test: 1 requête en 0.01074 secondes.
Résultat du test: ( Veuillez noter que mon site de test est en afrikaans, tous les noms sont des noms de terme )
Voici le code qui le fait
$terms = get_terms('pa_manufacturer');
if ( !empty( $terms ) && !is_wp_error( $terms ) ){
$term_list = [];
foreach ( $terms as $term ){
$first_letter = strtoupper($term->name[0]);
$term_list[$first_letter][] = $term;
}
unset($term);
echo '<ul class="my_term-archive">';
foreach ( $term_list as $key=>$value ) {
echo '<h2 class="term-letter">' . $key . '</h2>';
foreach ( $value as $term ) {
echo '<li><a href="' . get_term_link( $term ) . '" title="' . sprintf(__('View all post filed under %s', 'my_localization_domain'), $term->name) . '">' . $term->name . '</a></li>';
}
}
echo '</ul>';
}
COMMENT FONCTIONNE LE CODE
La meilleure approche est d’obtenir tous les termes en une fois pour éviter les hits inutiles. Vous pouvez maintenant transmettre le résultat de get_terms
à travers une boucle foreach
.
Ici, vous allez avoir recours à vos termes. La première chose à faire est de créer un nouveau tableau, $term_list
, d'obtenir la première lettre du nom de chaque terme, puis d'affecter cette lettre en tant que clé dans le nouveau tableau. Les valeurs pour chaque clé contiendront un tableau du terme info
Ce nouveau tableau sera utilisé pour afficher les noms de termes sous chaque lettre, comme vous pouvez le voir dans l'image ci-dessus.
Vous utilisez la fonction wp_list_categories()
avec le paramètre name__like
mais ce paramètre n'est pas valide pour cette fonction (je ne pense pas que votre code fonctionne comme vous le décrivez dans WP 3.6+). Vous pouvez utiliser get_terms
. Par exemple:
<?php
function cyb_get_categories_list_name_like($letter) {
$categories = get_terms( 'category', array('name__like' => $letter) ) ;
$list = '';
if( !empty( $categories ) && !is_wp_error( $categories ) ) {
$list = '<ul>';
foreach( $categories as $cat ) {
$list .= '<li><a href="'.get_term_link($cat).'">'.$cat->name.'</a></li>';
}
$list = '</ul>';
}
return $list;
}
<div class="menu-alpha">
<ul>
<li><a href="#A">A</a></li>
<li><a href="#B">B</a></li>
</ul>
</div>
<div id="left-side">
<div class="alpha"><a name="A">A</a></div>
<?php cyb_get_categories_list_name_like('a'); ?>
<div class="alpha"><a name="B">B</a></div>
<?php cyb_get_categories_list_name_like('b'); ?>
</div>
?>
Comme l'a souligné Pieter Goosen, un filtre est nécessaire pour que le paramètre name__like ne corresponde qu'à la première lettre du terme:
//Credit here @s_ha_dum
function old_style_name_like_wpse_123298($clauses) {
remove_filter('term_clauses','old_style_name_like_wpse_123298');
$pattern = '|(name LIKE )\'%(.+%)\'|';
$clauses['where'] = preg_replace($pattern,'$1 \'$2\'',$clauses['where']);
return $clauses;
}
add_filter('terms_clauses','old_style_name_like_wpse_123298');