Nhận số lượng vật dụng trong thanh bên


7

Làm cách nào tôi có thể nhận được số lượng vật dụng đang hoạt động trên một thanh bên cụ thể? Có một chức năng cốt lõi cho điều này?

Tôi muốn thêm một lớp vào mỗi widget trên một thanh bên dựa trên số lượng chúng được hiển thị.

Cảm ơn.

Câu trả lời:


12

Sau một số nghiên cứu và dựa trên câu trả lời từ Eugene Manuilov, tôi đã thực hiện một chức năng thêm các lớp tùy chỉnh vào các widget trong một thanh bên cụ thể ('sidebar-bottom' trong trường hợp của tôi) dựa trên số lượng widget được đặt trong thanh bên đó. Điều này sẽ phù hợp hoàn hảo trong các thanh ngang và chủ đề dựa trên bootstrap twitter cần lớp spanX để điều chỉnh độ rộng của phần tử.

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

1
Bạn không nên gọi wp_get_sidebars_widgets: 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/fifts/
Alexander Holsgrove

1
@AlexHolsgrove có lẽ chúng ta có thể sử dụng get_option( 'sidebars_widgets', array() )?
Guglie

1

Ngoài ra, nếu bạn đang muốn làm mọi thứ với widget đầu tiên và cuối cùng, bạn có thể sử dụng mã bên dưới. Tôi đã lấy mã của nautilus7 và kết hợp nó với mã MathSmath + của durin tại http://wordpress.org/support/topic/how-to-first-and-last-css-groupes-for-sidebar-widgets để nhắm mục tiêu một thanh bên cụ thể , thêm các lớp span dựa trên số lượng widget trong thanh bên, sau đó thêm một lớp tùy chỉnh vào widget đầu tiên và cuối cùng của các nhóm.

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

Cảm ơn. Bạn cũng có thể thêm các lớp 'chẵn' và 'lẻ' vào các widget. Tôi đã làm nó theo cách ban đầu, nhưng tôi đã loại bỏ nó bởi vì bạn có thể làm tương tự với các bộ chọn CSS3 (nth-child). Dù sao tùy chọn bổ sung không làm tổn thương.
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] );
}

Cảm ơn câu trả lời, nhưng bây giờ tôi nhận ra rằng những gì tôi muốn không thể được thực hiện. Ít nhất là với một phương thức mà tôi biết ... Tôi muốn thêm một lớp trên mỗi widget dựa trên số lượng chúng trên một thanh bên. Ví dụ: nếu có 4 widget tôi muốn chúng có lớp x hoặc nếu chúng là 3 thì tôi muốn chúng có lớp y, v.v. Điều này không thể được thực hiện chỉ bằng cách đếm số lượng vật dụng vì lớp (bất kỳ lớp nào) chúng có được xác định uppon sidebar đăng ký, không vẽ. Tại thời điểm này không có vật dụng nào được thiết lập.
nautilus7

0

Hãy thử với mã dưới đây

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

1
Bất kỳ ý kiến ​​về cách thức này hoạt động và làm thế nào khác với các câu trả lời khác sẽ được tốt đẹp ở đây.
tfrommen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.