Icons in Themes ausgeben
So nutzt du Easy-SVG-Icons in klassischen und Block-Themes: easy_svg_icon(), Shortcode, Icon-Block, Barrierefreiheit, Filter, Caching und Farben.
Tutorial · Easy SVG
Easy SVG hält auf deiner Website eine Bibliothek bereinigter SVG-Icons. In diesem Tutorial siehst du die drei Wege, ein Icon auf eine Seite zu bringen, wie du jeden davon barrierefrei machst, wie du Icons mit CSS in Größe und Farbe steuerst und wie du ihr Markup mit Filtern änderst. Jedes Snippet funktioniert mit Easy SVG 5.4.
easy_svg_icon()
PHP-Templates, jede WordPress-Version.
[easy_svg_icon]
Inhalte, in denen niemand PHP schreibt.
Icon-Block
Der Editor, ab WordPress 7.1.
Filter
Das Markup auf dem Weg nach draußen ändern.
Bevor du loslegst
Bibliothek einschalten
Geh zu Icons, Einstellungen und schalte die Icon-Bibliothek ein. Die Template-Funktion läuft auch ohne den Schalter, aber Shortcode und Icon-Sammlung für den Block werden nur registriert, solange er an ist. Der Schalter wirkt ab der nächsten Anfrage.
Icons hinzufügen
Gib unter Icons, Icon-Bibliothek einem Icon einen Namen und wähle ein SVG, oder nimm SVGs aus der Mediathek. Jede Datei läuft vor dem Speichern durch den Sanitizer der Website, die Größengrenze und einen Härtungsschritt.
Slug merken
Jedes Icon hat einen Slug aus seinem Namen: Arrow left wird zu arrow-left. War der Name vergeben, hängt WordPress -2 an. Der Kopieren-Knopf an jedem Icon gibt dir die genaue Form für PHP, Shortcode und Block.
Welcher Weg passt
| Wo | Weg | WordPress | Zeichnet |
|---|---|---|---|
PHP-Template, render.php | easy_svg_icon() | ab 6.6 | die gespeicherte Datei |
| Beitragsinhalt, Widgets, Builder | [easy_svg_icon] | ab 6.6 | die gespeicherte Datei |
| Block-Editor, Patterns, Block-Themes | Icon-Block, Sammlung "Easy SVG" | ab 7.1 | eine Kopie in der Registry (Pfade und Polygone) |
| PHP, gleiche Optik wie der Block | wp_get_icon( 'easy-svg/slug' ) | ab 7.1 | die Kopie in der Registry |
Der Unterschied in der letzten Spalte zählt: Der Icon-Block und wp_get_icon() zeichnen, was die Icon-Registry von WordPress behält, und das sind nur Pfade und Polygone. Easy SVG baut Kreise, Rechtecke, Linien und Umriss-Striche um, damit die meisten Icons trotzdem richtig aussehen, aber Verläufe, Masken, Text und title-Elemente überleben dort nicht. easy_svg_icon() und der Shortcode geben die gespeicherte Datei unverändert aus.
Icons in PHP-Templates
easy_svg_icon() gibt das Markup zurück, du gibst es mit echo aus. Übergib einen reinen Slug oder easy-svg/slug.
<a class="site-header__search" href="<?php echo esc_url( home_url( '/?s=' ) ); ?>">
<?php echo easy_svg_icon( 'search', array( 'class' => 'icon' ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<span><?php esc_html_e( 'Search', 'mytheme' ); ?></span>
</a>
Pack das Ergebnis nicht in esc_html() oder wp_kses_post(): Beide zerstören SVG. Das Markup darf so ausgegeben werden, weil es beim Speichern bereinigt und gehärtet wurde.
Ein Theme sollte nicht kaputtgehen, wenn das Plugin fehlt oder ein Icon gelöscht wurde. Kapsel den Aufruf einmal:
/**
* Gibt ein Icon aus Easy SVG aus, oder nichts.
*
* @param string $name Icon slug or easy-svg/slug.
* @param array $args class, label, decorative.
*/
function mytheme_the_icon( $name, $args = array() ) {
if ( ! function_exists( 'easy_svg_icon' ) ) {
return;
}
echo easy_svg_icon( $name, $args ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
Icons im Inhalt: der Shortcode
[easy_svg_icon name="easy-svg/heart" class="icon" label="Favourite"]
Er nimmt name (Pflicht), class und label und gibt genau das aus, was easy_svg_icon() ausgibt. Solange die Icon-Bibliothek ausgeschaltet ist, ist der Shortcode nicht registriert und erscheint als reiner Text.
Gibt dein Theme ein eigenes Feld aus, das den Shortcode enthalten kann, ruf do_shortcode() zuletzt auf, nach jedem Escaping, sonst wird das SVG entfernt:
$note = wp_kses_post( get_post_meta( get_the_ID(), 'mytheme_note', true ) );
echo do_shortcode( $note ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
Icons im Block-Editor
Ab WordPress 7.1 fügst du einen Icon-Block ein und wählst in seiner Auswahl die Sammlung "Easy SVG". Die Sammlung erscheint, sobald die Bibliothek ein gültiges Icon enthält. In einem Pattern oder Block-Template schreibst du:
<!-- wp:icon {"icon":"easy-svg/arrow-right"} /-->
In PHP liefert dir wp_get_icon( 'easy-svg/arrow-right', array( 'size' => 20 ) ) dieselbe Zeichnung, die der Block zeigt. Beachte: Der Core setzt width und height auf 24 Pixel, außer du übergibst eine andere size, oder null, um die eigene Größe der Datei zu behalten.
Wird ein Icon gelöscht, zeigen Icon-Blöcke, die es genutzt haben, im Editor einen Hinweis und auf der Seite nichts.
Barrierefreiheit
Jedes Icon ist entweder Dekoration oder Inhalt. Entscheide das je Einsatz, nicht je Icon.
| Du willst | Argumente für easy_svg_icon() | Shortcode | Ausgabe am svg |
|---|---|---|---|
| Dekoration neben Text | keine | kein label | aria-hidden="true" focusable="false" |
| Einziger Inhalt eines Links oder Knopfs | label | label="..." | role="img" focusable="false" aria-label="..." |
| Bedeutungstragend, mit dem Titel aus der Bibliothek | decorative false | nicht möglich | role="img" und aria-label mit dem gespeicherten Titel |
| Versteckt, obwohl ein Label existiert | decorative true | nicht möglich | aria-hidden="true" focusable="false" |
Faustregeln:
- Sagt der sichtbare Text neben dem Icon schon dasselbe, ist das Icon dekorativ. Ein Label würde Screenreader es doppelt sagen lassen.
- Ein Knopf oder Link nur mit Icon braucht ein Label. Übersetze es:
__( 'Close', 'mytheme' ). - Easy SVG gibt nie
role="img"ohne Namen aus. Markierst du ein Icon als bedeutungstragend ohne Label, fällt der Name auf den gespeicherten Titel zurück, sonst auf den Slug als Wörter. focusable="false"verhindert, dass alte Versionen von Internet Explorer und Edge das SVG zum Tab-Stopp machen.- Ein
title-Element im SVG zeigt beim Überfahren einen Tooltip, verlass dich aber nicht darauf als zugänglichen Namen. Nimmlabel. Eintitlekannst du mit dem Filtereasy_svg_icon_markupergänzen (Beispiel unten), im Icon-Block kommt es nicht an.
Größe und Farbe mit CSS
Easy SVG setzt in Templates und im Shortcode kein width und kein height. Ein SVG mit nur einer viewBox füllt seinen Container, gib deiner Icon-Klasse also eine Größe:
.icon {
display: inline-block;
width: 1em;
height: 1em;
vertical-align: -0.125em;
flex-shrink: 0;
}
Damit die Farbe dem Text folgt, darf das SVG sie nicht fest eintragen. Zwei Fälle:
- Gefüllte Icons ohne eigenes
fillnehmen die Farbe aus dem CSS: Ergänzefill: currentColor;in.icon. Icons mitfill="#000"an ihren Pfaden bleiben schwarz. Bereinige die Datei, oder entferne das Attribut mit einem Filter. - Umriss-Icons (Feather, Lucide, Tabler, Heroicons Outline) nutzen meist
stroke="currentColor"undfill="none". In Templates folgen sie der Textfarbe, so wie sie sind. Im Icon-Block trägt Easy SVG den Strich als Klassen, und sein Strich-Stylesheet setztstroke: currentColormit der ursprünglichen Stärke (1, 1.25, 1.5, 1.75, 2, 2.5 oder 3, andere Stärken fallen auf 1 zurück). Auch eine feste Strichfarbe wird dort zucurrentColor.
Willst du die Strichstärke von Umriss-Icons in Templates ändern, zielst du auf die Formen, denn dort steht die Stärke:
.icon--bold path,
.icon--bold circle,
.icon--bold line,
.icon--bold polyline,
.icon--bold rect {
stroke-width: 2.5;
}
Markup mit Filtern ändern
Zwei Filter, zwei Ausgabewege:
| Filter | Wirkt auf | Läuft |
|---|---|---|
easy_svg_icon_markup | easy_svg_icon() und den Shortcode | einmal je ausgegebenem Icon |
easy_svg_registrable_icons | Icon-Block und wp_get_icon() | einmal je Anfrage, auf init |
Einem Icon in Templates einen Tooltip-Titel geben:
add_filter( 'easy_svg_icon_markup', 'mytheme_icon_tooltip', 10, 3 );
function mytheme_icon_tooltip( $markup, $slug, $collection ) {
if ( 'easy-svg' !== $collection || 'info' !== $slug || '' === $markup ) {
return $markup;
}
$title = '<title>' . esc_html__( 'More information', 'mytheme' ) . '</title>';
return preg_replace( '/(<svg\b[^>]*>)/i', '$1' . $title, $markup, 1 );
}
Interne Icons in der Auswahl des Editors verstecken, während Templates sie weiter nutzen:
add_filter( 'easy_svg_registrable_icons', 'mytheme_hide_internal_icons' );
function mytheme_hide_internal_icons( $icons ) {
return array_values(
array_filter(
(array) $icons,
static function ( $icon ) {
return 0 !== strpos( (string) ( $icon['slug'] ?? '' ), 'internal-' );
}
)
);
}
Beide Filter geben aus, was du zurückgibst, ohne Escaping. Gib nie Markup aus einer Anfrage, einem Benutzerfeld oder von einem fremden Server zurück, ohne es vorher durch easy_svg_sanitizer() und easy_svg_harden_icon_markup() zu schicken. Baust du aus $slug einen Dateipfad, prüf ihn gegen EASY_SVG_ICON_NAME_PATTERN: Im Shortcode schreibt den Slug, wer den Beitrag bearbeitet.
Caching
Meist musst du nicht darüber nachdenken, aber es hilft zu wissen, was zwischengespeichert wird:
- Templates und Shortcode. Jeder Aufruf sucht das Icon mit
get_page_by_path(). WordPress hält diese Antwort im Objekt-Cache, bis sich irgendein Beitrag ändert, dasselbe Icon zweimal auf einer Seite kostet also eine Abfrage. Mit persistentem Objekt-Cache überlebt das auch zwischen Anfragen. Deine Callbacks aufeasy_svg_icon_markupwerden nicht zwischengespeichert, teure Arbeit cachst du selbst. - Icon-Block. Die Icon-Liste, die WordPress bekommt, liegt einen Tag im Transient
easy_svg_icons, verknüpft mit der Optioneasy_svg_icons_version. Hinzufügen, Ersetzen, Umbenennen oder Löschen eines Icons über das Plugin, WP-CLI oder einen Importer erhöht die Version, die nächste Anfrage ist also aktuell.easy_svg_registrable_iconsläuft bei jeder Anfrage zusätzlich zu diesem Cache. - Seiten-Caches. Ein Ganzseiten-Cache (Plugin oder CDN) liefert nach dem Ersetzen eines Icons weiter altes HTML. Leere ihn wie nach jeder Inhaltsänderung.
Checkliste
- Die Bibliothek ist eingeschaltet, wenn du Shortcode oder Icon-Block nutzt.
- Template-Aufrufe sind in
function_exists( 'easy_svg_icon' )gekapselt. - Links und Knöpfe nur mit Icon haben ein übersetztes
label, Icons neben Text haben keins. - Deine Icon-Klasse setzt
width,heightund bei gefüllten Iconsfill: currentColor. - Nichts maskiert das Icon-Markup, nachdem es ausgegeben wurde.
- Filter geben für jedes Icon, das sie nicht behandeln, das Original-Markup zurück.