web-dev-qa-db-fra.com

Ajouter before_content et after_content à register_sidebar

Est-il possible d'ajouter deux nouvelles fonctions, before_content et after_content à la fonction register_sidebar? Celles-ci fonctionneraient comme before_title et after_title, sauf qu’elles recouvriraient tout ce qui suit le titre.

J'ai trouvé ce fil qui contient des informations utiles, mais chaque approche mentionnée présente des défauts.

Par exemple, l'insertion du code requis dans after_title et after_widget peut entraîner la rupture du code si aucun titre n'est défini. La solution serait de dupliquer le div d'ouverture dans before_widget et de le refermer dans before_title puis de le rouvrir dans before_title, mais cela crée un div vide si un titre est défini .

Idéalement, j'aimerais faire ceci:

register_sidebar(array(
    "id"             => "sidebar",
    "name"           => "Sidebar",
    "before_widget"  => "<div class='box box_Push'>",
    "before_title"   => "<div class='box-hd'>",
    "after_title"    => "</div>",
    "before_content" => "<div class='box box-bd'>"
    "after_content"  => "</div>";
    "after_widget"   => "</div>",
));

Ce qui produirait comme:

<div class="box box_Push">
    <div class="box-hd">
        <!-- widget title -->
    </div>

    <div class="box box-bd">
        <!-- widget content-->
    </div>
</div>
1
JacobTheDev

La limitation est due aux arguments existants et au fait que tous les widgets génèrent généralement du contenu:

echo $args['before_widget'];
if ( $title ) {
    echo $args['before_title'] . $title . $args['after_title'];
}

// Widget content

echo $args['after_widget'];

Certains widgets peuvent offrir des crochets de contenu avant/après, mais si vous souhaitez une solution "globale", vous ne trouverez aucun moyen sûr de le contourner.

La seule solution que je vois est d'ajouter deux fois le bouclage et d'utiliser CSS :empty pour masquer les restes:

register_sidebar(
    array(
        'before_widget'  => '<div class="box box_Push"><div class="box box-bd">',
        'before_title'   => '</div>', // If we have a title, close the wrap above
        'after_title'    => '<div class="box box-bd">', // Now open another one
        'after_widget'   => '</div></div>',
    )
);

Donc, avec les widgets qui ont des titres, vous allez vous retrouver avec:

<div class="box box_Push">
    <div class="box box-bd"></div>
    Widget Title

    <div class="box box-bd">
        Widget content
    </div>
</div>

Entrez le CSS susmentionné:

.box-bd:empty {
    display: none;
}

Cela masquera ce premier bouclage redondant. Un peu sale, je sais, mais cela signifie titre ou pas de titre, votre contenu sera toujours emballé dans .box-bd.

4
TheDeadMedic