it-swarm.com.de

Klassenname zur Funktion_category () hinzufügen?

ist es möglich, add_filter oder etwas ähnliches zu verwenden, um die slug der Kategorie als Klassennamen zur the_category() -Funktion hinzuzufügen?

Im Moment sieht die Ausgabe bei Verwendung von the_category() so aus…

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

Ist es möglich, das irgendwie zu bekommen ...

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

Oder etwas ähnliches, zumindest einen Klassennamen mit der slug der Kategorie, damit ich ihn per CSS auswählen kann?

Danke schonmal, matt.

1
mathiregister

Suchen Sie zuerst the_category() im Codex . Scrollen Sie bis zum Ende der Seite zu "Source Code". Es gibt einen Link "the_categfory() befindet sich in ...". Klicken Sie auf den Link, Sie werden zum Quellcode weitergeleitet. Alternativ öffnen Sie die Datei wp-includes/category-template.php in Ihrem IDE oder Editor.

Suchen Sie nun nach function the_category(). Sie werden sehen, dass die Funktion eine andere Funktion get_the_category_list() aufruft. Suchen Sie auch nach dieser Funktion. Und jetzt lies den Code und suche nach apply_filters() oder add_action()

Wie Sie sehen, gibt es am Ende der Funktion nur einen apply_filters()-Aufruf. Wenn Sie den Code sorgfältig lesen, wissen Sie jetzt, dass Sie nur das vollständige HTML filtern können, das von the_category() erstellt wurde.

Es gibt verschiedene Möglichkeiten, den HTML-Code zu ändern. DOMDocument ist eines davon, ein gutes altes preg_replace_callback() ein anderes.

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 );

Das ist doch einfach, oder? Wenden Sie einen Filter auf the_category hook an. Suchen Sie nach <a followed by some chars but not >[group the chars until <]</a> und übergeben Sie das Ergebnis an die Rückruffunktion. Die Rückruffunktion ruft ein Array mit allen Suchergebnissen ab, wir wählen das letzte aus, dies ist der Text des Links. Dann erstellen Sie eine Klasse aus dem Text, bitte bereinigen Sie diese sehr gut (von Ihnen selbst). Zuletzt fügen Sie das Klassenattribut ein und geben das generierte Ergebnis an preg_replace_callback() zurück, wenn es durch das Suchergebnis ersetzt wird.

Ja, DOM-Manipulation gefällt mir sehr gut ... nicht;)

Oh, ich habe es vergessen. Sie können dies auch mit jQuery tun. Suchen Sie nach der Klasse '.post-categories', durchsuchen Sie alle Link-Tags innerhalb eines List-Tags, gehen Sie über das Ergebnis und rufen Sie die href-Attribute ab, konvertieren Sie sie in einen richtigen Klassennamen und fügen Sie die Klasse mit .addClass(class) zum Link-Tag hinzu.

6
Ralf912

Während das Desinfizieren für Klassennamen in einigen Sprachen sehr schwierig sein kann, bevorzuge ich den Kommentar von @ powerbuoy und finde das heraus:

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

ich hoffe, das kann helfen, Prost

2