多站点-使用预先创建的页面、菜单等创建新站点

时间:2014-05-02 作者:user1049961

我正在开发一个网站,用户将在其中创建自己的子网站。

在创建新网站时,我需要预先填充一些页面、菜单设置等。有没有一种简单的方法可以做到这一点,可以使用什么挂钩?

1 个回复
SO网友:fuxia

合适的钩子是wpmu_new_blog. 我将描述我们在Multilingual Press Pro. 我们的代码实际上相当复杂;我将摘录最重要的几点。

我们提供了一个选项,可以选择任何现有博客作为新博客的模板。很好的一点是,你可以编辑模板内容,自定义主题,激活插件……就像在任何其他博客中一样。以后更改默认内容时,无需更新代码。

对于您的用例,您只需创建一个模板博客并获取博客ID即可。

add_action( \'wpmu_new_blog\', function( $blog_id ) {
    // copy the template blog here
});
回调中发生了什么?

我们得到模板博客的前缀(ID 44):

switch_to_blog( 44 );
$template_prefix = $wpdb->prefix;
restore_current_blog();
我们删除新博客的新表,并从模板博客中复制内容。

foreach ( $tables as $table )
{
    // empty the tables
    $wpdb->query( \'TRUNCATE TABLE \' . $wpdb->prefix . $table );
    // insert template content
    $wpdb->query( "INSERT INTO $wpdb->prefix$table SELECT * FROM $template_prefix$table" );
}
我们为新博客恢复了最重要的选项(blogname, home, admin_email 等)并重命名user_roles 以匹配当前博客。

然后我们复制附件。这些……并不简单。wp_upload_dir() 之后不可靠switch_to_blog(). 您必须添加一些变通方法才能获得正确的路径。这实际上是一个单独的类,有250行。:)

还有其他问题,如域映射插件、自定义插件表以及与使用相同挂钩或主题的其他插件以及需要安装调用的插件的一些小兼容性问题。当你只需要一个站点的解决方案时,他们不应该打扰你。

结束

相关推荐

Deleting a user in multisite

我试图在支付网关请求时删除用户,我有以下代码:(编辑代码以显示与支付网关通信的完整功能,echo向支付网关提供响应,退出是因为它在支付网关示例代码中使用。)function handle_gateway_return() { $GWPass = get_option( $this->gateway . \"_gateway_gwpass\" ); if ($_GET[\"GWPass\"] != $GWPass ) { header(