web-dev-qa-db-fra.com

Liste alphabétique de la catégorie cassée

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>
1
Constantino_A_

RÉPONSE REVISITÉ

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 )

enter image description here

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.

2
Pieter Goosen

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');
1
cybmeta