Thêm một div để bọc nội dung widget sau tiêu đề widget


10

Tôi đang cố gắng thêm div vào nội dung của widget trong thanh bên động của mình.

Đây là mã đăng ký;

register_sidebar(array(
        'name' => "Sidebar1",
        'id' => 'home-sidebar-1',
        'before_widget' => '<div class="sidebar-box">',
        'after_widget' => '</div>',
        'before_title' => '<div class="title">',
        'after_title' => '</div>',
    ));

Nhưng mã này gây ra như thế này;

<div class="sidebar-box">
    <div class="title">{WIDGET TITLE}</div>
     {WIDGET CONTENT}
</div>

Đây là những gì tôi đang cố gắng làm;

<div class="sidebar-box">
    <div class="title">{WIDGET TITLE}</div>
    <div class="content">
           {WIDGET CONTENT}
    </div> 
</div>

Làm thế nào nó có thể được thực hiện?

Câu trả lời:


18

Ngoài câu trả lời của Toscho đây là những gì bạn cần cho một giải pháp mạnh mẽ:

// if no title then add widget content wrapper to before widget
add_filter( 'dynamic_sidebar_params', 'check_sidebar_params' );
function check_sidebar_params( $params ) {
    global $wp_registered_widgets;

    $settings_getter = $wp_registered_widgets[ $params[0]['widget_id'] ]['callback'][0];
    $settings = $settings_getter->get_settings();
    $settings = $settings[ $params[1]['number'] ];

    if ( $params[0][ 'after_widget' ] == '</div></div>' && isset( $settings[ 'title' ] ) && empty( $settings[ 'title' ] ) )
        $params[0][ 'before_widget' ] .= '<div class="content">';

    return $params;
}

Từ câu trả lời của Toscho:

register_sidebar(array(
    'name' => "Sidebar1",
    'id' => 'home-sidebar-1',
    'before_widget' => '<div class="sidebar-box">',
    'after_widget' => '</div></div>',
    'before_title' => '<div class="title">',
    'after_title' => '</div><div class="content">',
));

Điều này làm là:

  • kiểm tra các thiết lập cho thanh bên đã đăng ký cho các widget kết thúc bằng 2 đóng cửa <div>s
  • kiểm tra nếu không có tiêu đề
  • nếu không, nó sẽ sửa đổi before_widgetđầu ra để hiển thị div nội dung widget mở

Bạn có thể sử dụng phương pháp này để thay đổi các đối số thanh bên theo các cách khác để dựa trên cài đặt của đối tượng tiện ích.


Tôi có một vấn đề với điều đó: một số widget (ví dụ như các mặc định WP) đặt tiêu đề mặc định nếu bạn để trống. Vì vậy, chức năng của bạn thêm div vì không có tiêu đề trong thông số tại thời điểm đó, nhưng tiện ích bổ sung sau đó và mã bị rối. Bạn có biết cách kiểm tra tiêu đề từ "bên trong" tiện ích không? Cảm ơn
Cmorales

Không phải không thêm tiện ích bằng cách kiểm tra tiện ích hoặc một số mã phức tạp khủng khiếp để hiển thị tiện ích một cách im lặng sau đó phân tích nó cho một tiêu đề ... Sẽ có một suy nghĩ
sanchothefat

Có lẽ việc kết nối với codex.wordpress.org/Function_Reference/the_widget này sẽ giúp ích? Họ sử dụng nó (vì lý do khác) trong bài viết này wp.smashingmagazine.com/2012/12/11/NH
Cmorales

1
the_widget()không được sử dụng trong dynamic_sidebar()chức năng, đây là phương tiện gọi bất kỳ tiện ích nào với các tùy chọn bạn chỉ định tại chỗ. Đó là một nơi khác để lọc mặc dù vậy giải pháp của tôi không bao gồm sự kiện đó. Chúc mừng
sanchothefat

2

Thêm cái thứ hai divvào tham số tiêu đề:

register_sidebar(array(
        'name' => "Sidebar1",
        'id' => 'home-sidebar-1',
        'before_widget' => '<div class="sidebar-box">',
        'after_widget' => '</div></div>',
        'before_title' => '<div class="title">',
        'after_title' => '</div><div class="content">',
    ));

Điều đó không thành công nếu không có tiêu đề widget - mặc dù vậy nó có thể được thực hiện
sanchothefat

Có, nó thất bại khi không có tiêu đề ..
MBraiN

Tôi đã thêm một câu trả lời với một số mã để khắc phục vấn đề tiêu đề. Có lẽ nên được hợp nhất với Toscho thực sự nhưng anh ấy đã có đại diện hoành
tráng

2

