如何以编程方式将小部件添加到插件中新创建的站点(WPMU)?

时间:2014-09-08 作者:hazrpg

我正在制作一个插件来创建新站点(WPMU),并且有自己的小部件,需要将其放置到它创建的新站点上。

我遇到的问题是,我无法将插件插入到新创建的站点(最好是用我的插件替换所有小部件)。从某种意义上讲,它将插件置于“非活动”状态,而不是侧边栏中。

以下是我的代码:

function se160609($blog_id, $user_id, $domain, $path, $site_id, $meta) {
    switch_to_blog($blog_id);

    switch_theme("twentytwelve");

    register_sidebar(
        array (  
            \'name\'          => \'Main Sidebar\',
            \'id\'            => \'sidebar-1\',
            \'before_widget\' => \'\',
            \'after_widget\'  => \'\',
            \'before_title\'  => \'\',
            \'after_title\'   => \'\',
        )
    );

    update_option(\'widget_mywidget\',
        array(
            \'title\' => \'Policies\'
        )
    );

    update_option(\'sidebars_widgets\',
        array(
             \'sidebar-1\' => array(\'mywidget\')
        )
    );

    restore_current_blog();
}

add_action(\'wpmu_new_blog\', \'se160609\');
我还可以注册(和注销)小部件:

function se160609_load_widget() {
    register_widget( \'MyWidget\' );

    unregister_widget( \'WP_Widget_Archives\' );
    unregister_widget( \'WP_Widget_Calendar\' );
    unregister_widget( \'WP_Widget_Categories\' );
    unregister_widget( \'WP_Widget_Links\' );
    unregister_widget( \'WP_Widget_Meta\' );
    unregister_widget( \'WP_Widget_Pages\' );
    unregister_widget( \'WP_Widget_Recent_Comments\' );
    unregister_widget( \'WP_Widget_Recent_Posts\' );
    unregister_widget( \'WP_Widget_RSS\' );
    unregister_widget( \'WP_Widget_Search\' );
    unregister_widget( \'WP_Widget_Tag_Cloud\' );
    unregister_widget( \'WP_Widget_Text\' );
}
add_action( \'widgets_init\', \'se160609_load_widget\' );

1 个回复
最合适的回答,由SO网友:hazrpg 整理而成

似乎答案比我想象的要简单得多,所以我想我也会为那些偶然发现这个问题的人分享答案。

很明显,我在数据库中缺少了所需的内容,所以我也在拖动小部件前后对数据库进行了SQL转储。然后比较发生的变化。这有助于我分析需要加入的内容。结果是我没有正确地输入小部件设置。简单地说,我是在添加

Array
(
    [title] => Policies
)
WordPress期望的时间:

Array
(
    [2] => Array
        (
            [title] => Policies
            [_multiwidget] => 1
        )
)
所以我的代码看起来更像这样:

function se160609($blog_id, $user_id, $domain, $path, $site_id, $meta) {
    // Switch the newly created blog.
    switch_to_blog($blog_id);

        // Change to a different theme.
        switch_theme("twentytwelve");

        // Add WordPress options that the widget needs.
        $widget_mywidget = array();
        $widget_mywidget[2][\'title\'] = "Policies";
        $widget_mywidget[2][\'_multiwidget\'] = 1;
        update_option( \'widget_mywidget\', $widget_mywidget );

        // Add WordPress options to override the default widgets.
        $sidebar_widgets = get_option( \'sidebars_widgets\' );
        $sidebar_widgets[\'sidebar-1\'] =  array(\'mywidget-2\');
        update_option( \'sidebars_widgets\', $sidebar_widgets );

    // Restore the current blog.
    restore_current_blog();
}
add_action(\'wpmu_new_blog\', \'se160609\');
为了解释这里的一些信息,请注意数组中的第一部分是[2], 这是小部件的实例号-因为小部件可以多次添加,所以如果您想有多个小部件,基本上可以通过从数字2递增来构建数组。它可以通过给它一个数字来工作,但出于某种原因,2似乎是最好的起始数字(当为默认小部件创建新的多站点站点时,以及当您拖放时,它是首先分配的数字)。

[_multiwidget] 我还没有完全理解,但我想这是因为我正在制作一个可以在wpmu上工作的插件,所以这会将小部件设置为允许在多站点环境中看到(如果我错了,请纠正我)。

结束

相关推荐

WordPress MultiSite中的共享上载文件夹

我有一个wordpress多站点,我希望通过主站点(mysite.com)上传的所有图片都可以访问sub1.mysite.com 和sub2.mysite.com. 所有图像应位于一个没有子目录的文件夹中(例如:wp-content/uploads/image.jpg).我尝试了下面的函数,但我的子域图像上载到wp-content/uploads/sites/#blog_id/function wpse_16722_upload_dir( $args ) { $newdir = \'/\'