我有很多的插件,我写了WordPress的,现在我想将它们适应MU。
哪些注意事项/最佳做法/工作流程/功能/陷阱 ,我必须遵循/避免/为了“升级”我的插件还支持多站点设施适应 ?
例如,包括但不限于:
- 排队脚本/寄存器
- Incuding文件(PHP,图像)
- 路径,自定义文件上传
-
$wpdb
- 激活,卸载,停用
- 管理特定页面的处理
在食品, 有时有言论关于多站点单功能的描述,但我没有找到解决这个问题的任何一站页面。
我有很多的插件,我写了WordPress的,现在我想将它们适应MU。
哪些注意事项/最佳做法/工作流程/功能/陷阱 ,我必须遵循/避免/为了“升级”我的插件还支持多站点设施适应 ?
例如,包括但不限于:
$wpdb
在食品, 有时有言论关于多站点单功能的描述,但我没有找到解决这个问题的任何一站页面。
至于入队和包括,事情是正常的。 插件路径和URL是相同的。
我从来没有处理,上传多站点的路径有关的东西,我想一般WP注意到了这一问题。
$wpdb
有一个常用的片断,通过所有的博客迭代:
global $wpdb;
$blogs = $wpdb->get_results("
SELECT blog_id
FROM {$wpdb->blogs}
WHERE site_id = '{$wpdb->siteid}'
AND spam = '0'
AND deleted = '0'
AND archived = '0'
");
$original_blog_id = get_current_blog_id();
foreach ( $blogs as $blog_id )
{
switch_to_blog( $blog_id->blog_id );
// do something in the blog, like:
// update_option()
}
switch_to_blog( $original_blog_id );
您可能会发现其中的例子restore_current_blog()
是用来代替switch_to_blog( $original_blog_id )
但这里的原因switch
更可靠: restore_current_blog()VS switch_to_blog() 。
$blog_id
执行某些功能或钩根据博客ID:
global $blog_id;
if( $blog_id != 3 )
add_image_size( 'category-thumb', 300, 9999 ); //300 pixels wide (and unlimited height)
或者可能:
if(
'child.multisite.com' === $_SERVER['SERVER_NAME']
||
'domain-mapped-child.com' === $_SERVER['SERVER_NAME']
)
{
// do_something();
}
使用插件头Network: true
(见: 示例插件 )将只显示在页面插件/wp-admin/network/plugins.php
。 有了这个标题的地方,我们可以使用下面的封锁意味着发生,如果该插件不仅是网络的某些动作。
function my_plugin_block_something()
{
$plugin = plugin_basename( __FILE__ );
if( !is_network_only_plugin( $plugin ) )
wp_die(
'Sorry, this action is meant for Network only',
'Network only',
array(
'response' => 500,
'back_link' => true
)
);
}
对于(德)激活,这取决于每个插件。 但是,对于卸载,这是我在文件中使用的代码uninstall.php
:
<?php
/**
* Uninstall plugin - Single and Multisite
* Source: https://wordpress.stackexchange.com/q/80350/12615
*/
// Make sure that we are uninstalling
if ( !defined( 'WP_UNINSTALL_PLUGIN' ) )
exit();
// Leave no trail
$option_name = 'HardCodedOptionName';
if ( !is_multisite() )
{
delete_option( $option_name );
}
else
{
global $wpdb;
$blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
$original_blog_id = get_current_blog_id();
foreach ( $blog_ids as $blog_id )
{
switch_to_blog( $blog_id );
delete_option( $option_name );
}
switch_to_blog( $original_blog_id );
}
要增加我们检查的管理菜单is_multisite()
并相应修改了钩:
$hook = is_multisite() ? 'network_' : '';
add_action( "{$hook}admin_menu", 'unique_prefix_function_callback' );
// Check for MS dashboard
if( is_network_admin() )
$url = network_admin_url( 'plugins.php' );
else
$url = admin_url( 'plugins.php' );
而无需创建一个网络管理员菜单(动作钩network_admin_menu
),也可以只在主网站显示插件的某些部分。
我开始包括我的一些多站点功能最大的插件 ,并做了以下限制的插件选项,主站点的一部分。 也就是说,如果该插件在子网站上启用,该选项将不会出现 。
$this->multisite = is_multisite()
? ( is_super_admin() && is_main_site() ) // must meet this 2 conditions to be "our multisite"
: false;
再次,在此来看,也许它可以简单地说: is_multisite() && is_super_admin() && is_main_site()
需要注意的是最后两个返回true
单点。
然后:
if( $this->multisite )
echo "Something only for the main site, i.e.: Super Admin!";
钩 : network_admin_menu
, wpmu_new_blog
, signup_blogform
, wpmu_blogs_columns
, manage_sites_custom_column
, manage_blogs_custom_column
, wp_dashboard_setup
, network_admin_notices
, site_option_active_sitewide_plugins
, {$hook}admin_menu
功能 : is_multisite
, is_super_admin
is_main_site
, get_blogs_of_user
, update_blog_option
, is_network_admin
, network_admin_url
, is_network_only_plugin
PS:我宁愿链接到WordPress的答案,而不是食品,因为会工作代码的更多的例子。
我刚刚推出一个多站点的插件, 网络已停用,但活跃在其他地方 ,并提出了非工作又恢复了注释版本波纹管(见GitHub上对成品完整的工作版本)。 成品插件纯粹是功能性的,没有设置界面。
需要注意的是插件头有Network: true
。 它可以防止外挂程式无法在子站点显示 。
<?php
/**
* Plugin Name: Network Deactivated but Active Elsewhere
* Network: true
*/
/**
* Start the plugin only if in Admin side and if site is Multisite
*/
if( is_admin() && is_multisite() )
{
add_action(
'plugins_loaded',
array ( B5F_Blog_Active_Plugins_Multisite::get_instance(), 'plugin_setup' )
);
}
/**
* Based on Plugin Class Demo - https://gist.github.com/toscho/3804204
*/
class B5F_Blog_Active_Plugins_Multisite
{
protected static $instance = NULL;
public $blogs = array();
public $plugin_url = '';
public $plugin_path = '';
public static function get_instance()
{
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
/**
* Plugin URL and Path work as normal
*/
public function plugin_setup()
{
$this->plugin_url = plugins_url( '/', __FILE__ );
$this->plugin_path = plugin_dir_path( __FILE__ );
add_action(
'load-plugins.php',
array( $this, 'load_blogs' )
);
}
public function __construct() {}
public function load_blogs()
{
/**
* Using "is_network" property from $current_screen global variable.
* Run only in /wp-admin/network/plugins.php
*/
global $current_screen;
if( !$current_screen->is_network )
return;
/**
* A couple of Multisite-only filter hooks and a regular one.
*/
add_action(
'network_admin_plugin_action_links',
array( $this, 'list_plugins' ),
10, 4
);
add_filter(
'views_plugins-network', // 'views_{$current_screen->id}'
array( $this, 'inactive_views' ),
10, 1
);
add_action(
'admin_print_scripts',
array( $this, 'enqueue')
);
/**
* This query is quite frequent to retrieve all blog IDs.
*/
global $wpdb;
$this->blogs = $wpdb->get_results(
" SELECT blog_id, domain
FROM {$wpdb->blogs}
WHERE site_id = '{$wpdb->siteid}'
AND spam = '0'
AND deleted = '0'
AND archived = '0' "
);
}
/**
* Enqueue script and style normally.
*/
public function enqueue()
{
wp_enqueue_script(
'ndbae-js',
$this->plugin_url . '/ndbae.js',
array(),
false,
true
);
wp_enqueue_style(
'ndbae-css',
$this->plugin_url . '/ndbae.css'
);
}
/**
* Check if plugin is active in any blog
* Using Multisite function get_blog_option
*/
private function get_network_plugins_active( $plug )
{
$active_in_blogs = array();
foreach( $this->blogs as $blog )
{
$the_plugs = get_blog_option( $blog['blog_id'], 'active_plugins' );
foreach( $the_plugs as $value )
{
if( $value == $plug )
$active_in_blogs[] = $blog['domain'];
}
}
return $active_in_blogs;
}
}
不直接相关的插件开发,而是一种必要的多站点管理。
米卡爱泼斯坦(又名Ipstenu)和Andrea Rennick先生:电子书是由不低于两巨头多站点的编写。