Veröffentlicht am Schreib einen Kommentar

Widget-Daten in WordPress durchsuchen

Je nach Widget-Inhalt kann es sein, dass man zusätzlich automatisiert Veränderungen an einem Widget durchführen will/muss. Da ich selbst vor diesem Problem stand, habe ich gesucht und eine Lösung gefunden. Dabei stieß ich relativ schnell auf ein GitHub Gist, das eine mögliche Lösung beinhaltete.

Auch wenn dieses Skript wunderbar funktionierte und mir sehr weiterhalf, empfand ich es als etwas umständlich, um an die Informationen zu kommen, die ich brauchte: die reinen Daten der Widgets. Insbesondere das Iterieren über alle Sidebars, um alle Widgets zu bekommen, schien mir unnötig, da es dafür die Funktion wp_get_sidebars_widgets() gibt, die das für einen erledigt (auch wenn sie als privat markiert ist).

Am Ende sieht meine Funktion, um an die Widget-Daten zu kommen, folgendermaßen aus:

/**
 * Get widget data of every sidebar.
 * 
 * @param	bool	$active If true, inactive widgets are ignored
 * @return	array The widget data of every widget
 */
function my_get_widget_data( bool $active = true ) {
	global $wp_registered_widgets;
	
	// the output at the end
	$output = [];
	
	// get all widgets
	$sidebars_widgets = wp_get_sidebars_widgets();
	
	// search in every sidebar
	foreach ( $sidebars_widgets as $sidebar => $widget_ids ) {
		// ignore inactive widgets to improve performance by default
		if ( ! $active && $sidebar === 'wp_inactive_widgets' ) {
			continue;
		}
		
		// if sidebar has no widgets, continue with next sidebar
		if ( empty( $widget_ids ) ) {
			continue;
		}
		
		foreach ( $widget_ids as $id ) {
			// the callback is an object with the type of the widget
			$option_name = $wp_registered_widgets[ $id ]['callback'][0]->option_name;
			// get the number of the widget to get its data
			$key = $wp_registered_widgets[ $id ]['params'][0]['number'];
			// get the widget data from the database
			$widget_data = get_option( $option_name );
			// store output
			$output[ $wp_registered_widgets[ $id ]['id'] ] = (object) $widget_data[ $key ];
		}
	}
	
	return $output;
}

Am Ende erhält man hier ein assoziatives Array mit allen Widgets zurück. Dabei ist der Key der jeweiligen Array-Elemente die ID des Widgets und das Widget liegt als Objekt vor. Je nach Widget-Typ gibt es hier unterschiedliche Objekt-Eigenschaften, die dann durchsucht werden können. Im folgenden Beispiel können dann beispielsweise Text-Widgets nach bestimmten Inhalten durchsucht werden.

/**
 * Check if a widget has a specific content.
 */
function my_widget_has_my_content() {
	$content_to_test = 'my content';
	$widgets = my_get_widget_data();
	
	foreach ( $widgets as $widget ) {
		$has_my_content = false;
		
		if ( ! isset( $widget->text ) && ! isset( $widget->content ) ) {
			continue;
		}
		
		if ( isset( $widget->text ) && strpos( $widget->text, $content_to_test ) !== false ) {
			$has_my_content = true;
		}
		
		if ( isset( $widget->content ) && strpos( $widget->content, $content_to_test ) !== false ) {
			$has_my_content = true;
		}
	
		if ( $has_my_content ) {
			// do things
		}
	}
}

add_action( 'wp', 'my_widget_has_my_content' );

Um alle verfügbaren Widget-Eigenschaften ansehen zu können, empfiehlt es sich, sich den Rückgabewert von my_get_widget_data() einmal ansehen.
Das geht beispielsweise so: var_dump( my_get_widget_data() ); die();

Schreibe einen Kommentar

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