web-dev-qa-db-fra.com

Ajout d'un div pour envelopper le contenu du widget après le titre du widget

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?

10
MBraiN

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:

  • vérifie les paramètres de la barre latérale enregistrée pour les widgets se terminant par 2 <div>s de fermeture
  • vérifie s'il n'y a pas de titre
  • sinon, il modifie la sortie before_widget pour afficher le contenu d'ouverture du widget div

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

17
sanchothefat

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

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

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

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.

0
Spencer