wpmu_delete_blog()
云策文档标注
概述
wpmu_delete_blog() 是 WordPress 多站点网络中用于删除站点的函数。它根据参数决定是否完全删除站点数据库表,或仅标记为删除状态,并处理用户移除和钩子触发。
关键要点
- 函数接受两个参数:$blog_id(必需,站点ID)和 $drop(可选,布尔值,决定是否删除数据库表,默认为 false)。
- 删除操作会检查站点是否为主站点或根站点,以及 ms_files_rewriting 设置,以防止误删关键数据。
- 当 $drop 为 true 时,调用 wp_delete_site() 完全删除站点;否则,仅标记站点为删除状态并移除关联用户。
- 函数触发已弃用的钩子 delete_blog 和 deleted_blog,用于在删除前后执行自定义操作。
- 使用 switch_to_blog() 和 restore_current_blog() 确保在正确的站点上下文中操作。
代码示例
$site_id = 2;
if ( ! function_exists( 'wpmu_delete_blog' ) ) {
require_once ABSPATH . '/wp-admin/includes/ms.php';
}
$drop = true;
wpmu_delete_blog( $site_id, $drop );注意事项
- 避免删除主站点(ID 为 1 或通过 is_main_site() 判断)或根站点,否则 $drop 会被强制设为 false。
- 在 ms_files_rewriting 启用且 upload_path 为空时,wp_upload_dir 不可靠,$drop 也会被设为 false。
- 钩子 delete_blog 和 deleted_blog 已弃用,建议使用替代方法。
原文内容
Deletes a site.
Parameters
$blog_idintrequired-
Site ID.
$dropbooloptional-
True if site’s database tables should be dropped.
Default:
false
Source
function wpmu_delete_blog( $blog_id, $drop = false ) {
$blog_id = (int) $blog_id;
$switch = false;
if ( get_current_blog_id() !== $blog_id ) {
$switch = true;
switch_to_blog( $blog_id );
}
$blog = get_site( $blog_id );
$current_network = get_network();
// If a full blog object is not available, do not destroy anything.
if ( $drop && ! $blog ) {
$drop = false;
}
// Don't destroy the initial, main, or root blog.
if ( $drop
&& ( 1 === $blog_id || is_main_site( $blog_id )
|| ( $blog->path === $current_network->path && $blog->domain === $current_network->domain ) )
) {
$drop = false;
}
$upload_path = trim( get_option( 'upload_path' ) );
// If ms_files_rewriting is enabled and upload_path is empty, wp_upload_dir is not reliable.
if ( $drop && get_site_option( 'ms_files_rewriting' ) && empty( $upload_path ) ) {
$drop = false;
}
if ( $drop ) {
wp_delete_site( $blog_id );
} else {
/** This action is documented in wp-includes/ms-blogs.php */
do_action_deprecated( 'delete_blog', array( $blog_id, false ), '5.1.0' );
$users = get_users(
array(
'blog_id' => $blog_id,
'fields' => 'ids',
)
);
// Remove users from this blog.
if ( ! empty( $users ) ) {
foreach ( $users as $user_id ) {
remove_user_from_blog( $user_id, $blog_id );
}
}
update_blog_status( $blog_id, 'deleted', 1 );
/** This action is documented in wp-includes/ms-blogs.php */
do_action_deprecated( 'deleted_blog', array( $blog_id, false ), '5.1.0' );
}
if ( $switch ) {
restore_current_blog();
}
}
Hooks
- do_action_deprecated( ‘deleted_blog’, int $site_id, bool $drop )
-
Fires after the site is deleted from the network.
- do_action_deprecated( ‘delete_blog’, int $site_id, bool $drop )
-
Fires before a site is deleted.
Changelog
| Version | Description |
|---|---|
| 5.1.0 | Use wp_delete_site() internally to delete the site row from the database. |
| 3.0.0 | Introduced. |
Skip to note 2 content
Muhammad Faizan Haidar
/** * Deletes a site from multi site network */ $site_id = 2; if ( ! function_exists( 'wpmu_delete_blog' ) ) { require_once ABSPATH . '/wp-admin/includes/ms.php'; } $drop = true; wpmu_delete_blog( $site_id, $drop ); if ( $drop ) { echo "Site deleted successfully"; } else { $status = get_blog_status( $site_id, 'deleted' ); if ( $status ) { echo "Site deleted successfully"; } }