开发多站点网络

WordPress 核心包含一组函数和钩子,用于控制网络的某些方面或网络中的单个站点。

在本课中,你将了解需要注意的多站点特定函数命名约定,然后深入探讨一些有用的多站点特定函数和钩子。最后,你将学习如何为网络中的单个站点进行开发,以及在哪里可以获取关于多站点函数和钩子的更多信息。

关于命名约定的说明

WordPress 代码库中,关于多站点存在几种不同的命名约定。

WordPress 多站点最初被称为 WordPress MU(或 WordPress 多用户),许多与多站点相关的函数和钩子都使用 wpmu_ 前缀。

此外,一些函数基于旧术语命名,这些旧术语描述了一个“站点”上的多个“博客”。现在这已被更新为描述一个“网络”上的多个“站点”,但一些旧术语仍然存在于某些函数名称中。

有用的函数

当你开发一个支持多站点网络的产品时,了解一些有用的内部函数是值得的。

第一个是 is_multsite 函数。如果启用了多站点,此函数将返回 true,并且可能是与多站点相关的最广泛使用的函数。如果你在 WordPress 代码库中搜索 is_multsite 函数的使用情况,你会看到它在许多地方被使用,要么是在多站点网络上下文中执行特定任务,要么是将功能限制为仅适用于多站点网络。

还有一些常用函数在开发多站点网络的管理界面时非常有用:

  • is_super_admin 可用于检查当前登录用户是否为网络上的网络管理员。
  • is_network_admin 是 is_admin 函数的多站点等效项,用于确定当前请求是否针对网络管理界面。
  • network_admin_url 是 admin_url 函数的多站点等效项,允许你创建相对于网络管理区域的 URL。这对于重定向到网络管理仪表板的不同区域非常有用。

在处理站点内容时,有一些广泛使用的函数。

is_main_site 确定当前站点是否是当前网络的主站点。

接下来是 get_sites 函数,它将返回与请求参数匹配的站点列表。

然后是 switch_to_blog,它允许你切换到网络中的不同站点,restore_current_blog 在你切换到不同站点后恢复当前站点,以及 get_current_blog_id,它返回当前站点的 ID。

使用这些函数,你可以在整个网络中执行操作。

例如,假设你想创建一个函数来更新网络中特定站点上的一个选项。

function update_site_option( $site_id,  $option_name, $option_value ) {
    switch_to_blog( $site_id );
    update_option(  $option_name, $option_value );
    restore_current_blog();
}

但是,如果你想扩展该功能以在所有站点上更新相同的选项,你可以使用 get_sites 函数,并遍历网络中的所有站点。

function update_option_on_all_sites( $option_name, $option_value ) {
    $sites = get_sites();
    foreach ( $sites as $site ) {
        switch_to_blog( $site->blog_id );
        update_option( 'my_option', 'my_value' );
        restore_current_blog();
    }
}

你也可以使用 update_blog_option 函数来更新特定站点上的选项,而无需切换到该站点。

function update_option_on_all_sites( $option_name, $option_value ) {
    $sites = get_sites();
    foreach ( $sites as $site ) {
        update_blog_option( $site->blog_id, $option_name, $option_value );
    }
}

在开发多站点插件时,有 is_network_only_plugin 函数。这是一个特定于插件的函数,用于检查插件头部中的“Network: true”,以确定是否应仅作为网络范围的插件激活。如果你想限制一个插件只能在整个网络上激活,而不能在单个站点上激活,这将非常有用。

有用的钩子

在开发多站点时,还有一些有用的钩子可以使用。

第一个是 network_admin_menu 钩子,它允许你向网络管理仪表板添加菜单项。如果你想向网络管理仪表板添加自定义菜单项,这将非常有用。

第二个是 network_admin_notices 钩子,它允许你向网络管理仪表板添加通知。这可用于向网络管理员显示通知,就像 admin_notices 用于单站点通知一样。

signup_blogform 是一个过滤器,允许你修改新站点的注册表单。你可以使用它向注册表单添加额外的字段。

wp_initialize_site 是一个动作,在创建新站点时触发。如果你想在创建新站点时执行操作,例如为子站点分配自定义顶级域名,这将非常有用。

为网络中的单个站点进行开发

当你在网络中单个站点的范围内渲染任何内容时,WordPress 核心足够智能,能够知道你正在该站点的范围内工作。

这意味着你用来检索信息的任何函数,例如 get_bloginfo、get_option、get_posts 或 get_post_meta,以及你用来添加或更新信息的任何函数,比如 update_option、wp_insert_post 或 update_post_meta,都会针对你当前正在操作的站点获取、添加或更新正确的数据表。

此外,如果你使用像 register_post_typeregister_taxonomy 这样的函数,它们将仅为当前站点注册。

进一步阅读

要查看所有 WordPress 多站点相关函数和钩子的完整列表,请查阅 WordPress 开发者参考中的多站点包类别。