J'essaie d'ajouter un div au contenu d'un widget dans ma barre latérale dynamique.
Voici le code du registre;
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>',
));
Mais ce code provoque comme ceci;
<div class="sidebar-box">
<div class="title">{WIDGET TITLE}</div>
{WIDGET CONTENT}
</div>
Voici ce que j'essaie de faire.
<div class="sidebar-box">
<div class="title">{WIDGET TITLE}</div>
<div class="content">
{WIDGET CONTENT}
</div>
</div>
Comment cela peut-il être fait?
En plus de la réponse de Toscho, voici ce dont vous avez besoin pour une solution robuste:
// 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;
}
De la réponse de 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">',
));
Ce que cela fait est:
<div>
s de fermeturebefore_widget
pour afficher le contenu d'ouverture du widget divVous pouvez utiliser cette approche pour modifier les arguments de la barre latérale d'une autre manière en fonction des paramètres de l'instance de widget.
J'aimais bien l'idée des réponses @tosco et @sanchothefat - cependant, j'ai eu du mal à combiner cette combinaison car, bien que empty( $settings[ 'title' ]
puisse effectivement renvoyer la valeur true, le widget lui-même peut générer un titre par défaut si aucune n'est définie. Ce titre est ensuite encapsulé dans les balises before_title
et after_title
et à nouveau les sauts de page. C'est le cas avec certains des widgets par défaut de toute façon.
Plus facile de simplement s'en tenir aux paramètres d'enregistrement de widget standard;
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>',
));
puis ajoutez une action de filtrage selon la réponse de Marventus ici;
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');
Ajoutez la deuxième div
au paramètre 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">',
));
Voici ce que vous faites pour y parvenir:
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">',
))
Quand il n'y a pas de titre, vous aurez:
<div class="sidebar-box"><div class="content">
{CONTENT}
</div></div>
Quand il y a un titre, vous aurez:
<div class="sidebar-box"><div class="content">
</div><div class="title">
{TITLE}
<div class="content">
{CONTENT}
</div></div>
Pour vous assurer que le premier contenu-div vide ne s'affiche pas dans le dernier cas, vous ajoutez ceci à votre css:
.sidebar-box .content:empty {display:none !important;}
Après avoir examiné les réponses précédentes, je pense avoir résolu le problème que Cmorales avait identifié à la réponse de sanchothefat. Définissez votre widget comme suit:
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' => ''
) );
Il est important que les valeurs par défaut before_title
et after_title
soient supprimées. Après quelques essais et erreurs, j'ai remarqué que le premier filtre affichant un titre par défaut était widget_title
. Ensuite, utilisez le filtre widget_title
comme suit:
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;
}
Fondamentalement, <div class="panel-heading"><h3 class="panel-title">
est mon before_title
et </h3></div>
est mon after_title
. Enfin, utilisez dynamic_sidebar_params
pour ajouter une div de clôture à notre contenu:
function dynamic_sidebar_params( $params ) {
$params[0]['after_widget'] = '</div>' . $params[0]['after_widget'];
return $params;
}
Ce n'est pas joli, mais ça marche.