web-dev-qa-db-fra.com

get_terms name__comme les catégories selon la lettre

Mes catégories sont essentiellement des auteurs et je voudrais créer une fonction pour les lister en fonction de leur nom de famille. Par exemple, j'aimerais avoir quelque chose comme:

E:

  • Heinz Erhardt
  • Albert Einstein
  • Eminem

Le problème, c’est que j’ai aussi des auteurs avec un seul nom (comme "Eminem") que je voudrais également trier selon la lettre E. La seule façon que je connaisse de le faire dans wordpress est avec la fonction get_terms et le name__like.

function getAuthors(){
$args = array(
    'name__like' => 'E',
);
return get_terms('category', $args );
}

cela crée la requête SQL qui ne répertorie que les catégories contenant un "E":

AND t.name LIKE %E%;

J'ai cependant besoin de quelque chose comme:

AND t.name NOT LIKE '% %' AND t.name LIKE E% OR t.name LIKE '% E';

J'ai essayé de changer le code dans la fonction get_terms du fichier de base où la requête est configurée (taxonomies.php, ligne 1809). Cependant, je n'ai pas réussi et je ne voudrais pas changer quelque chose dans les fichiers core.

Comment personnaliser la requête passée par le name__like? Existe-t-il d'autres moyens plus efficaces d'atteindre mon objectif?

--- MODIFIER ---

J'ai utilisé la solution de TheDeadMedic et j'ai pu lister les catégories en fonction d'une lettre en utilisant par exemple get_terms( 'my_taxonomy', 'surname=E' );. Cependant, cet argument surname ne fonctionne pas si je souhaite utiliser la fonction get_terms plusieurs fois sur une page (par exemple en boucle - si I 'souhaitez créer des en-têtes AZ et afficher les catégories triées ci-dessous en dessous des en-têtes).

Voici la fonction que j'essaye d'exécuter. Le problème est qu’il continue de lister les catégories pour surname=A sous chaque en-tête.

function getAuthors()
{
$letters = range('A', 'Z'); // create Alphabet array
foreach ($letters as $letter) {
    echo '<h4>' . $letter . '</h4>';
    $args = array(
        'surname' => $letter
    );
    $cats = get_terms('category', $args);

    foreach ($cats as $cat) {
        echo "<ul>";
        echo "<li>" . $cat->name . "</li>";
        echo "</ul>";
    }
  }
}

L'argument name__like semble cependant fonctionner dans la boucle.

3
ndru

Utilisez le filtre terms_clauses, qui transmet tous les différents composants de la requête (champs, jointure, où, orderby, order & limits) et implémentez votre propre argument "search":

function wpse_178511_get_terms_fields( $clauses, $taxonomies, $args ) {
    if ( ! empty( $args['surname'] ) ) {
        global $wpdb;

        $surname_like = $wpdb->esc_like( $args['surname'] );

        if ( ! isset( $clauses['where'] ) )
            $clauses['where'] = '1=1';

        $clauses['where'] .= $wpdb->prepare( " AND t.name LIKE %s OR t.name LIKE %s", "$surname_like%", "% $surname_like%" );
    }

    return $clauses;
}

add_filter( 'terms_clauses', 'wpse_178511_get_terms_fields', 10, 3 );

Mettre en service:

 get_terms( 'my_taxonomy', 'surname=E' );
5
TheDeadMedic