Tôi thích ý tưởng của cả hai câu trả lời @tosco và @sanchothefat - tuy nhiên tôi đã vật lộn với sự kết hợp đó bởi vì trong khi empty( $settings[ 'title' ]thực sự có thể trả về đúng thì tiện ích con có thể xuất ra một tiêu đề mặc định nếu không được đặt. Tiêu đề này sau đó được bọc trong before_titleafter_titleđánh dấu và một lần nữa trang bị phá vỡ. Dù sao đó cũng là một số vật dụng mặc định.

Dễ dàng hơn chỉ cần bám vào các tham số đăng ký widget tiêu chuẩn;

register_sidebar(array(
    'id' => 'sidebar1',
    'name' => __( 'Sidebar 1', 'bonestheme' ),
    'description' => __( 'The first (primary) sidebar.', 'bonestheme' ),
    'before_widget' => '<div class="block">',
    'after_widget' => '</div>',
    'before_title' => '<div class="block-title">',
    'after_title' => '</div>',
));

và sau đó thêm một hành động lọc theo câu trả lời của Marventus tại đây;

http://wordpress.org/support/topic/add-html-wrapper-around-widget-content

function widget_content_wrap($content) {
    $content = '<div class="block-content">'.$content.'</div>';
    return $content;
}
add_filter('widget_text', 'widget_content_wrap');

3
và nó chỉ hoạt động cho "Widgets Text"
Silver Moon

1

Đây là những gì bạn làm để đạt được điều này:

register_sidebar(array(
        'name' => "Sidebar1",
        'id' => 'home-sidebar-1',
        'before_widget' => '<div class="sidebar-box"><div class="content">',
        'after_widget' => '</div></div>',
        'before_title' => '</div><div class="title">',
        'after_title' => '</div><div class="content">',
    ))

Khi không có tiêu đề, bạn sẽ nhận được:

<div class="sidebar-box"><div class="content">
{CONTENT}
</div></div>

Khi có một tiêu đề bạn sẽ nhận được:

<div class="sidebar-box"><div class="content">
</div><div class="title">
{TITLE}
<div class="content">
{CONTENT}
</div></div>

Để đảm bảo div nội dung trống đầu tiên không hiển thị trong trường hợp sau, bạn thêm nội dung này vào css của mình:

.sidebar-box .content:empty {display:none !important;}

0

Sau khi xem các câu trả lời trước, tôi nghĩ rằng tôi đã khắc phục vấn đề Cmorales được xác định bằng câu trả lời của sanchothefat. Xác định widget của bạn như sau:

register_sidebar( array(
    'name' => 'Sidebar',
    'id' => 'sidebar',
    'before_widget' => '<div class="panel panel-default %2$s" id="%1$s">',
    'after_widget' => '</div>',
    'before_title' => '',
    'after_title' => ''
) );

Điều quan trọng là các mặc định before_titleafter_titlemặc định được loại bỏ. Sau một số thử nghiệm và lỗi tôi lưu ý rằng bộ lọc đầu tiên hiển thị tiêu đề mặc định là widget_title. Sau đó sử dụng widget_titlebộ lọc như vậy:

function widget_title( $title ) {
    if ( $title )
        $title = '<div class="panel-heading"><h3 class="panel-title">' . $title . '</h3></div>';
    $title .= '<div class="panel-body">';
    return $title;
}

Về cơ bản, <div class="panel-heading"><h3 class="panel-title">là của tôi before_title</h3></div>là của tôi after_title. Cuối cùng, sử dụng dynamic_sidebar_paramsđể thêm một div đóng cho gói nội dung của chúng tôi:

function dynamic_sidebar_params( $params ) {
    $params[0]['after_widget'] = '</div>' . $params[0]['after_widget'];
    return $params;
}

Nó không đẹp, nhưng nó hoạt động.


Ban đầu rất hào hứng với cách tiếp cận này, nhưng tôi gặp phải một vấn đề với các widget sử dụng esc_html ($ title) (tức là BuddyPress). Khi đó, HTML đã thêm được hiển thị thoát và không được hiển thị ở mặt trước.
Ryan

0

Tôi chỉ thay đổi một chút mã để không cần phải chạm vào register_sidebar . Đăng ký một thanh bên với cách thông thường:

register_sidebar(array(
    'name' => "Sidebar1",
    'id' => 'home-sidebar-1',
    'before_widget' => '<div class="sidebar-box">',
    'after_widget' => '</div>',
    'before_title' => '<div class="title">',
    'after_title' => '</div>',
));

Và dưới đây là mã sửa đổi từ Giải pháp của Sanchothefat:

/**
 * If no title given then add widget-content wrapper to before_widget
 * If title given then add content wrapper to before_widget
*/
add_filter('dynamic_sidebar_params', 'check_widget_template');
function check_widget_template($params){
    global $wp_registered_widgets;

    $settings_obj = $wp_registered_widgets[$params[0]['widget_id']]['callback'][0];
    $the_settings = $settings_obj->get_settings();
    $the_settings = $the_settings[$params[1]['number']];

    if (isset($params[0]['id']) && $params[0]['id'] == 'home-sidebar-1') {
        if (!isset($the_settings['title']) && empty($the_settings['title'])) {
            $params[0]['before_widget'] .= '<div class="widget-inner">';
            $params[0]['after_widget']  .= '</div>';
        } else {
            $params[0]['after_widget']  .= '</div>';
            $params[0]['after_title']   .= '<div class="widget-inner">';
        }
    }

    return $params;
}

0

Như đã đề cập trong các bình luận, một số widget cốt lõi thêm tiêu đề riêng của chúng, sau đó được gói hai lần với div nội dung. Để loại bỏ chúng, bạn chỉ cần trả về một chuỗi rỗng. Nhược điểm duy nhất là bạn phải nhập tất cả các tiêu đề bằng tay.

function remove_default_widget_title( $title, $instance = [], $id = '' ) {
    if ( isset($instance['title']) && trim($instance['title']) == '' ) {
        return '';
    }
    return $title;
};
add_filter( 'widget_title', 'remove_default_widget_title', 10, 3 );

Sửa lỗi cho tôi nếu tôi thiếu thứ gì đó ở đây, nhưng tôi nghĩ nó khá chắc chắn.

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.