easy_svg_icon_markup
Filtere das SVG-Markup eines Icons, bevor easy_svg_icon() und der Shortcode es ausgeben, oder liefere darüber eine ganz eigene Icon-Sammlung aus.
Filter · Easy SVG · Status: Stabil
Mit easy_svg_icon_markup änderst du das SVG eines Icons, kurz bevor easy_svg_icon() oder der Shortcode [easy_svg_icon] es ausgibt. Du kannst die eigenen Icons des Plugins anpassen oder für eine Sammlung antworten, die Easy SVG nicht kennt, sodass easy_svg_icon( 'acme/logo' ) das Icon deines Add-ons ausgibt.
Verwendung
add_filter( 'easy_svg_icon_markup', 'myplugin_icon_markup', 10, 3 );
function myplugin_icon_markup( string $markup, string $slug, string $collection ): string {
return $markup;
}
Wann du es brauchst
- Du willst Icons auf dem Weg ins Template ein
title-Element,widthundheightoder ein data-Attribut mitgeben. - Du willst eine eigene Sammlung (ein Add-on, einen Theme-Ordner mit SVG-Dateien) über die eine Template-Funktion und den Shortcode ausliefern, die die Website schon nutzt.
- Du willst auf einer bestimmten Website ein Icon gegen ein anderes tauschen, ohne Templates anzufassen.
Wann nicht:
- Um zu ändern, was der Core-Block Icon oder
wp_get_icon()zeichnet. Die lesen das Markup, das beiminitan die Icon-Registry von WordPress übergeben wurde. Dafür gibt eseasy_svg_registrable_icons. - Um eine CSS-Klasse oder ARIA-Attribute zu setzen. Übergib
classundlabelaneasy_svg_icon(), die Funktion setzt sie nach diesem Filter.
Parameter
Für die Sammlung easy-svg: der gespeicherte post_content des esw_icon-Beitrags mit diesem Slug, also bereinigtes und gehärtetes Markup, oder ein leerer String, wenn es kein solches Icon gibt. Für jede andere Sammlung: immer ein leerer String, das Icon lieferst also du.
Der Teil des Namens nach dem ersten Schrägstrich, so wie der Aufrufer ihn geschrieben hat, ungeprüft. easy_svg_icon( 'acme/logo' ) übergibt logo, easy_svg_icon( 'heart' ) übergibt heart. Behandle ihn als nicht vertrauenswürdige Eingabe: Im Shortcode kommt er von dem, der den Beitrag geschrieben hat.
Der Teil vor dem ersten Schrägstrich, oder easy-svg, wenn der Name keinen hatte.
Rückgabewert
Das Markup, das verwendet wird. Es wird in einen String umgewandelt. Ein leerer String heißt "kein Icon": easy_svg_icon() gibt dann einen leeren String zurück und setzt keine Attribute. Alles andere wird so ausgegeben, wie es ist, nachdem easy_svg_icon() Klasse und ARIA-Attribute in den ersten svg-Tag eingesetzt hat.
Standardwert
Das gespeicherte Markup für Icons aus easy-svg, ein leerer String für alles andere.
Beispiele
Einem Icon eine feste Größe geben
add_filter( 'easy_svg_icon_markup', 'mytheme_size_logo_icon', 10, 3 );
function mytheme_size_logo_icon( $markup, $slug, $collection ) {
if ( 'easy-svg' !== $collection || 'logo' !== $slug || '' === $markup ) {
return $markup;
}
return preg_replace( '/^(\s*<svg)\b/i', '$1 width="120" height="32"', $markup, 1 );
}
Fass nur Markup an, das du erkennst, und gib sonst immer das Original zurück.
Eine Sammlung aus deinem Theme ausliefern
Die Dateien liegen in wp-content/themes/mytheme/icons/*.svg. easy_svg_icon( 'mytheme/arrow' ) und [easy_svg_icon name="mytheme/arrow"] geben dann icons/arrow.svg aus, bereinigt wie die eigenen Icons des Plugins.
add_filter( 'easy_svg_icon_markup', 'mytheme_icon_collection', 10, 3 );
function mytheme_icon_collection( $markup, $slug, $collection ) {
if ( 'mytheme' !== $collection || '' !== $markup ) {
return $markup;
}
// Der Slug ist Benutzereingabe: nur Namen, die Easy SVG selbst akzeptieren würde.
if ( ! defined( 'EASY_SVG_ICON_NAME_PATTERN' ) || 1 !== preg_match( EASY_SVG_ICON_NAME_PATTERN, $slug ) ) {
return '';
}
$cache_key = 'mytheme_icon_' . $slug;
$cached = wp_cache_get( $cache_key, 'mytheme' );
if ( false !== $cached ) {
return $cached;
}
$file = get_theme_file_path( 'icons/' . $slug . '.svg' );
if ( ! is_readable( $file ) ) {
return '';
}
$sanitizer = function_exists( 'easy_svg_sanitizer' ) ? easy_svg_sanitizer() : null;
if ( null === $sanitizer || ! function_exists( 'easy_svg_harden_icon_markup' ) ) {
return '';
}
$clean = $sanitizer->sanitize( (string) file_get_contents( $file ) );
$clean = is_string( $clean ) ? easy_svg_harden_icon_markup( $clean ) : '';
wp_cache_set( $cache_key, $clean, 'mytheme', HOUR_IN_SECONDS );
return $clean;
}
Einen Titel als Tooltip ergänzen
Ein title als Kindelement erscheint beim Überfahren mit der Maus als Tooltip. Nutz es zusätzlich zu label, nicht stattdessen.
add_filter( 'easy_svg_icon_markup', 'myplugin_icon_title', 10, 3 );
function myplugin_icon_title( $markup, $slug, $collection ) {
if ( 'easy-svg' !== $collection || 'info' !== $slug || '' === $markup ) {
return $markup;
}
$title = '<title>' . esc_html__( 'More information', 'myplugin' ) . '</title>';
return preg_replace( '/(<svg\b[^>]*>)/i', '$1' . $title, $markup, 1 );
}
Defensiv: nur, wenn das Plugin den Filter hat
add_action( 'plugins_loaded', 'myplugin_hook_icons' );
function myplugin_hook_icons() {
if ( ! function_exists( 'easy_svg_icon' ) ) {
return; // Easy SVG ist nicht aktiv.
}
add_filter( 'easy_svg_icon_markup', 'myplugin_icon_title', 10, 3 );
}
Was dein Callback zurückgibt, wird ohne Escaping in jede Seite geschrieben, die das Icon nutzt. Gib nie Markup aus einer Anfrage, einem Benutzerfeld oder von einer fremden URL zurück, ohne es zu bereinigen. Schick dein eigenes SVG durch easy_svg_sanitizer() und danach durch easy_svg_harden_icon_markup(), wie im Beispiel mit der Theme-Sammlung. Der Härter entfernt script, style, foreignObject, Animationselemente, jedes on-Attribut und jedes href, das nicht in die Zeichnung selbst zeigt. Und prüf $slug, bevor du daraus einen Dateipfad baust: ../ in einem Shortcode-Attribut ist eine Path Traversal.
So funktioniert es
Der Filter läuft in easy_svg_icon_markup(), das jeder Ausgabeweg aufruft:
- Er läuft einmal pro Aufruf von
easy_svg_icon(), also einmal pro ausgegebenem Icon. Niemand speichert das gefilterte Ergebnis zwischen, teure Arbeit cachst du selbst, wie im Beispiel mit der Theme-Sammlung. - Er läuft unabhängig davon, ob die Icon-Bibliothek eingeschaltet ist, und unter jeder WordPress-Version, denn die Template-Funktion braucht keine Icon-Registry des Cores.
- Der Core-Block Icon und
wp_get_icon()rufen ihn nie auf. - Easy SVG Pro liefert seine eigenen Sammlungen über genau diesen Filter durch
easy_svg_icon()aus.
Stolperfallen
- Die Standard-Rückgabe vergessen. Ein Callback, der für Icons, die er nicht behandelt, nichts (oder
null) zurückgibt, macht jedes Icon der Website zum leeren String. Gib auf jedem Weg$markupzurück. - Anzahl der Argumente. Registriere mit
10, 3, sonst kommen$slugund$collectionnie an. - Hier
classsetzen.easy_svg_icon()fügt sein eigenesclass-Attribut vor deinem ein, wenn der Aufrufer eins übergibt, und Browser behalten von zweiclass-Attributen das erste. Lass die Aufrufer die Klasse übergeben. - Ein leeres
easy-svg-Icon füllen. Markup für einen fehlendeneasy-svg-Slug wirkt in der Template-Funktion, aber nicht im Icon-Block. Redakteure und Theme sehen dann Unterschiedliches. - Teure Callbacks. Eine Seite mit 40 Icons ruft dich 40-mal auf.