Setseasy_svg_pro_set_icons_written

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

body
$post_idint
Required

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.

body
$iconsarray
Required

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

returnvoid

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:

  1. 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.
  2. 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.
  3. Das ganze Set wird als ein JSON-String im Post-Meta _easy_svg_set_icons gespeichert.
  4. Die Action feuert mit der Post-ID und genau dem Array, das gespeichert wurde.

Diese Wege laufen hier durch:

WegWann
Set-EditorBeim Speichern eines Sets (POST /sets/{id})
Icons hinzufügen und entfernenPOST /sets/{id}/icons/add und /icons/remove, auch von den Abilities genutzt
Ein Icon umbenennenPOST /sets/{id}/icons/label, nur wenn sich das Label wirklich ändert
MehrfachbearbeitungUmbenennen, Kopieren und Verschieben zwischen Sets (Verschieben feuert einmal pro Set)
Bibliotheks-Icons in ein Set verschiebenPOST /library/move
Paket-Import, Font-Awesome-Import, PresetsNachdem der neue Set-Post angelegt ist
WP-CLIwp easy-svg pack import
KundenmodusBeim Austauschen einer Zeichnung
Icon-VerlaufBeim Wiederherstellen einer älteren Zeichnung
SVG-CleanerBeim 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. $icons ist nur der neue Stand. Heb dir selbst einen Schnappschuss auf, oder schalte den Icon-Verlauf ein und lies die vorherige Revision mit wp_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_post und post_updated für easy_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/arrow auf, nicht 42/arrow. Lies easy_svg_pro_set_collection_slugs (Schlüssel ist die Post-ID) und nimm sonst post_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 -x enden.
  • 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.

Siehe auch