Von Zeit zu Zeit muss ich den Inhalt von Widgets verändern, nachdem sie gespeichert wurden. Leider ist es nicht offensichtlich, wie man das schafft. Und zusätzlich hängt es davon ab, wie Widgets überhaupt verwendet werden.

Wenn du ein Block-Theme mit dem Website-Editor verwendest, bist du raus. Der Website-Editor kennt das Konzept von Widgets nicht und kann sie deshalb auch nicht verwenden. Das ist allerdings kein Problem, da du das Layout bereits an deine Vorstellung anpassen kannst.

Abhängig von deinem Theme und Plugins verwendest du ansonsten entweder den veralteten Widgetbereich, wie er vor WordPress 5.8 war – beispielsweise mit dem Plugin Classic Widgets – oder mit den Widget-Blöcken, die in WordPress 5.8 hinzu kamen.

Für die klassischen Widgets gibt es den Hook widget_update_callback, der dir erlaubt, Zugriff auf das Widget-Objekt zu bekommen, nachdem es hinzugefügt oder aktualisiert wurde. Dann kannst du seine Einstellungen verwenden, die sämtliche Daten des Widgets beinhalten. Den Inhalt bekommst du dann entweder über den Array-Index content oder text.

function my_update_widget_content( array $instance ): array {
	$content = ! empty( $instance['text'] ) ? $instance['text'] : ( $instance['content'] ?? '' ); 
	
	// do something
	
	return $instance;
}

add_filter( 'widget_update_callback', 'my_update_widget_content' );
Code-Sprache: PHP (php)

Hinweis: Der Hook enthält weitere Attribute, die hilfreich sein können. Bitte schau dir die Dokumentation für weitere Informationen an.

Der andere Weg bei den Block-Widgets verwendet einen anderen Hook, da dessen Aktualisierungsmechanismus vollständig anders ist und die REST-API verwendet. Dieser Hook heißt rest_after_save_widget und funktioniert anders. Neben der Widget-ID, der Seitenleisten-ID und ob das Widget hinzugefügt oder aktualisiert wurde, wird das gesamte Objekt der REST-Anfrage als Parameter übergeben. Zusätzlich ist es kein Filter, sondern eine Action. Bei Aktualisierung des Inhalts eines Widgets müssen diese Daten eigens erneut aktualisiert werden. Ebenso muss sichergestellt werden, dass die Action dann nicht erneut aufgerufen wird, was sonst zu einer Endlosschleife führen würde.

Du bekommst die Widget-Einstellungsinstanz über den instance-Parameter:

function my_update_rest_widget_content( $id, $sidebar_id, $request ): void {
	if ( ! $request->get_param( 'instance' ) || ! isset( $request->get_param( 'instance' )['raw']['content'] ) ) {
		return;
	}
	
	$new_content = ''; // do something
	
	if ( $new_content !== $request->get_param( 'instance' )['raw']['content'] ) {
		remove_action( 'rest_after_save_widget', 'my_update_rest_widget_content', 10, 3 );
		
		$request->set_param( 'instance', [ 'raw' => [ 'content' => $new_content ] ] );
		( new WP_REST_Widgets_Controller() )->update_item( $request );
		
		add_action( 'rest_after_save_widget', 'my_update_rest_widget_content', 10, 3 );
	}
}

add_action( 'rest_after_save_widget', 'my_update_rest_widget_content', 10, 3 );
Code-Sprache: PHP (php)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert