Anzahl der Widgets in der Seitenleiste abrufen

7

Wie kann ich die Anzahl der Widgets ermitteln, die in einer bestimmten Seitenleiste aktiv sind? Gibt es dafür eine Kernfunktion?

Ich möchte jedem Widget in einer Seitenleiste eine Klasse hinzufügen, basierend darauf, wie viele davon angezeigt werden.

Vielen Dank.

nautilus7
quelle

Antworten:

12

Nach einigen Recherchen und basierend auf der Antwort von Eugene Manuilov habe ich eine Funktion erstellt, die Widgets in einer bestimmten Seitenleiste (in meinem Fall 'Seitenleiste unten') benutzerdefinierte Klassen hinzufügt, basierend auf der Anzahl der in dieser Seitenleiste festgelegten Widgets. Dies passt perfekt zu horizontalen Seitenleisten und Themen, die auf Twitter-Bootstrap basieren und die spanX-Klasse benötigen, um die Breite des Elements anzupassen.

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');
nautilus7
quelle
1
Sie sollten wp_get_sidebars_widgets nicht anrufen: This function’s access is marked private. This means it is not intended for use by plugin or theme developers, only in other core functions. It is listed here for completeness. developer.wordpress.org/reference/functions/…
Alexander Holsgrove
1
@AlexHolsgrove können wir vielleicht verwenden get_option( 'sidebars_widgets', array() )?
Guglie
1

Wenn Sie das erste und das letzte Widget bearbeiten möchten, können Sie den folgenden Code verwenden. Ich nahm den Code von nautilus7 und kombinierte ihn mit dem Code von MathSmath + durin unter http://wordpress.org/support/topic/how-to-first-and-last-css-classes-for-sidebar-widgets, um auf eine bestimmte Seitenleiste abzuzielen Fügen Sie Span-Klassen basierend auf der Anzahl der Widgets in der Seitenleiste hinzu und fügen Sie dann dem ersten und letzten Widget der Gruppen eine benutzerdefinierte Klasse hinzu.

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');
Nathaniel Schweinberg
quelle
Vielen Dank. Sie können den Widgets auch "gerade" und "ungerade" Klassen hinzufügen. Ich habe es ursprünglich so gemacht, aber ich habe es entfernt, weil Sie dasselbe mit CSS3-Selektoren (n-tes Kind) machen können. Auf jeden Fall schaden zusätzliche Optionen nicht.
Nautilus7
0
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] );
}
Eugene Manuilov
quelle
Danke für die Antwort, aber jetzt merke ich, dass das, was ich will, nicht getan werden kann. Zumindest mit einer Methode, die ich kenne ... Ich möchte jedem Widget eine Klasse hinzufügen, basierend darauf, wie viele davon sich in einer Seitenleiste befinden. Wenn es zum Beispiel 4 Widgets gibt, möchte ich, dass sie die Klasse x haben, oder wenn sie 3 sind, möchte ich, dass sie die Klasse y usw. haben. Dies kann nicht durch einfaches Zählen der Anzahl der Widgets erreicht werden, da die Klasse (jede Klasse) sie erhalten wird bei der Registrierung in der Seitenleiste definiert, nicht beim Zeichnen. Zu diesem Zeitpunkt sind keine Widgets festgelegt.
Nautilus7
0

Versuchen wir es mit dem folgenden Code

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');
PCMShaper
quelle
1
Alle Kommentare dazu, wie dies funktioniert und wie sich dies von den anderen Antworten unterscheidet, wären hier nett.
Anfang