easy_svg_update_icon_markup()
Ersetze die Zeichnung eines gespeicherten Icons über den SVG-Sanitizer und die Upload-Grenzen der Website, Slug und Name bleiben, Antwort ist ein Statuswort.
Funktion · Easy SVG · Status: Stabil
easy_svg_update_icon_markup() gibt einem vorhandenen Icon eine neue Zeichnung. Das neue SVG durchläuft dieselben Prüfungen wie ein Upload (Größengrenze, Komplexitätsprüfung, der Sanitizer der Website und der Icon-Härter) und ersetzt dann das gespeicherte Markup. Das Icon behält Slug und Namen, jedes Template, jeder Shortcode und jeder gespeicherte Icon-Block zeigt also die neue Zeichnung.
Verwendung
easy_svg_update_icon_markup( int $id, string $markup ): string
Wann du es brauchst
- Ein Add-on repariert oder optimiert Icons (zum Beispiel ohne fest eingetragene Farben) und schreibt sie zurück.
- Ein Import- oder Sync-Skript aktualisiert Icons aus einem Designsystem, ohne ihre Adressen zu ändern.
- Eine eigene Admin-Seite lässt eine Designerin die Grafik eines Icons tauschen.
Wann nicht:
- Um ein neues Icon anzulegen. Nimm dafür die Icons-Seite oder die REST-Route des Panels, diese Funktion ändert nur vorhandene.
- Um den Namen zu ändern. Dafür gibt es
easy_svg_rename_icon(). - Um nur zu ändern, was der Icon-Block zeigt. Nimm
easy_svg_registrable_icons, das lässt die gespeicherte Datei in Ruhe.
Parameter
Die Beitrags-ID des Icons (Beitragstyp esw_icon). Wird in eine Ganzzahl umgewandelt. Null, negative Werte, fehlende Beiträge und Beiträge jedes anderen Typs antworten alle mit not_found. Die ID bekommst du aus der Bibliotheksantwort der REST-API des Panels, aus easy_svg_stored_icons() oder mit get_page_by_path( $slug, OBJECT, 'esw_icon' ).
Das neue SVG, roh, so wie du es bekommen hast. Bereinige es nicht vorher selbst, das erledigt die Funktion mit der Erlaubnisliste der Website. Leeres Markup oder nur Leerraum antwortet mit no_markup. Es braucht genau eine svg-Wurzel und nach dem Bereinigen mindestens ein zeichnendes Element.
Rückgabewert
Ein Wort. Die Funktion gibt nie ein WP_Error zurück und wirft nie eine Ausnahme.
updated: Das neue Markup ist gespeichert und die zwischengespeicherte Icon-Liste verworfen.not_found: Es gibt keinenesw_icon-Beitrag mit dieser ID.no_markup:$markupist leer oder nur Leerraum.refused: Die Sanitizer-Bibliothek ist nicht geladen, oder die Datei fiel durch eine Prüfung: größer alseasy_svg_max_bytes(), zu komplex (easy_svg_svg_too_complex()), kein SVG, das der Sanitizer annimmt, nach dem Härten nichts Zeichnendes übrig, oder der aktuelle Titel des Icons ergibt keinen gültigen Icon-Namen (siehe Stolperfallen).failed:wp_update_post()gab einen Fehler oder 0 zurück.
Beispiele
Einfach
$state = easy_svg_update_icon_markup( $icon_id, $new_svg );
if ( 'updated' !== $state ) {
error_log( sprintf( 'Icon %d not replaced: %s', $icon_id, $state ) );
}
Ein Icon per Slug aus einer Datei ersetzen
function myplugin_replace_icon_from_file( $slug, $file ) {
if ( ! current_user_can( 'edit_theme_options' ) ) {
return 'forbidden';
}
$post = get_page_by_path( $slug, OBJECT, 'esw_icon' );
if ( ! $post || 'esw_icon' !== $post->post_type ) {
return 'not_found';
}
if ( ! is_readable( $file ) ) {
return 'no_markup';
}
return easy_svg_update_icon_markup( (int) $post->ID, (string) file_get_contents( $file ) );
}
Die Berechtigungsprüfung ist deine Sache. edit_theme_options ist die Berechtigung, die der Beitragstyp esw_icon verlangt (EASY_SVG_ICON_CAP). Die REST-Routen der Bibliothek im Plugin sind strenger und verlangen manage_options.
Aus dem Status eine Meldung machen
$messages = array(
'updated' => __( 'Icon replaced.', 'myplugin' ),
'not_found' => __( 'That icon no longer exists.', 'myplugin' ),
'no_markup' => __( 'The file was empty.', 'myplugin' ),
'refused' => __( 'That file is not an SVG this library can use.', 'myplugin' ),
'failed' => __( 'The icon could not be saved. Please try again.', 'myplugin' ),
);
$state = easy_svg_update_icon_markup( $icon_id, $markup );
add_settings_error( 'myplugin', 'icon-' . $state, $messages[ $state ] ?? $messages['failed'], 'updated' === $state ? 'success' : 'error' );
Defensiv: die Vertragsversion prüfen
Die Funktion gibt es seit EASY_SVG_ICONS_API 3 (Easy SVG 5.4.0).
if ( defined( 'EASY_SVG_ICONS_API' ) && EASY_SVG_ICONS_API >= 3 && function_exists( 'easy_svg_update_icon_markup' ) ) {
$state = easy_svg_update_icon_markup( $icon_id, $markup );
} else {
$state = 'unsupported';
}
Die Funktion prüft weder Berechtigungen noch Nonces. Sie ist sicher gegen schlechtes Markup (Sanitizer und Härter laufen), aber nicht gegen den falschen Aufrufer. Bevor du sie für eine Anfrage aufrufst, prüf eine Berechtigung (mindestens edit_theme_options, die REST-Route des Plugins verlangt manage_options) und eine Nonce. Ein ersetztes Icon steht inline auf jeder Seite, die es nutzt.
So funktioniert es
- Suche.
get_post()mit der ID, der Beitragstyp mussesw_iconsein. - Prüfungen vor dem Parsen.
easy_svg_accept_icon()lehnt eine Datei über der Bytegrenze ab (die Größe unter Icons, Einstellungen, filterbar miteasy_svg_max_bytes) und eine Datei, die die Komplexitätsprüfung markiert, bevor der Sanitizer sie überhaupt sieht. - Bereinigen. Der Sanitizer der Website (mit
esw_svg_allowed_tagsundesw_svg_allowed_attributes) bereinigt das Markup. Ein Ergebnis ohnesvg-Wurzel wird abgelehnt. Danach entfernteasy_svg_harden_icon_markup()script,style,foreignObject,iframe,embed,object, die Animationselemente, jedeson-Attribut und jedes externehref. - Der Schreibvorgang. Der kses-Filter von WordPress kennt kein SVG und würde das Icon für Benutzer ohne
unfiltered_htmlleeren. Die Funktion schaltet kses genau für diesen einen Schreibvorgang ab, falls es an war, und in einemfinally-Block wieder an. Nurpost_contentändert sich,post_nameundpost_titlebleiben. - Cache.
easy_svg_forget_icons()erhöht die Optioneasy_svg_icons_versionund löscht den Transienteasy_svg_icons, die nächste Anfrage registriert also die neue Zeichnung im Icon-Block. Die Funktion wird direkt aufgerufen, weil der Hooksave_post_esw_icon, der das auch täte, nur registriert ist, solange die Icon-Bibliothek eingeschaltet ist.
Stolperfallen
refusedwegen des Titels. Die Prüfungen leiten aus dem aktuellen Titel des Icons einen Namen ab und lehnen ab, wenn daraus kein gültiger Slug wird. Ein Icon, das in einen Titel ohne Buchstaben oder Ziffern umbenannt wurde (etwa!!!) oder in einen Titel in einer Schrift wie Kyrillisch oder Japanisch, densanitize_title()in Prozent-Kodierung verwandelt, kann keine neue Zeichnung mehr bekommen. Benenne es erst in einen lateinischen Titel um, dann aktualisiere.refusedhat fünf Ursachen. Am Rückgabewert erkennst du nicht, ob die Datei zu groß oder kein SVG war. Brauchst du das, rufeasy_svg_max_bytes()undeasy_svg_svg_too_complex()vorher selbst auf.- Hooks laufen. Wie bei jedem
wp_update_post()feuernsave_post,save_post_esw_iconund verwandte Hooks. Code, der darauf reagiert, läuft mit. - Templates sofort, der Block bei der nächsten Anfrage.
easy_svg_icon()liest den Beitrag direkt, der Icon-Block liest die Registry, die beim nächsteninitneu aufgebaut wird. - Schreib
post_contentnicht selbst. Ein direkteswp_update_post()umgeht den Sanitizer, leert das Icon für Benutzer ohneunfiltered_htmlund lässt eine veraltete Liste bis zu einen Tag im Cache.