before_content
とafter_content
という2つの新しい関数をregister_sidebar
関数に追加する方法はありますか?これらはbefore_title
やafter_title
のように動作しますが、タイトルの後に続くすべてのものをラップします。
私は このスレッド にいくつかの有用な情報があるのを見つけましたが、言及されたすべてのアプローチには欠陥があります。
たとえば、after_title
とafter_widget
に必要なコードを挿入すると、タイトルが設定されていないとコードが破損する可能性があります。解決策は、最初のdivをbefore_widget
で複製し、それをbefore_title
で再度閉じてからbefore_title
で再度開くことですが、titleがに設定されている場合は空のdivを作成します。
理想的には、これをやりたいのですが。
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>",
));
これは次のように出力されます。
<div class="box box_Push">
<div class="box-hd">
<!-- widget title -->
</div>
<div class="box box-bd">
<!-- widget content-->
</div>
</div>
制限は既存の引数と、ほとんどすべてのウィジェットが通常どの程度コンテンツを出力するかにかかっています。
echo $args['before_widget'];
if ( $title ) {
echo $args['before_title'] . $title . $args['after_title'];
}
// Widget content
echo $args['after_widget'];
いくつかのウィジェットはコンテンツフックの前後に提供するかもしれません、しかしあなたが「グローバルな」修正を望むならば、それを回避する確実な方法はありません。
私が見ることができる唯一の解決策は、残りを隠すためにラップを二度追加してCSS :empty
を使うことです:
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>',
)
);
それで、タイトルのあるウィジェットでは、次のようになります。
<div class="box box_Push">
<div class="box box-bd"></div>
Widget Title
<div class="box box-bd">
Widget content
</div>
</div>
前述のCSSを入力してください。
.box-bd:empty {
display: none;
}
これはその最初の冗長なラップを隠します。ちょっと汚い、私は知っていますが、それはタイトルまたはタイトルなしを意味します、あなたは常にあなたのコンテンツを.box-bd
で包むでしょう。