it-swarm.com.de

Fügen Sie Sie before_content und after_content zu register_sidebar hinzu

Gibt es eine Möglichkeit, der Funktion before_content zwei neue Funktionen hinzuzufügen, after_content und register_sidebar? Diese würden wie before_title und after_title funktionieren, mit der Ausnahme, dass alles, was nach dem Titel kommt, eingeschlossen wird.

Ich habe diesen Thread gefunden, der einige nützliche Informationen enthält, aber jeder erwähnte Ansatz weist Fehler auf.

Das Einfügen des erforderlichen Codes in after_title und after_widget kann beispielsweise zu einem fehlerhaften Code führen, wenn kein Titel festgelegt ist. Die Lösung wäre, das öffnende Div in before_widget zu duplizieren und es in before_title wieder zu schließen und es dann in before_title wieder zu öffnen, aber das erzeugt ein leeres Div, wenn ein Titelgesetzt ist.

Idealerweise würde ich das gerne machen:

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

Welches würde ausgeben als:

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

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

Die Einschränkung liegt in den vorhandenen Argumenten und in der Art, wie so ziemlich alle Widgets normalerweise Inhalte ausgeben:

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

// Widget content

echo $args['after_widget'];

Einige Widgets bieten möglicherweise Vor/Nach-Inhalts-Hooks an, aber wenn Sie eine "globale" Korrektur wünschen, gibt es keinen sicheren Weg, dies zu umgehen.

Die einzige Lösung, die ich sehen kann, besteht darin, den Zeilenumbruch zweimal hinzuzufügen und die Reste mit CSS :empty auszublenden:

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

Bei Widgets mit Titeln erhalten Sie also:

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

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

Geben Sie das oben genannte CSS ein:

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

Dadurch wird der erste redundante Wrap ausgeblendet. Ein bisschen dreckig, ich weiß, aber es bedeutet, dass Titel oder kein Titel, Sie haben immer Ihren Inhalt in .box-bd eingepackt.

4
TheDeadMedic