Widget başlığından sonra widget içeriğini kaydırmak için div ekleme


10

Dinamik kenar çubuğumda bir widget'ın içeriğine div eklemeye çalışıyorum.

İşte kayıt kodu;

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

Ancak bu kod şöyle olur;

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

İşte yapmaya çalıştığım şey;

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

Nasıl yapılabilir?

Yanıtlar:


18

Toscho'nun cevabına ek olarak, sağlam bir çözüm için ihtiyacınız olan şey:

// 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;
}

Toscho'nun cevabından:

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

Bunun yaptığı:

  • 2 kapanış <div>s ile biten widget'lar için kayıtlı kenar çubuğunun ayarlarını kontrol eder
  • başlık bulunup bulunmadığını kontrol eder
  • değilse, before_widgetçıktıyı açılış widget içeriği div'i gösterecek şekilde değiştirir

Kenar çubuğu argümanlarını widget örneğinin ayarlarına bağlı olarak başka şekillerde değiştirmek için bu yaklaşımı kullanabilirsiniz.


Bununla ilgili bir sorunum var: bazı widget'lar (örneğin WP varsayılan olanlar gibi) bu alanı boş bırakırsanız varsayılan bir başlık ayarlar. Bu nedenle işleviniz div ekler, çünkü bu noktada parametrelerde bir başlık yoktur, ancak widget daha sonra ekler ve kod dağınıktır. Widget "içinden" başlığı nasıl kontrol edeceğinizi biliyor musunuz? Teşekkürler
Cmorales

Widget tarafından bir widget eklemeden veya widget'ı sessizce işlemek için korkunç derecede karmaşık bir kod eklemeden değil, daha sonra bir başlık için ayrıştırın ... Bir düşünün olacak
sanchothefat


1
the_widget()dynamic_sidebar()işlevde kullanılmazsa, belirlediğiniz seçeneklerle herhangi bir widget'ı çağırmanın bir yoludur. Filtrelemek için başka bir yer, bu yüzden çözümüm bu olasılığı kapsamıyor. Şerefe
sanchothefat

2

İkincisini divtitle parametresine ekleyin :

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

Widget başlığı yoksa başarısız olur - yine de yapılabilir
sanchothefat

Evet, başlık olmadığında başarısız olur ..
MBraiN

Başlıklar sorununu çözmek için bazı kodlarla bir cevap ekledim. Muhtemelen Toscho's ile birleştirilmeli ama epik temsilcisi var :)
sanchothefat

2

Hem @tosco hem de @sanchothefat cevapları fikrini beğendim - ancak bu kombinasyonla mücadele ettim, çünkü empty( $settings[ 'title' ]gerçekten doğru dönebilirken, hiçbiri ayarlanmamışsa widget'ın kendisi varsayılan bir başlık verebilir. Bu başlık daha sonra before_titleve after_titleişaretine sarılır ve sayfa bozulur. Yine de bazı varsayılan widget'larda durum böyle.

Standart widget kayıt parametrelerine sadık kalmak daha kolaydır;

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

ve ardından Marventus'un cevabına göre bir filtre eylemi ekleyin;

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
ve bu yalnızca "Metin Widget'ları" için geçerlidir
Silver Moon

1

Bunu başarmak için yapmanız gerekenler:

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">',
    ))

Başlık olmadığında:

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

Bir başlık olduğunda:

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

İlk boş content-div öğesinin ikinci durumda gösterilmediğinden emin olmak için bunu css'nize eklersiniz:

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

0

Önceki cevaplara baktıktan sonra sanırım sanchothefat'ın cevabı ile tanımlanan sorunu çözdüm. Widget'ınızı aşağıdaki gibi tanımlayın:

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

before_titleVe after_titlevarsayılanlarının kaldırılması önemlidir . Bazı deneme ve hatalardan sonra, varsayılan bir başlık gösteren ilk filtrenin olduğunu belirttim widget_title. Ardından widget_titlefiltreyi şu şekilde kullanın :

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;
}

Temel olarak, <div class="panel-heading"><h3 class="panel-title">benim before_titleve </h3></div>benim after_title. Son olarak, dynamic_sidebar_paramsiçerik paketimiz için kapanış div değerini eklemek için kullanın :

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

Güzel değil, ama işe yarıyor.


Başlangıçta bu yaklaşım ile çok heyecanlandım, ama esc_html ($ title) (yani BuddyPress) kullanan widget'larla ilgili bir sorunla karşılaştım. Bu durumda, eklenen HTML çıkış olarak görüntülenir ve kullanıcı arabiriminde görüntülenmez.
Ryan

0

Ben sadece register_sidebar dokunmak gerekmez kodu biraz değiştirin . Kenar çubuğunu düzenli olarak kaydedin:

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

Ve aşağıda kodu Sanchothefat'ın Çözümünden değiştirildi:

/**
 * 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

Yorumlarda belirtildiği gibi, bazı temel widget'lar kendi başlıklarını ekler ve daha sonra içerik div ile iki kez sarılır. Bunları kaldırmak için boş bir dize döndürebilirsiniz. Tek dezavantajı, tüm başlıkları manuel olarak girmeniz gerektiğidir.

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

Burada bir şey eksikse beni düzeltin, ama bence bu oldukça sağlam.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.