Так если они сгенерировались пустыми, то, зачем вам отбрасывать, если они и так пустые ? Или я не понял вопроса ? Вообще, чтобы переопределить вывод, вам нужно ввести свою функцию вместо 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().
Может есть и проще способ, но я его не знаю )