web-dev-qa-db-fra.com

Obtenir le nombre de widgets dans la barre latérale

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.

7
nautilus7

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');
12
nautilus7

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');
1
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] );
}
0
Eugene Manuilov

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');
0
PCMShaper