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