easy_svg_pro_set_icons_written
Führ eigenen Code aus, sobald die Icons eines Sets gespeichert werden: aus Editor, Mehrfachbearbeitung, Import, Presets, WP-CLI, Kundenmodus oder KI-Agent.
Action · Easy SVG Pro · Status: Stabil
Ein Icon-Set speichert alle seine Icons in einem einzigen Wert. Viele Stellen ändern diesen Wert: der Set-Editor, die Mehrfachbearbeitung, die Importe, Presets, WP-CLI, der Kundenmodus und die Abilities für KI-Agenten. Alle speichern über eine Funktion, und die löst direkt nach dem Speichern diese Action aus. Du hängst dich also einmal ein und erfährst von jeder Änderung, egal woher sie kommt.
Verwendung
do_action( 'easy_svg_pro_set_icons_written', int $post_id, array $icons )
Ausgelöst in includes/editor/sets.php, am Ende der internen Funktion write_set_icons(), nachdem das Post-Meta _easy_svg_set_icons aktualisiert wurde.
add_action( 'easy_svg_pro_set_icons_written', 'acme_on_set_saved', 10, 2 );
Gib 2 als viertes Argument an, sonst bekommt dein Callback nur $post_id.
Wann du es brauchst
- Du cachest etwas, das aus einem Set gebaut wird: ein Sprite, eine JSON-Datei für eine JavaScript-App, einen Seiten-Cache, der die Icons ausgibt. Hier leerst du ihn.
- Du spiegelst ein Set woandershin: in ein Designsystem-Repository, einen CDN-Bucket, eine andere Website.
- Du willst ein Protokoll: wer hat welches Set wann geändert.
- Du willst jemanden benachrichtigen, wenn eine Kundin im Kundenmodus ein Icon austauscht.
Nicht dafür gedacht:
- Icons ändern oder ablehnen. Die Action läuft nach dem Speichern, ein Rückgabewert wird nicht verwendet. Bereinige Markup, bevor es bei Easy SVG Pro ankommt, oder nutze den Konfigurator.
- Erfahren, wann ein Set angelegt, umbenannt, in den Papierkorb gelegt oder wiederhergestellt wird. Das ändert den Post, nicht seine Icons, und löst die Action nicht aus (siehe Stolperfallen).
- Auf Ordner- oder Theme-Sammlungen reagieren. Die werden von der Festplatte gelesen und nie über diese Funktion gespeichert. Dafür gibt es
easy_svg_pro_registered_collection.
Parameter
Die ID des easy_svg_set-Posts, dessen Icons gerade gespeichert wurden. Das ist die Post-ID, nicht der Slug der Sammlung, den ein Template nutzt. Im dritten Beispiel siehst du, wie du daraus den Slug machst.
Alle Icons, die das Set nach dem Speichern enthält, mit dem Icon-Slug als Schlüssel: array( 'arrow' => array( 'label' => 'Arrow', 'markup' => '<svg ...>' ) ). Das Markup ist schon bereinigt und gehärtet. Nach dem Entfernen steht hier, was übrig ist, ein leeres Array heißt: Das Set ist jetzt leer. Den vorherigen Stand oder eine Liste der Änderungen bekommst du nie.
Rückgabewert
Nichts. Es ist eine Action, ein Rückgabewert wird ignoriert.
Standardwert
Easy SVG Pro hängt sich nur selbst ein, wenn Icon-Verlauf unter Icons → Funktionen eingeschaltet ist: Der Callback bittet WordPress mit wp_save_post_revision() um eine Revision. Sonst hört standardmäßig niemand zu.
Beispiele
Einen Cache leeren, der aus dem Set gebaut wird
/**
* Das Theme baut pro Set ein SVG-Sprite und legt es in einem Transient ab.
*/
function acme_flush_icon_sprite( $post_id, $icons ) {
delete_transient( 'acme_icon_sprite_' . (int) $post_id );
}
add_action( 'easy_svg_pro_set_icons_written', 'acme_flush_icon_sprite', 10, 2 );
Die Agentur benachrichtigen, wenn ein Kunde ein Icon ändert
Im Kundenmodus kann ein Kunde Zeichnungen austauschen. Viele Agenturen wollen wissen, wann das passiert.
/**
* Mail an den Admin, wenn jemand ohne Administratorrechte ein Set speichert.
*/
function acme_notify_on_client_swap( $post_id, $icons ) {
if ( current_user_can( 'manage_options' ) ) {
return;
}
$user = wp_get_current_user();
$set = get_the_title( $post_id );
wp_mail(
get_option( 'admin_email' ),
sprintf( 'Icon-Set "%s" wurde geändert', $set ),
sprintf( '%s hat das Set "%s" gespeichert. Es enthält jetzt %d Icons.', $user->display_name, $set, count( $icons ) )
);
}
add_action( 'easy_svg_pro_set_icons_written', 'acme_notify_on_client_swap', 10, 2 );
WP-CLI und Cron laufen ohne angemeldeten Benutzer, dort ist current_user_can() also false, und es würde auch eine Mail rausgehen. Ergänze if ( wp_doing_cron() || ( defined( 'WP_CLI' ) && WP_CLI ) ) { return; }, wenn dich nur Menschen interessieren.
Herausfinden, welche Icons sich geändert haben
Die Action liefert nur den neuen Stand. Merk dir pro Icon einen Fingerabdruck in deinem eigenen Post-Meta und vergleiche.
/**
* Protokolliert hinzugefügte, geänderte und entfernte Icons pro Speichern.
*/
function acme_log_icon_changes( $post_id, $icons ) {
$before = get_post_meta( $post_id, '_acme_icon_hashes', true );
$before = is_array( $before ) ? $before : array();
$after = array();
foreach ( $icons as $slug => $icon ) {
$after[ $slug ] = md5( (string) ( $icon['markup'] ?? '' ) );
}
$added = array_keys( array_diff_key( $after, $before ) );
$removed = array_keys( array_diff_key( $before, $after ) );
$changed = array();
foreach ( array_intersect_key( $after, $before ) as $slug => $hash ) {
if ( $before[ $slug ] !== $hash ) {
$changed[] = $slug;
}
}
// Der Slug, den Templates nutzen. Ein ganz neues Set steht vielleicht noch nicht drin.
$slugs = get_option( 'easy_svg_pro_set_collection_slugs', array() );
$collection = is_array( $slugs ) && ! empty( $slugs[ (string) $post_id ] )
? $slugs[ (string) $post_id ]
: get_post_field( 'post_name', $post_id );
error_log( sprintf( '[icons] %s: +%s ~%s -%s', $collection, implode( ',', $added ), implode( ',', $changed ), implode( ',', $removed ) ) );
update_post_meta( $post_id, '_acme_icon_hashes', $after );
}
add_action( 'easy_svg_pro_set_icons_written', 'acme_log_icon_changes', 10, 2 );
Eigenes Post-Meta hier zu schreiben ist in Ordnung. Das ist ein anderer Schlüssel und löst die Action nicht noch einmal aus.
Defensiv: nur mit Easy SVG Pro, und nie zweimal pro Request
function acme_push_set_to_cdn( $post_id, $icons ) {
static $done = array();
// Ein Verschieben in der Mehrfachbearbeitung schreibt zwei Sets, und ein Request kann dasselbe Set zweimal speichern.
if ( isset( $done[ $post_id ] ) ) {
return;
}
$done[ $post_id ] = true;
wp_schedule_single_event( time() + 30, 'acme_upload_icon_set', array( (int) $post_id ) );
}
add_action(
'plugins_loaded',
function () {
if ( defined( 'EASY_SVG_PRO_FILE' ) ) {
add_action( 'easy_svg_pro_set_icons_written', 'acme_push_set_to_cdn', 10, 2 );
}
}
);
Der Upload selbst läuft später per Cron. Ein langsames CDN bremst also nicht das Speichern, auf das jemand gerade wartet.
So funktioniert es
Jeder Schreibweg endet in derselben internen Funktion. Der Reihe nach:
- Der Aufrufer hat jedes Icon schon bereinigt und gehärtet (über das kostenlose Easy SVG Support) und seine Änderung mit dem gespeicherten Stand zusammengeführt.
- Im Schreibkontext (ein REST-Request, der kein GET ist, oder WP-CLI) hält der Request die Set-Sperre. Siehe
easy_svg_pro_set_write_context. - Das ganze Set wird als ein JSON-String im Post-Meta
_easy_svg_set_iconsgespeichert. - Die Action feuert mit der Post-ID und genau dem Array, das gespeichert wurde.
Diese Wege laufen hier durch:
| Weg | Wann |
|---|---|
| Set-Editor | Beim Speichern eines Sets (POST /sets/{id}) |
| Icons hinzufügen und entfernen | POST /sets/{id}/icons/add und /icons/remove, auch von den Abilities genutzt |
| Ein Icon umbenennen | POST /sets/{id}/icons/label, nur wenn sich das Label wirklich ändert |
| Mehrfachbearbeitung | Umbenennen, Kopieren und Verschieben zwischen Sets (Verschieben feuert einmal pro Set) |
| Bibliotheks-Icons in ein Set verschieben | POST /library/move |
| Paket-Import, Font-Awesome-Import, Presets | Nachdem der neue Set-Post angelegt ist |
| WP-CLI | wp easy-svg pack import |
| Kundenmodus | Beim Austauschen einer Zeichnung |
| Icon-Verlauf | Beim Wiederherstellen einer älteren Zeichnung |
| SVG-Cleaner | Beim Bereinigen eines Icons, das in einem Set liegt |
Die Action hängt an keinem Feature-Flag. Läuft der Codepfad, feuert sie. Dein Callback läuft im selben Request, alles Langsame darin verzögert also dieses Speichern.
Stolperfallen
- Sie feuert auch, wenn sich nichts ändert. Fügst du nur Icons hinzu, die es schon gibt, oder entfernst Namen, die das Set gar nicht hat, wird trotzdem gespeichert und die Action ausgelöst. Vergleich den Inhalt selbst (drittes Beispiel), wenn nur echte Änderungen zählen.
- Kein vorheriger Stand.
$iconsist nur der neue Stand. Heb dir selbst einen Schnappschuss auf, oder schalte den Icon-Verlauf ein und lies die vorherige Revision mitwp_get_post_revisions(). - Papierkorb, Löschen, Wiederherstellen und Umbenennen lösen sie nicht aus. Das ändert den Post, nicht das Icon-Meta. Wenn du Caches baust, häng dich zusätzlich an
wp_trash_post,untrashed_post,deleted_postundpost_updatedfüreasy_svg_set-Posts. - Rekursion. Speicherst du aus deinem Callback die Icons desselben Sets erneut (etwa über einen internen REST-Request), feuert die Action wieder. Schütz dich mit einem statischen Flag wie im letzten Beispiel.
- Post-ID ist nicht der Slug der Sammlung. Templates rufen
acme/arrowauf, nicht42/arrow. Lieseasy_svg_pro_set_collection_slugs(Schlüssel ist die Post-ID) und nimm sonstpost_name. Ein Set, das in genau diesem Request angelegt wurde, steht dort vielleicht noch nicht, und auf Seiten, die ältere Versionen liefen, kann der Slug auf-xenden. - Direkte Meta-Schreibzugriffe siehst du nicht. Code, der selbst
update_post_meta( $id, '_easy_svg_set_icons', ... )aufruft, ein WXR-Import oder ein Migrations-Plugin umgehen die Action, die Sperre und den Sanitizer. Easy SVG Pro härtet das Markup beim Lesen zwar erneut, dein Listener erfährt davon aber nichts.
$icons ist bereinigt und gehärtet und damit sicher zur Ausgabe. Jag es nicht durch eigene String-Ersetzungen und gib das Ergebnis aus: Eine unvorsichtige Ersetzung kann Markup erzeugen, das der Sanitizer abgelehnt hätte.