une fonction souvent oubliée : is_active_widget()

is_active_widget() est une fonction souvent oubliée des développeurs qui insèrent de manière non sélective des éléments (js, css) dand le header de la page sans qu’un des widgets soient présents sur la page affichée.
Cette fonction est pourtant une bonne façon de remédier à ce défaut.

* @global array $wp_registered_widgets
 *
 * @param string $callback      Optional, Widget callback to check.
 * @param int    $widget_id     Optional, but needed for checking. Widget ID.
 * @param string $id_base       Optional, the base ID of a widget created by extending WP_Widget.
 * @param bool   $skip_inactive Optional, whether to check in 'wp_inactive_widgets'.
 * @return string|false False if widget is not active or id of sidebar in which the widget is active.
 */
function is_active_widget($callback = false, $widget_id = false, $id_base = false, $skip_inactive = true) {

 

S’il y a plusieurs possibles widgets d’un même type ($id_base) on peut faire un premier test :

if ( is_active_widget( false, false, 'xili_language_widgets') ) {
		//
		$insert_style = array();
		$styletext = array();
		if ( $widgets_xll = get_option( 'widget_xili_language_widgets' ) ) {
			foreach ( $widgets_xll as $key => $one_xll ) {
				if ( isset( $one_xll['flagstyle'] ) && in_array( $one_xll['flagstyle'],  array ('flagstyle', 'flagstyletext' ) ) ) {
					$insert_style[] = $key;

et ensuite si c’est nécessaire on peut affiner :

function xili_language_widgets_head_test ( $key,  $styletext ) {
	$widget_uid = 'xili_language_widgets-' . $key;
	$name = is_active_widget( false, $widget_uid, 'xili_language_widgets');
	if ( $name ) {
		printf('<!--- Xili-language list widget ID %s in %s -->', $key, $name ); // only active and visible in sidebar with $name
		$style_lines = '<style type="text/css">';

Ce 2e extrait est utilisé dans xili-language pour insérer si et seulement si un réglage de l’instance d’un widget le nécessite !

NOTE :

le premier paramètre est par défaut à false et reste un mystère (probablement lié à la compatibilité de version de WP) car il est testé comme un string alors qu’il s’agit d’un tableau contenant un objet et un string ?!?

A suivre