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