ウィジェットのレイアウトを制御する register_sidebar() のサイドバーパラメータは、
- before_widget
- after_widget
- before_title
- after_title
問題は、 'before_content
'のようなパラメータがないために、特定のタイプのデザインを実装できないことです。
例えば:
<div class="container">
<div class="title">
title
</div>
<div class="content">
content
</div>
</div>
このようなHTML構造は、<div class="content">
パラメータにafter_title
を追加した場合にのみ可能です。問題は、これを行うと、タイトルのないウィジェットがページレイアウトを壊すということです:(
<div class="content">
の後、またはtitleがない場合はdiv.title
の後にdiv.container
を追加する解決策はありますか。
このコードはタイトルが設定されているかどうかを検出し、設定されていない場合はbefore_widget
引数を変更します。
add_filter( 'widget_display_callback', 'wpse4213_widget_display_callback', 10, 3 );
function wpse4213_widget_display_callback( $instance, $widget, $args )
{
if ( empty( $instance['title'] ) ) {
$args['before_widget'] = '<div class="container"><div class="content">';
$widget->widget( $args, $instance );
return false;
}
return $instance;
}
ウィジェットを表示したくない場合はwidget_display_callback
によってfalse
を返すことができるため、このコードは機能します。この場合、私たちは自分自身でウィジェットを表示するので、WordPressにそれを二度とさせたくありません。ハックですが、うまくいきます。
ウィジェットがデフォルトのタイトルを提供している場合(コアディストリビューションにバンドルされているほとんどのウィジェットが提供するように)、この関数は失敗します。これを検出するために、最初にウィジェットを出力バッファにレンダリングしようとする関数も作成しました。この出力バッファでtitle要素を検出した場合、ウィジェットはデフォルトのタイトルを持っていたので、バッファを無視して通常のウィジェットのように表示します。しかし、これはウィジェットが過活動キャッシュを使用している場合にも破綻する可能性があるので、それもフラッシュする必要があります。私はこれがハックだと言ったのですか?
add_filter( 'widget_display_callback', 'wpse4213_widget_display_callback', 10, 3 );
function wpse4213_widget_display_callback( $instance, $widget, $args )
{
if ( empty( $instance['title'] ) ) {
$args['before_widget'] = '<div class="container"><div class="content">';
ob_start();
$widget->widget( $args, $instance );
$widget_content = ob_get_contents();
ob_end_clean();
if ( false !== strpos( $widget_content, 'widget-title' ) ) {
// It did return a title!
if ( method_exists( $widget, 'flush_widget_cache' ) ) {
$widget->flush_widget_cache();
}
return $instance;
}
echo $widget_content;
return false;
}
return $instance;
}