缺少侧栏参数“FIX”-BEFER_CONTENT

时间:2010-11-18 作者:Alex

正如您所知,边栏参数来自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>
只有在添加<div class="content">after_title 参数问题是,如果这样做,没有标题的小部件将破坏页面布局:(

那么,有没有一个解决方案可以以某种方式添加这一点<div class="content"> 之后div.title, 或之后div.container 是否缺少标题?

1 个回复
SO网友:Jan Fabry

此代码检测是否已设置标题,如果未设置,则会更改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;
}

结束