easy_svg_max_use_tags
Lege fest, wie viele use-Elemente ein SVG enthalten darf, bevor Easy SVG es ablehnt. Gezählt wird in der rohen Datei, noch vor dem Sanitizer.
Filter · Easy SVG · Status: Stabil
Ein SVG kann eine Form mit use-Elementen beliebig oft wiederholen, jedes verweist über eine id auf ein anderes Element. Tausende davon machen das Bereinigen sehr langsam, auch bei einer kleinen Datei. Easy SVG zählt sie vorher und lehnt die Datei ab, wenn es mehr als 1000 sind. Mit diesem Filter änderst du diese Zahl.
Verwendung
apply_filters( 'easy_svg_max_use_tags', int $max )
Wird in easy-svg.php innerhalb von easy_svg_svg_too_complex() angewendet. Das Ergebnis wird in eine Ganzzahl umgewandelt.
Wann du es brauchst
- Eine echte Zeichnung, die du brauchst, wird abgelehnt, zum Beispiel eine Karte oder ein Musterbogen, der ein Symbol einige Tausend Mal wiederholt, und du vertraust den Leuten, die sie hochladen.
- Du willst strenger sein, etwa 200 auf einer Website, die nur Icons speichert.
Lass es bleiben, wenn:
- die Datei wegen ihrer Größe abgelehnt wird. Dafür gibt es
easy_svg_max_bytes. - der Sanitizer deine
use-Verweise entfernt. Das liegt an der Erlaubt-Liste oder an den externen Verweisen, nicht an dieser Grenze.
Parameter
Die höchste Anzahl an use-Elementen, die eine Datei enthalten darf. Standard 1000. Im Icons-Bildschirm gibt es dafür keine Einstellung.
Rückgabewert
Die Grenze. Abgelehnt wird, wenn die Anzahl größer als diese Zahl ist: Mit 1000 kommt eine Datei mit genau 1000 durch, eine mit 1001 nicht. Gib 0 zurück, um jede Datei abzulehnen, die überhaupt ein use-Element enthält.
Standardwert
1000
Beispiele
Nur Icons, also eine viel kleinere Grenze
/**
* Ein Icon braucht nie Hunderte use-Elemente.
*/
function mysite_svg_max_use_tags( $max ) {
return 200;
}
add_filter( 'easy_svg_max_use_tags', 'mysite_svg_max_use_tags' );
Eine höhere Grenze nur für Administratoren
/**
* Detaillierte Karten vom Design-Team wiederholen eine Markierung ein paar Tausend Mal.
*/
function mysite_svg_max_use_tags_for_admins( $max ) {
if ( current_user_can( 'manage_options' ) ) {
return 5000;
}
return $max;
}
add_filter( 'easy_svg_max_use_tags', 'mysite_svg_max_use_tags_for_admins' );
Anheben, aber nie über eine feste Obergrenze
function mysite_svg_max_use_tags_capped( $max ) {
$wanted = defined( 'MYSITE_SVG_MAX_USE' ) ? (int) MYSITE_SVG_MAX_USE : (int) $max;
return min( max( 0, $wanted ), 3000 );
}
add_filter( 'easy_svg_max_use_tags', 'mysite_svg_max_use_tags_capped' );
So funktioniert es
easy_svg_svg_too_complex() wandelt das rohe Markup in Kleinbuchstaben um und zählt, wie oft der Text <use vorkommt. Geparst wird nichts:
<use,<USEund<Usezählen alle.- Auch jedes Tag, das mit diesen Buchstaben anfängt, zählt mit, ebenso Text in Kommentaren und CDATA.
- Ein Element mit Präfix wie
<svg:usezählt nicht, weil dort:usesteht und nicht<use.
Abgelehnt wird, wenn diese Anzahl größer ist als das Ergebnis des Filters oder wenn die Zahl der Verarbeitungsanweisungen größer ist als easy_svg_max_php_tags.
Warum es die Grenze gibt: Für jedes use-Element läuft der Sanitizer über jedes Element mit einer id, die Arbeit wächst also mit beiden Zahlen multipliziert. Zählen ist linear und billig und passiert vor dem teuren Teil.
Die Prüfung läuft nach der Größenprüfung und vor dem Sanitizer, auf denselben Wegen wie die anderen Grenzen: Mediathek- und REST-Uploads, Sideloads, das Sicherheitsnetz auf add_attachment (das einen durchgefallenen Anhang löscht), XML-RPC und wp_upload_bits() sowie jeder Weg in die Icon-Bibliothek. In der Mediathek zeigt eine abgelehnte Datei "Bitte überprüfe deine SVG-Datei.", in der Icon-Bibliothek "Dieses SVG hat zu viele Teile, um sicher gelesen zu werden." Der Filter läuft bei jeder Prüfung und bekommt keine Informationen über Datei oder Weg.
Stolperfallen
- Hohe Werte kosten echte Zeit. Der Aufwand wächst mit der Zahl der
use-Elemente mal der Zahl der Elemente mit id. Verdoppelst du die Grenze, kann der schlimmste Fall weit mehr als doppelt so teuer werden. - Die Zählung arbeitet auf Text. Kommentare und ungewöhnliche Tag-Namen, die mit
usebeginnen, können eine Datei über die Grenze schieben, währendsvg:usemit Präfix nicht gezählt wird. - Kein Kontext. Dein Callback kann ein Icon nicht von einem Mediathek-Upload unterscheiden. Brauchst du verschiedene Grenzen, entscheide nach Berechtigung oder Anfrage, nicht nach Datei.
- Ein negativer Wert lehnt alles ab, weil eine Anzahl von 0 immer noch größer als -1 ist.