web-dev-qa-db-ja.com

サイドバーパラメータ "fix"がありません - before_content

ウィジェットのレイアウトを制御する 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を追加する解決策はありますか。

1
Alex

このコードはタイトルが設定されているかどうかを検出し、設定されていない場合は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;
}
2
Jan Fabry