Можно ли получить список виджетов в панели Wordpress?

Здравствуйте.
Суть такова: в панели есть виджет с php кодом. С точки зрения системы он всегда активирован и всегда выводится, но иногда php код возвращает false, и виджет отображается пустым. Я ищу способ пройтись по всем виджетам в панели, и таким образом отбросить те, которые сгенерировались пустыми. Есть ли такой способ?

Спасибо.
  • Вопрос задан
  • 2309 просмотров
Решения вопроса 1
banderos120
@banderos120
Играю на балалайке
Так если они сгенерировались пустыми, то, зачем вам отбрасывать, если они и так пустые ? Или я не понял вопроса ? Вообще, чтобы переопределить вывод, вам нужно ввести свою функцию вместо dynamic_sidebar() и переопределить некоторые методы WP_Widget .

Пример замены dynamic_sidebar() :
function advanced_dynamic_sidebar($index = 1) {
	global $wp_registered_sidebars, $wp_registered_widgets;
        $objects = array();
	if ( is_int($index) ) {
		$index = "sidebar-$index";
	} else {
		$index = sanitize_title($index);
		foreach ( (array) $wp_registered_sidebars as $key => $value ) {
			if ( sanitize_title($value['name']) == $index ) {
				$index = $key;
				break;
			}
		}
	}

	$sidebars_widgets = wp_get_sidebars_widgets();
	if ( empty( $sidebars_widgets ) )
		return false;

	if ( empty($wp_registered_sidebars[$index]) || !array_key_exists($index, $sidebars_widgets) || !is_array($sidebars_widgets[$index]) || empty($sidebars_widgets[$index]) )
		return false;

	$sidebar = $wp_registered_sidebars[$index];

	$did_one = false;
	foreach ( (array) $sidebars_widgets[$index] as $id ) {

		if ( !isset($wp_registered_widgets[$id]) ) continue;

		$params = array_merge(
			array( array_merge( $sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ) ),
			(array) $wp_registered_widgets[$id]['params']
		);

		// Substitute HTML id and class attributes into before_widget
		$classname_ = '';
		foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) {
			if ( is_string($cn) )
				$classname_ .= '_' . $cn;
			elseif ( is_object($cn) )
				$classname_ .= '_' . get_class($cn);
		}
		$classname_ = ltrim($classname_, '_');
		$params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);

		$params = apply_filters( 'dynamic_sidebar_params', $params );

		$callback = $wp_registered_widgets[$id]['callback'];

		do_action( 'dynamic_sidebar', $wp_registered_widgets[$id] );

		if ( is_callable($callback) ) {
			$did_one = true;
                        $objects[] = call_user_func_array($callback, $params);
		}
	}
	return $objects;
}


Метод, который нужно переопределить в WP_Widget :
function display_callback( $args, $widget_args = 1 ) {
		if ( is_numeric($widget_args) )
			$widget_args = array( 'number' => $widget_args );

		$widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
		$this->_set( $widget_args['number'] );
		$instance = $this->get_settings();
                
		if ( array_key_exists( $this->number, $instance ) ) {
			$instance = $instance[$this->number];
			// filters the widget's settings, return false to stop displaying the widget
			$instance = apply_filters('widget_display_callback', $instance, $this, $args);
			if ( false !== $instance )                            
                            return $this->widget($args, $instance);
		}
	}


И, соответственно, вам надо отлавливать вывод выджета, который происходит в методе widget().
Может есть и проще способ, но я его не знаю )
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы