如何获取所有活动小工具的选项?

时间:2015-05-18 作者:Benn

我目前正在使用一个循环,通过所有侧栏查找小部件,而不是再次循环这些小部件,以获得所有小部件选项。

在上执行此操作

add_filter(\'sidebars_widgets\', array($this, \'sidebars_widgets\'));
过滤器,我需要循环这么多来获取所有选项,这似乎并不正确

我从DisplayWidgets插件中选取了这个示例,但它似乎并不正确

function sidebars_widgets($sidebars) {    
    if ( is_admin() ) {
        return $sidebars;
    }

    global $wp_registered_widgets;

    foreach ( $sidebars as $s => $sidebar ) {
        if ( $s == \'wp_inactive_widgets\' || strpos($s, \'orphaned_widgets\') === 0 || empty($sidebar) ) {
            continue;
        }

        foreach ( $sidebar as $w => $widget ) {
            // $widget is the id of the widget
            if ( !isset($wp_registered_widgets[$widget]) ) {
                continue;
            }

                $opts = $wp_registered_widgets[$widget];
                $id_base = is_array($opts[\'callback\']) ? $opts[\'callback\'][0]->id_base : $opts[\'callback\'];

                if ( !$id_base ) {
                    continue;
                }

                $instance = get_option(\'widget_\' . $id_base);

                if ( !$instance || !is_array($instance) ) {
                    continue;
                }

                if ( isset($instance[\'_multiwidget\']) && $instance[\'_multiwidget\'] ) {
                    $number = $opts[\'params\'][0][\'number\'];
                    if ( !isset($instance[$number]) ) {
                        continue;
                    }

                    $instance = $instance[$number];
                    unset($number);
                }

                unset($opts);

                print_r($instance);// here they are



            unset($widget);
        }
        unset($sidebar);
    }

    return $sidebars;
}
你知道更好更快的方法吗?

2 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

对我来说,这实际上似乎是一种相当合理的方法。

循环通过它并没有什么错,有时它是唯一/最快的方式。

我不知道你是怎么得到侧边栏的

$sidebars_widgets = get_option( \'sidebars_widgets\' );
可以使用。它为您提供了一个关联数组,其中包含每个侧栏的小部件列表和所有非活动小部件的列表。

SO网友:Hisham Dalal

此功能可能有助于:

function get_all_widgets_data($sidebar_id=null){
    $result = [];
    $sidebars_widgets = get_option(\'sidebars_widgets\');

    if(is_array($sidebars_widgets)){

        foreach ($sidebars_widgets as $key => $value) {

            if(is_array($value)){
                foreach ($value as $widget_id) {
                    $pieces = explode(\'-\', $widget_id);
                    $multi_number = array_pop($pieces);
                    $id_base = implode(\'-\', $pieces);
                    $widget_data = get_option(\'widget_\' . $id_base);
                    
                    // Remove inactive widgets 
                    if($key != \'wp_inactive_widgets\' ) {
                        unset($widget_data[\'_multiwidget\']);
                        $result[$key] = $widget_data;
                    }
                }
            }
        }
    }
    if($sidebar_id){
        return isset($result[$sidebar_id]) ? $result[$sidebar_id] : [] ;
    }
    return $result;
}

结束

相关推荐

Options for an SEO gallery?

我目前使用的是我喜欢的标准Wordpress图库,因为我的很多访问者在搜索了一些包含在图像描述中的文本后,通过谷歌找到了我。很明显,它以这样一种方式呈现了图库,文本被视为非常突出,我的许多访问者都通过图库进入。问题是gallery只支持纵向,而我还需要一些东西来显示横向中的图像(以避免边缘裁剪)。我发现一些允许两种方向的画廊很难将图像放在屏幕上,使它们看起来很好。我喜欢的最好的例子是Flickr,其中图像以俄罗斯方块的形式显示,但显然不允许在其下方发表评论。我完全有能力在wordpress插件中寻找一个好