仅当Widget实际实例化(不仅仅是注册)时才运行操作

时间:2013-05-16 作者:Tom Auger

假设您有一个小部件,它依赖于要添加到(例如)您的帖子中的元盒。一种简单的方法是添加add_meta_boxes 操作小部件的构造函数,然后开始。当该小部件注册到register_widget() 功能,你的代谢箱被添加,然后你就可以开始了。

这种方法的问题是,如果用户实际上没有将小部件拖到他的边栏中,我们仍然会添加元框。而且,如果出于某种原因,我们注册了这个小部件的两个不同版本(比如我们扩展了这个小部件),那么我们将无用地运行该功能两次。

wp_register_sidebar_widget 在小部件注册时调用,但这意味着无论小部件是否实际显示在侧栏中,它都会运行。

当小部件实际加载到侧栏时,是否有相应的操作运行?那么换句话说,一个操作只会为实际添加到侧栏的每个小部件运行?还是我们必须仔细查看通过的小部件列表wp_get_sidebars_widgets()?

1 个回复
SO网友:Tom Auger

我仍然渴望听到适用于此用例的操作,但如果没有其他结果,这里有一种更为暴力的方法:

// within My_Widget class definition
private static $metaboxes_added = false; // to ensure we don\'t add them more than once

// inside My_Widget class constructor
add_action( \'init\', array( $this, \'add_metaboxes\' ) );

// later, inside My_Widget class
public function add_metaboxes(){
    global $wp_registered_sidebars;

    if ( is_admin() && ! self::$metaboxes_added ){
        // These are the widgets grouped by sidebar
        $sidebars_widgets = wp_get_sidebars_widgets();

        foreach ( $sidebars_widgets as $sidebar_id => $widgets ) {
            if ( \'wp_inactive_widgets\' == $sidebar_id )
                continue;

            if ( isset( $wp_registered_sidebars[ $sidebar_id ] ) ) {
                if ( in_array( $this->id, $widgets ) ){ // $this is our Widget
                    self::$metaboxes_added = true; // In case we instantiate this sucker twice

                    add_action( \'add_meta_boxes\', array( $this, \'add_metabox_stuff\' ) );

                    break; // No need to go any further
                }
            }
        }
    }
}

结束

相关推荐

Using tabs in admin widgets

更新:我应该指出,我在插件/主题选项页面上测试了下面的方法,效果非常好。事实上,我还能够包括jQuery cookie插件,以保留页面加载之间的当前选项卡选择(很好!)。当您有多个小部件选项时,尝试向管理小部件添加选项卡以减少表单占用空间。我正在使用WordPress附带的jQuery UI选项卡。以下是我迄今为止在插件中编写的代码。http://pastebin.com/fe4wdBcp当小部件被拖动到小部件区域时,选项卡似乎呈现为OK,但您无法单击查看第二个选项卡。更糟糕的是,如果刷新窗口小部件页面,