easy_svg_max_bytes
Lege fest, wie groß ein SVG in Bytes sein darf, das Easy SVG bei Uploads, Importen, XML-RPC und in der Icon-Bibliothek liest. Überschreibt die Einstellung.
Filter · Easy SVG · Status: Stabil
Easy SVG lehnt jedes SVG ab, das größer als eine festgelegte Grenze ist, noch bevor es mit dem Bereinigen anfängt. Admins wählen diese Grenze in Megabyte unter Icons → Einstellungen. Mit diesem Filter bestimmt dein Code die endgültige Zahl in Bytes, zum Beispiel eine Grenze unter 1 MB oder eine eigene Grenze je Benutzer.
Verwendung
apply_filters( 'easy_svg_max_bytes', int $bytes )
Wird in easy-svg.php innerhalb der internen Funktion easy_svg_max_bytes() angewendet. Das Ergebnis wird in eine Ganzzahl umgewandelt.
Wann du es brauchst
- Du willst eine Grenze unter 1 MB. Die Einstellung unter Icons → Einstellungen kennt nur ganze Megabyte ab 1, 300 KB erreichst du also nur über diesen Filter.
- Du willst verschiedene Grenzen für verschiedene Leute, etwa eine knappe für Autoren und die volle für Administratoren.
- Du betreust viele Websites und willst die Grenze aus dem Code oder aus der
wp-config.phpsetzen statt über eine Einstellung, die jeder Admin ändern kann. - Du brauchst auf einer Website eine Grenze über der Obergrenze (standardmäßig 20 MB), ohne die Obergrenze für das Einstellungsfeld anzuheben.
Lass es bleiben, wenn:
- Admins im Einstellungsfeld nur eine höhere Zahl wählen können sollen. Dafür gibt es
easy_svg_max_mb_ceiling. - das Problem eine Datei mit Tausenden
use-Elementen oder vielen Verarbeitungsanweisungen ist. Da geht es nicht um Größe, sieh direasy_svg_max_use_tagsundeasy_svg_max_php_tagsan. - dein Server den Upload ablehnt, bevor WordPress ihn überhaupt sieht. Die PHP-Werte
upload_max_filesizeundpost_max_sizegreifen zuerst, und dieser Filter kann sie nicht anheben.
Parameter
Die Grenze aus den Einstellungen: der gespeicherte Wert "Maximale SVG-Größe (MB)" mal MB_IN_BYTES. Mit der Standardeinstellung von 2 MB sind das 2097152. Der gespeicherte Wert liegt immer zwischen 1 und der Obergrenze, ohne weitere Filter kommen hier also mindestens 1048576 an.
Rückgabewert
Das größte SVG in Bytes, das Easy SVG liest. Abgelehnt wird eine Datei, deren Größe größer als diese Zahl ist, eine Datei mit genau dieser Größe kommt also durch. Gib eine positive Ganzzahl zurück. Der Wert läuft durch (int): Ein String wie "500000" funktioniert, null oder false werden aber zu 0 (siehe Stolperfallen).
Standardwert
max_mb * MB_IN_BYTES, wobei max_mb die Einstellung "Maximale SVG-Größe (MB)" unter Icons → Einstellungen ist. Eine frische Installation nutzt 2 MB, also 2097152 Bytes.
Beispiele
Eine Grenze unter einem Megabyte
/**
* SVG-Dateien bis 300 KB annehmen.
*/
function mysite_svg_max_bytes( $bytes ) {
return 300 * KB_IN_BYTES;
}
add_filter( 'easy_svg_max_bytes', 'mysite_svg_max_bytes' );
Eine kleinere Grenze für alle außer Administratoren
/**
* Autoren und Redakteure bekommen 512 KB, Administratoren behalten die Einstellung.
*/
function mysite_svg_max_bytes_by_role( $bytes ) {
if ( current_user_can( 'manage_options' ) ) {
return $bytes;
}
return min( $bytes, 512 * KB_IN_BYTES );
}
add_filter( 'easy_svg_max_bytes', 'mysite_svg_max_bytes_by_role' );
min() nimmt die kleinere der beiden Zahlen, eine niedrigere Einstellung wirkt also weiter für alle. Denk daran: WP-CLI-Importe und Cron-Jobs laufen ohne angemeldeten Benutzer und bekommen deshalb auch die kleinere Grenze.
Die Grenze aus der wp-config.php, nie null
/**
* In der wp-config.php: define( 'MYSITE_SVG_MAX_KB', 750 );
*/
function mysite_svg_max_bytes_from_config( $bytes ) {
if ( ! defined( 'MYSITE_SVG_MAX_KB' ) ) {
return $bytes;
}
// Nie 0 oder weniger zurückgeben: Das würde jeden Upload ablehnen.
return max( 1, (int) MYSITE_SVG_MAX_KB ) * KB_IN_BYTES;
}
add_filter( 'easy_svg_max_bytes', 'mysite_svg_max_bytes_from_config' );
Dieselbe Grenze im eigenen Add-on nutzen
Nimmt dein Add-on selbst SVG-Markup an, sollte es dieselben Dateien ablehnen wie die Website. Die Funktion easy_svg_max_bytes() ist intern, prüf also, ob es sie gibt, und nimm sonst den Standard.
function myaddon_svg_is_small_enough( $markup ) {
$limit = function_exists( 'easy_svg_max_bytes' ) ? easy_svg_max_bytes() : 2 * MB_IN_BYTES;
return strlen( (string) $markup ) <= $limit;
}
So funktioniert es
Der Filter läuft jedes Mal, wenn die Grenze gebraucht wird. Nichts wird zwischengespeichert: Eine geänderte Einstellung oder ein spät hinzugefügter Filter wirkt sofort. Dein Callback bekommt keine Datei, keinen Pfad und keinen Kontext, nur die Zahl.
Hier wird die Grenze gelesen:
| Wo | WordPress-Hook | Was passiert, wenn die Datei zu groß ist |
|---|---|---|
| Mediathek-Uploader, Block-Editor, REST-Medien-Uploads | wp_handle_upload_prefilter | Upload scheitert mit "Bitte überprüfe deine SVG-Datei." |
media_sideload_image(), WP-CLI wp media import, Importer | wp_handle_sideload_prefilter | Dieselbe Meldung |
XML-RPC und Plugins, die wp_upload_bits() nutzen | wp_upload_bits | "Diese SVG-Datei enthält Inhalte, die diese Website nicht erlaubt. Bitte lade sie über die Mediathek hoch, die sie bereinigt." |
| Jeder neue SVG-Anhang (Sicherheitsnetz) | add_attachment | Anhang und Datei werden gelöscht, ohne Meldung |
| Breite und Höhe für Mediathek und Bild-Block | wp_generate_attachment_metadata, wp_prepare_attachment_for_js | Es werden keine Maße gelesen, abgelehnt wird nichts |
| Icon-Bibliothek: hinzufügen, aus der Mediathek übernehmen, ersetzen | REST-Routen des Icons-Panels | "Dieses SVG ist größer als die im Tab „Einstellungen“ erlaubte Größe." (beim Ersetzen: "Diese Datei ist kein SVG, das diese Bibliothek verwenden kann.") |
Die Hooks für Upload, Sideload und XML-RPC sind nur registriert, solange "SVG-Uploads in der Mediathek erlauben" eingeschaltet ist. Das Sicherheitsnetz auf add_attachment läuft immer.
Bei einem Upload ist die Reihenfolge: Zuerst wird der Dateityp geprüft, dann die Größe auf der Festplatte mit der Grenze verglichen (die Datei ist noch nicht gelesen), dann wird die Datei gelesen und ihre Länge noch einmal verglichen, dann folgt die Strukturprüfung (easy_svg_max_php_tags, easy_svg_max_use_tags) und erst danach der Sanitizer.
Einstellung und Filter greifen so ineinander: Die gespeicherten Megabyte werden auf 1 bis zur Obergrenze begrenzt, mit MB_IN_BYTES multipliziert und dann an diesen Filter übergeben. Das Ergebnis des Filters wird nicht auf die Obergrenze begrenzt, es kann also höher oder niedriger sein als alles, was das Einstellungsfeld zulässt.
Stolperfallen
- Null bedeutet zweierlei. Gibst du
0zurück (odernull,false, eine negative Zahl), wird jeder nicht leere Upload abgelehnt. Die Icon-Bibliothek liest0und weniger aber als "keine Grenze" und nimmt dort jede Größe an. Gib immer eine positive Zahl zurück. - Das Panel kennt deinen Filter nicht. Das Einstellungsfeld zeigt weiter die gespeicherten Megabyte und sagt "Größere Dateien werden abgelehnt. Erlaubt: 1 bis 20 MB." Senkt dein Filter die Grenze, stimmt der Bildschirm für deine Website nicht mehr. Sag es deinen Redakteuren.
- Eine Meldung für drei Gründe. In der Mediathek bekommen zu große, zu komplexe und nicht bereinigbare Dateien alle "Bitte überprüfe deine SVG-Datei." Dass es an der Größe lag, sieht niemand.
- Importe können Dateien löschen. Das Sicherheitsnetz auf
add_attachmentlöscht einen neuen SVG-Anhang samt Datei, wenn er über der Grenze liegt. Senkst du die Grenze vor einem großen Import, werden zu große SVGs entfernt und nicht mit einem Hinweis übersprungen. - Vorhandene Dateien verlieren ihre Maße. Breite und Höhe werden bei jeder Mediathek-Ansicht mit derselben Grenze gelesen. Senkst du die Grenze, erscheinen SVGs, die jetzt zu groß sind, ohne Maße. Gelöscht werden sie nicht.
- Die Server-Grenze kommt zuerst.
upload_max_filesizeundpost_max_sizestoppen größere Uploads, bevor WordPress läuft. Setzt du den Filter höher, ändert das für den Uploader nichts. - Kontexte ohne Benutzer. Callbacks, die nach Rolle entscheiden, sehen in WP-CLI, Cron und manchen Importern keinen Benutzer.