当我们谈论在WordPress多站点网络上安装的插件时,有些插件可以被激活以供整个网络使用,而有些则只能在特定的单个站点上激活。
网络激活的插件:
针对特定站点激活的相同插件:
理解它的工作原理应该不太困难,但当我们尝试在代码中检查一个插件是否被激活为整个网络还是只对特定站点时,可能会遇到问题。
有很多不同的方法可以实现这一点,每种方法都有其独特之处。
is_plugin_active_for_network()
如果一个插件是为整个网络激活的,那么这个函数就会返回真(true)。所以比如说,如果我们在站点1上使用这个函数,而我们的插件只在站点1上激活,并没有被设置为网络范围内激活,那么这个函数会返回假(false)。
if( is_plugin_active_for_network( 'woocommerce/woocommerce.php' ) ) {
// WooCommerce is network-activated
} else {
// WooCommerce isn't network-activated
}
is_plugin_active()
这个函数很实用,因为它完成两项工作:
- 它会检查插件是否仅在你当前使用的网站上被激活。
- 它还会检查插件是否被设置为在整个网络上激活。
如果这两个条件中的至少一个成立,就会返回真(true)。
if( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
// WooCommerce is either activated on this specific site or network-activated
}
放心,这个功能在非多站点网络的环境下也是安全的。
检查插件是否仅在特定站点上处于激活状态
因为WordPress核心里没有这项功能,所以我为你准备了以下自定义代码:
if( in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) ) {
}
你可以检查多站点网络的特定网站,但是不要忘记提供 $blog_id
和 $plugin
变量。
switch_to_blog( $blog_id );
if( in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) ) {
}
restore_current_blog();
检查特定插件(在我们的例子中是 WooCommerce)在哪些网站上处于激活状态:
$sites = get_sites();
foreach( $sites as $site ) {
switch_to_blog( $site->blog_id );
if( in_array( 'woocommerce/woocommerce.php', (array) get_option( 'active_plugins', array() ) ) ) {
echo "WooCommerce is active on {$site->blogname}";
}
restore_current_blog();
总结
简而言之,无论你使用is_plugin_active()
还是is_plugin_active_for_network()
,WordPress都会在这两种情况下检查在站点选项中被激活的插件:
不用担心会过度使用数据库,因为这些选项会自动加载,并且如果你多次使用is_plugin_active()
,它只会从一个全局变量进行检查。
数据库中的选项值实际上是一个序列化的数组,就像下面这样:
暂无评论内容