web-dev-qa-db-fra.com

Ajouter un nom à la fonction the_category ()?

est-il possible d'utiliser add_filter ou quelque chose de similaire pour ajouter la slug de la catégorie comme nom de classe à la fonction the_category()?

À l'heure actuelle, lorsque vous utilisez the_category(), la sortie ressemble à ceci…

<ul class="post-categories">
    <li>
        <a href="http://mysite.com/something" title="" rel="category tag">News</a>
    </li>
</ul>

Est-il possible d'obtenir ceci d'une manière ou d'une autre…

<ul class="post-categories">
    <li class="category-news">
        <a href="http://mysite.com/something" title="" rel="category tag">News</a>
    </li>
</ul>

Ou quelque chose de similaire, au moins un nom de classe avec le slug de la catégorie afin que je puisse le sélectionner via CSS?

Merci d'avance, matt.

1
mathiregister

Commencez par localiser the_category() dans le Codex . Faites défiler la page jusqu'en bas jusqu'à "Code source". Il existe un lien "the_categfory() se trouve dans ...". Cliquez sur le lien, vous serez redirigé vers le code source . Ouvrez alternativement le fichier wp-includes/category-template.php dans votre IDE ou votre éditeur.

Recherchez maintenant function the_category(). Vous verrez que la fonction appelle une autre fonction get_the_category_list(). Recherchez également cette fonction. Et maintenant, lisez le code et recherchez apply_filters() ou add_action()

Comme vous pouvez le constater, un seul appel apply_filters() se trouve à la fin de la fonction. Si vous lisez attentivement le code, vous savez maintenant que vous ne pouvez filtrer que le complete html créé par the_category().

Il y a plusieurs façons de modifier le code HTML. DOMDocument est l’un d’eux, un bon vieux preg_replace_callback() un autre.

function add_class_callback( $result ) {

  $class = strtolower( $result[2] );
  $class = str_replace( ' ', '-', $class );
  // do more sanitazion on the class (slug) like esc_attr() and so on

  $replacement = sprintf( ' class="%s">%s</a>', $class, $result[2] );
  return preg_replace( '#>([^<]+)</a>#Uis', $replacement, $result[0] );

}

function add_category_slug( $html ) {

  $search  = '#<a[^>]+(\>([^<]+)\</a>)#Uuis';
  $html = preg_replace_callback( $search, 'add_class_callback', $html );

  return $html;
}

add_filter( 'the_category', 'add_category_slug', 99, 1 );

C'est facile, n'est-ce pas? Appliquez un filtre sur le crochet the_category. Recherchez <a followed by some chars but not >[group the chars until <]</a>, transmettez le résultat à la fonction de rappel. La fonction de rappel récupère un tableau avec tous les résultats de la recherche, nous sélectionnons le dernier, ceci est le texte du lien. Ensuite, créez une classe à partir du texte, nettoyez-la bien (par vous-même). Enfin et surtout, insérez l'attribut de classe et renvoyez le résultat généré à preg_replace_callback() où il est remplacé par le résultat de la recherche.

Oui, j'aime beaucoup les manipulations DOM ... non;)

Oh j'ai oublié. Vous pouvez le faire aussi avec jQuery. Recherchez la classe '.post-categories', grep toutes les balises de lien dans une balise de liste, parcourez le résultat et récupérez les attributs href, convertissez-le en un nom de classe propper, ajoutez la classe avec .addClass(class) à la balise de lien.

6
Ralf912

Bien que la désinfection de classNames puisse être très difficile dans certaines langues, je préfère le commentaire de @ powerbuoy et j'ai compris cela:

function yourTheme_category_class($thelist){
  $categories = get_the_category();

  if ( !$categories || is_wp_error($categories) ) {
    return $thelist;
  }

  $output = '<ul class="post-categories">';
  foreach ( $categories as $category ) {
    $output .= '<li class="category-' . $category->slug . '"><a href="' . esc_url(get_category_link($category->term_id)) . '">' . $category->name . '</a></li>';
  }
  $output .= '</ul>';

  return $output;
}
add_filter( 'the_category', 'yourTheme_category_class');

j'espère que cela peut aider, applaudissements

2
Thomas Fellinger