Adăugarea unui div pentru a încadra conținutul widget-ului după titlul acestuia
Î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?

Î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.

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

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

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/

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

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

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

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

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ă.

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

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ă.
