Adăugarea unui div pentru a încadra conținutul widget-ului după titlul acestuia

3 dec. 2012, 11:57:10
Vizualizări: 21.7K
Voturi: 10

Încerc să adaug un div pentru conținutul unui widget în sidebar-ul meu dinamic.

Iată codul de înregistrare;

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

Dar acest cod generează următoarea structură;

<div class="sidebar-box">
    <div class="title">{TITLUL WIDGET-ULUI}</div>
     {CONȚINUTUL WIDGET-ULUI}
</div>

Iată ce încerc să obțin;

<div class="sidebar-box">
    <div class="title">{TITLUL WIDGET-ULUI}</div>
    <div class="content">
           {CONȚINUTUL WIDGET-ULUI}
    </div> 
</div>

Cum poate fi realizat acest lucru?

0
Toate răspunsurile la întrebare 7
4
19

În plus față de răspunsul lui Toscho, iată ce ai nevoie pentru o soluție robustă:

// dacă nu există titlu, atunci adaugă wrapper-ul de conținut al widget-ului înaintea widget-ului
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;
}

Din răspunsul lui 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">',
));

Acest cod face următoarele:

  • verifică setările pentru bara laterală înregistrată pentru widget-uri care se termină cu 2 tag-uri de închidere <div>
  • verifică dacă nu există titlu
  • dacă nu există, modifică output-ul before_widget pentru a afișa div-ul de deschidere al conținutului widget-ului

Poți folosi această abordare pentru a modifica argumentele barei laterale în alte moduri pe baza setărilor instanței widget-ului.

3 dec. 2012 14:54:49
Comentarii

Am o problemă cu asta: unele widget-uri (cum ar fi cele implicite din WP, de exemplu) setează un titlu implicit dacă îl lași gol. Deci funcția ta adaugă div-ul pentru că în acel moment nu există un titlu în parametri, dar widget-ul îl adaugă ulterior și codul este încurcat. Știi cum să verifici titlul „din interiorul” widget-ului? Mulțumesc

Cmorales Cmorales
25 ian. 2013 03:36:34

Nu fără a adăuga o verificare widget cu widget sau un cod oribil de complex pentru a afișa widget-ul în mod silențios și apoi a-l analiza în căutarea unui titlu... O să mă gândesc

sanchothefat sanchothefat
25 ian. 2013 19:07:57

Poate conectarea la această http://codex.wordpress.org/Function_Reference/the_widget ar putea ajuta? Ei o folosesc (din alte motive) în acest articol http://wp.smashingmagazine.com/2012/12/11/inserting-widgets-with-shortcodes/

Cmorales Cmorales
29 ian. 2013 02:53:32

the_widget() nu este folosit în funcția dynamic_sidebar(), este o metodă de a apela orice widget cu opțiuni pe care le specifici direct. Este un alt punct unde se poate aplica un filtru, așa că soluția mea nu acoperă această eventualitate. Salutări

sanchothefat sanchothefat
29 ian. 2013 19:14:37
1

Mi-a plăcut ideea ambelor răspunsuri ale lui @tosco și @sanchothefat - totuși, am avut dificultăți cu această combinație, deoarece, deși empty( $settings[ 'title' ] ar putea într-adevăr returna true, widget-ul în sine ar putea afișa un titlu implicit dacă nu este setat niciunul. Acest titlu este apoi încadrat în marcajele before_title și after_title, iar pagina se strică din nou. Acesta este cazul cu unele dintre widget-urile implicite, oricum.

Este mai ușor să rămânem la parametrii standard de înregistrare a widget-urilor;

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

și apoi să adăugăm o acțiune de filtru conform răspunsului lui Marventus aici;

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');
25 sept. 2013 17:37:58
Comentarii

și asta funcționează doar pentru "Widget-uri Text"

Prashant Pugalia Prashant Pugalia
15 dec. 2014 16:23:18
3

Adaugă al doilea div la parametrul title:

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">',
    ));
3 dec. 2012 11:59:38
Comentarii

Aceasta eșuează dacă nu există un titlu pentru widget - dar se poate rezolva

sanchothefat sanchothefat
3 dec. 2012 12:15:11

Da, eșuează când nu există titlu..

MBraiN MBraiN
3 dec. 2012 14:06:38

Am adăugat un răspuns cu niște cod pentru a rezolva problema titlurilor. Ar trebui probabil să fie îmbinat cu cel al lui Toscho, dar el are deja reputație epică :)

sanchothefat sanchothefat
3 dec. 2012 14:56:47
1

Iată ce trebuie să faci pentru a obține acest lucru:

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

Când nu există titlu, vei obține:

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

Când există un titlu, vei obține:

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

Pentru a te asigura că primul div de content gol nu este afișat în cel de-al doilea caz, adaugă acest cod în CSS:

.sidebar-box .content:empty {display:none !important;}
14 nov. 2015 18:17:36
Comentarii

Foarte inteligent și funcționează.

Mohammed Mohammed
21 ian. 2021 20:38:43
1

După ce am analizat răspunsurile anterioare, cred că am rezolvat problema identificată de Cmorales în răspunsul lui sanchothefat. Definiți widget-ul dvs. astfel:

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

Este important ca valorile implicite pentru before_title și after_title să fie eliminate. După câteva încercări, am observat că primul filtru care afișa un titlu implicit era widget_title. Apoi folosiți filtrul widget_title astfel:

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

Practic, <div class="panel-heading"><h3 class="panel-title"> reprezintă before_title-ul meu, iar </h3></div> reprezintă after_title-ul meu. În final, folosiți dynamic_sidebar_params pentru a adăuga un div de închidere pentru învelișul conținutului nostru:

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

Nu este elegant, dar funcționează.

3 apr. 2014 21:52:22
Comentarii

La început am fost foarte entuziasmat de această abordare, dar am întâmpinat o problemă cu widget-urile care folosesc esc_html($title) (cum ar fi BuddyPress). În acest caz, HTML-ul adăugat este afișat escapuit și nu este randat în partea frontală.

Ryan Ryan
25 aug. 2014 05:53:35
0

Am modificat ușor codul astfel încât să nu fie nevoie să modificăm register_sidebar. Înregistrez o bară laterală în mod obișnuit:

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

Iar mai jos este codul modificat din soluția lui Sanchothefat:

/**
 * Dacă nu este dat un titlu, atunci adaugă un wrapper widget-content la before_widget
 * Dacă este dat un titlu, atunci adaugă un wrapper de conținut la 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;
}
23 mar. 2019 01:15:39
0

După cum am menționat în comentarii, unele widget-uri de bază adaugă propriul lor titlu, care apoi este încadrat de două ori cu div-ul de conținut. Pentru a le elimina, puteți pur și simplu returna un șir gol. Singurul dezavantaj este că trebuie să introduceți manual toate titlurile.

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

Corectați-mă dacă greșesc, dar cred că această soluție este destul de solidă.

14 feb. 2020 17:18:03