Comment obtenir le nombre de widgets actifs dans une barre latérale spécifique? Existe-t-il une fonction essentielle pour cela?
Je souhaite ajouter une classe à chaque widget dans une barre latérale en fonction du nombre de ceux-ci affichés.
Merci.
Après quelques recherches et basé sur la réponse de Eugene Manuilov, j'ai créé une fonction qui ajoute des classes personnalisées aux widgets dans une barre latérale spécifique ("sidebar-bottom" dans mon cas) en fonction du nombre de widgets définis dans cette barre latérale. Cela conviendra parfaitement dans les barres latérales horizontales et les thèmes basés sur le bootstrap de Twitter qui nécessitent la classe spanX pour ajuster la largeur de l'élément.
function cosmos_bottom_sidebar_params($params) {
$sidebar_id = $params[0]['id'];
if ( $sidebar_id == 'sidebar-bottom' ) {
$total_widgets = wp_get_sidebars_widgets();
$sidebar_widgets = count($total_widgets[$sidebar_id]);
$params[0]['before_widget'] = str_replace('class="', 'class="span' . floor(12 / $sidebar_widgets) . ' ', $params[0]['before_widget']);
}
return $params;
}
add_filter('dynamic_sidebar_params','cosmos_bottom_sidebar_params');
En outre, si vous souhaitez modifier le premier et le dernier widget, vous pouvez utiliser le code ci-dessous. J'ai pris le code de Nautilus7 et l'ai combiné avec le code de MathSmath + durin à http://wordpress.org/support/topic/how-to-first-and-last-css-classes-for-sidebar-widgets to ciblez une barre latérale spécifique, ajoutez des classes étendues en fonction du nombre de widgets dans la barre latérale, puis ajoutez une classe personnalisée au premier et au dernier widget des groupes.
function cur_target_sidebar_add_classes_to_params($params) {
global $my_widget_num; // Global a counter array
$sidebar_id = $params[0]['id'];
if ( $sidebar_id == 'sidebar' ) {
$registered_widgets = wp_get_sidebars_widgets();
if(!isset($registered_widgets[$sidebar_id]) || !is_array($registered_widgets[$sidebar_id])) { // Check if the current sidebar has no widgets
return $params; // No widgets in this sidebar... bail early.
}
$number_of_widgets = count($registered_widgets[$sidebar_id]);
$rounded_number_of_widgets = floor(12 / $number_of_widgets); //Rounds number of widgets down to a whole number
if(!$my_widget_num) {// If the counter array doesn't exist, create it
$my_widget_num = array();
}
if(isset($my_widget_num[$sidebar_id])) { // See if the counter array has an entry for this sidebar
$my_widget_num[$sidebar_id] ++;
} else { // If not, create it starting with 1
$my_widget_num[$sidebar_id] = 1;
}
$classes = 'span' . $rounded_number_of_widgets;
if($my_widget_num[$sidebar_id] == 1) { // If this is the first widget
$classes .= ' first-widget ';
} elseif($my_widget_num[$sidebar_id] == count($registered_widgets[$sidebar_id])) { // If this is the last widget
$classes .= ' last-widget ';
}
$params[0]['before_widget'] = preg_replace('/class=\"/', 'class="' . $classes . ' ', $params[0]['before_widget'], 1);
}
return $params;
}
add_filter('dynamic_sidebar_params','cur_target_sidebar_add_classes_to_params');
function wpse_54162_get_widgets_count( $sidebar_index ) {
global $wp_registered_sidebars;
$index = "sidebar-{$sidebar_index}";
$sidebars_widgets = wp_get_sidebars_widgets();
if ( empty($wp_registered_sidebars[$index]) || !array_key_exists($index, $sidebars_widgets) || !is_array($sidebars_widgets[$index]) || empty($sidebars_widgets[$index]) )
return 0;
return count( (array) $sidebars_widgets[$index] );
}
Essayons avec le code ci-dessous
function sidebar_widget_init()
{
global $_wp_sidebars_widgets;
if ( empty( $_wp_sidebars_widgets ) ) :
$_wp_sidebars_widgets = get_option( 'sidebars_widgets', array() );
endif;
$sidebars_widgets_count = $_wp_sidebars_widgets;
$sidebar_count = count( $sidebars_widgets_count[ 'sidebar3' ] );
if($sidebar_count == 2){
$sidebar_class = 'class_name1';
} elseif($sidebar_count == 3){
$sidebar_class = 'class_name2';
} elseif($sidebar_count == 4){
$sidebar_class = 'class_name3';
}
register_sidebar(array( 'name' => __( 'Sidebar Footer', 'templatemesh' ),
'id' => 'sidebar3',
'description' => __( 'Widgets in this area will be shown on footer Sidebar.', 'templatemesh' ),
'before_title' => '<h3 class="widget_title">',
'after_title' => '</h3>',
'before_widget' => '<div class="'.$sidebar_class.'"><div id="%1$s" class="widget %2$s" >',
'after_widget' => '</div></div>'
)
);
}
add_action('widgets_init','sidebar_widget_init');