调用Dynamic_Sidear但包含/排除命名的小部件?

时间:2011-05-19 作者:Scott B

是否可以包括或排除分配给命名dynamic\\u侧栏调用的特定命名小部件?

例如,如果我注册了一个名为“my\\u sidebar”的边栏,并且用户在其中放置了一个“Links”小部件,那么我希望能够根据主题选项面板中的自定义设置将其包括或排除。

这可能吗?

非常感谢您的任何见解。

3 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

dynamic_sidebar() 呼叫wp_get_sidebars_widgets() 获取每个侧栏的所有小部件。我认为过滤这个输出是从侧边栏中删除小部件的最佳方式。

add_filter( \'sidebars_widgets\', \'wpse17681_sidebars_widgets\' );
function wpse17681_sidebars_widgets( $sidebars_widgets )
{
    if ( is_page() /* Or whatever */ ) {
        foreach ( $sidebars_widgets as $sidebar_id => &$widgets ) {
            if ( \'my_sidebar\' != $sidebar_id ) {
                continue;
            }
            foreach ( $widgets as $idx => $widget_id ) {
                // There might be a better way to check the widget name
                if ( 0 === strncmp( $widget_id, \'links-\', 6 ) ) {
                    unset( $widgets[$idx] );
                }
            }
        }
    }

    return $sidebars_widgets;
}

SO网友:Sumit

我补充了另一个答案来回答这个问题:-How to exclude certain widget from showing up on home/front page?

WordPress具有内部功能_get_widget_id_base() 我不知道使用它有多安全。但是WordPress使用widget ID而不是strpos()strncmp().

示例:-

add_filter(\'sidebars_widgets\', \'conditional_sidebar_widget\');
/**
 * Filter the widget to display
 * @param array $widets Array of widget IDs
 * @return array $widets Array of widget IDs
 */
function conditional_sidebar_widget($widets) {
    $sidebar_id = \'sidebar-1\'; //Sidebar ID in which widget is set

    if ( (is_home() || is_front_page()) && !empty($widets[$sidebar_id]) && is_array($widets[$sidebar_id]) ) {
        foreach ($widets[$sidebar_id] as $key => $widget_id) {
            $base_id = _get_widget_id_base($widget_id);
            if ($base_id == \'recent-posts\') {
                unset($widets[$sidebar_id][$key]);
            }
        }
    }

    return $widets;
}

SO网友:maioman

扩展Jan的答案,我发现strpos() 而不是strncmp() 用于检查小部件名称(更快..)

下面,您将发现一个类似的功能(正在运行和测试),它将使您获得相同的结果:

 add_filter( \'sidebars_widgets\', \'hide_widgets\' );
 function hide_widgets( $excluded_widgets )
    {
        if ( is_page() /* Or whatever */ ) {
     //set the id in \'sidebar-id\' to your needs
            foreach ( $excluded_widgets[\'sidebar-id\'] as $i => $inst) {

     //in this example we\'ll check if the id for the rss widgets exists.(change it to suit your needs)

            $pos = strpos($inst, \'rss\');

            if($pos !== false)
            {
                //unsetting the id will remove the widget 
                unset($excluded_widgets[\'sidebar-id\'][$i]);
            }
        }    
    }
    return $sidebars_widgets;
    }

结束

相关推荐

Why use widgets?

我对使用WordPress很陌生,我想知道使用小部件的好处是什么?看here 这听起来像是为那些不是程序员的人准备的,他们想在他们的网站上添加插件。对吗?或者小部件是否在某种程度上使站点更加健壮?