' . __( 'Caution:' ) . ' ' . __( 'This theme may be active on other sites in the network.' ),
array(
'additional_classes' => array( 'error' ),
)
);
?>
' . __( 'Caution:' ) . ' ' . __( 'These themes may be active on other sites in the network.' ),
array(
'additional_classes' => array( 'error' ),
)
);
?>
' . __( 'This screen enables and disables the inclusion of themes available to choose in the Appearance menu for each site. It does not activate or deactivate which theme a site is currently using.' ) . '
' .
'
' . __( 'If the network admin disables a theme that is in use, it can still remain selected on that site. If another theme is chosen, the disabled theme will not appear in the site’s Appearance > Themes screen.' ) . '
' .
'
' . __( 'Themes can be enabled on a site by site basis by the network admin on the Edit Site screen (which has a Themes tab); get there via the Edit action link on the All Sites screen. Only network admins are able to install or edit themes.' ) . '
' . __( 'Auto-updates can be enabled or disabled for each individual theme. Themes with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system.' ) . '
' .
'
' . __( 'Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling.' ) . '
' . __( 'Add User will set up a new user account on the network and send that person an email with username and password.' ) . '
' .
'
' . __( 'Users who are signed up to the network without a site are added as subscribers to the main or primary dashboard site, giving them profile pages to manage their accounts. These users will only see Dashboard and My Sites in the main navigation until a site is created for them.' ) . '
' . __( 'Only use this screen once you have updated to a new version of WordPress through Updates/Available Updates (via the Network Administration navigation menu or the Toolbar). Clicking the Upgrade Network button will step through each site in the network, five at a time, and make sure any database updates are applied.' ) . '
' .
'
' . __( 'If a version update to core has not happened, clicking this button will not affect anything.' ) . '
' .
'
' . __( 'If this process fails for any reason, users logging in to their sites will force the same update.' ) . '
";
$response = wp_remote_get(
$upgrade_url,
array(
'timeout' => 120,
'httpversion' => '1.1',
'sslverify' => false,
)
);
if ( is_wp_error( $response ) ) {
wp_die(
sprintf(
/* translators: 1: Site URL, 2: Server error message. */
__( 'Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: %2$s' ),
$siteurl,
'' . $response->get_error_message() . ''
)
);
}
/**
* Fires after the Multisite DB upgrade for each site is complete.
*
* @since MU (3.0.0)
*
* @param array $response The upgrade response array.
*/
do_action( 'after_mu_upgrade', $response );
/**
* Fires after each site has been upgraded.
*
* @since MU (3.0.0)
*
* @param int $site_id The Site ID.
*/
do_action( 'wpmu_upgrade_site', $site_id );
}
echo '
' . __( 'Add Site takes you to the screen for adding a new site to the network. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page.' ) . '
' .
'
' . __( 'This is the main table of all sites on this network. Switch between list and excerpt views by using the icons above the right side of the table.' ) . '
' .
'
' . __( 'Hovering over each site reveals seven options (three for the primary site):' ) . '
' .
'
' . __( 'An Edit link to a separate Edit Site screen.' ) . '
' .
'
' . __( 'Dashboard leads to the Dashboard for that site.' ) . '
' .
'
' . __( 'Flag for Deletion, Archive, and Spam which lead to confirmation screens. These actions can be reversed later.' ) . '
' .
'
' . __( 'Delete Permanently which is a permanent action after the confirmation screen.' ) . '
' .
'
' . __( 'Visit to go to the front-end of the live site.' ) . '
'
);
get_current_screen()->set_screen_reader_content(
array(
'heading_pagination' => __( 'Sites list navigation' ),
'heading_list' => __( 'Sites list' ),
)
);
$id = isset( $_REQUEST['id'] ) ? (int) $_REQUEST['id'] : 0;
if ( isset( $_GET['action'] ) ) {
/** This action is documented in wp-admin/network/edit.php */
do_action( 'wpmuadminedit' );
// A list of valid actions and their associated messaging for confirmation output.
$manage_actions = array(
/* translators: %s: Site URL. */
'activateblog' => __( 'You are about to remove the deletion flag from the site %s.' ),
/* translators: %s: Site URL. */
'deactivateblog' => __( 'You are about to flag the site %s for deletion.' ),
/* translators: %s: Site URL. */
'unarchiveblog' => __( 'You are about to unarchive the site %s.' ),
/* translators: %s: Site URL. */
'archiveblog' => __( 'You are about to archive the site %s.' ),
/* translators: %s: Site URL. */
'unspamblog' => __( 'You are about to unspam the site %s.' ),
/* translators: %s: Site URL. */
'spamblog' => __( 'You are about to mark the site %s as spam.' ),
/* translators: %s: Site URL. */
'deleteblog' => __( 'You are about to delete the site %s.' ),
/* translators: %s: Site URL. */
'unmatureblog' => __( 'You are about to mark the site %s as mature.' ),
/* translators: %s: Site URL. */
'matureblog' => __( 'You are about to mark the site %s as not mature.' ),
);
if ( 'confirm' === $_GET['action'] ) {
// The action2 parameter contains the action being taken on the site.
$site_action = $_GET['action2'];
if ( ! array_key_exists( $site_action, $manage_actions ) ) {
wp_die( __( 'The requested action is not valid.' ) );
}
// The mature/unmature UI exists only as external code. Check the "confirm" nonce for backward compatibility.
if ( 'matureblog' === $site_action || 'unmatureblog' === $site_action ) {
check_admin_referer( 'confirm' );
} else {
check_admin_referer( $site_action . '_' . $id );
}
if ( ! headers_sent() ) {
nocache_headers();
header( 'Content-Type: text/html; charset=utf-8' );
}
if ( is_main_site( $id ) ) {
wp_die( __( 'Sorry, you are not allowed to change the current site.' ) );
}
$site_details = get_site( $id );
$site_address = untrailingslashit( $site_details->domain . $site_details->path );
$submit = __( 'Confirm' );
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
403 ) );
}
$updated_action = 'not_deleted';
if ( 0 !== $id && ! is_main_site( $id ) && current_user_can( 'delete_site', $id ) ) {
wpmu_delete_blog( $id, true );
$updated_action = 'delete';
}
break;
case 'delete_sites':
check_admin_referer( 'ms-delete-sites' );
foreach ( (array) $_POST['site_ids'] as $site_id ) {
$site_id = (int) $site_id;
if ( is_main_site( $site_id ) ) {
continue;
}
if ( ! current_user_can( 'delete_site', $site_id ) ) {
$site = get_site( $site_id );
$site_address = untrailingslashit( $site->domain . $site->path );
wp_die(
sprintf(
/* translators: %s: Site URL. */
__( 'Sorry, you are not allowed to delete the site %s.' ),
$site_address
),
403
);
}
$updated_action = 'all_delete';
wpmu_delete_blog( $site_id, true );
}
break;
case 'allblogs':
if ( isset( $_POST['action'] ) && isset( $_POST['allblogs'] ) ) {
$doaction = $_POST['action'];
foreach ( (array) $_POST['allblogs'] as $site_id ) {
$site_id = (int) $site_id;
if ( 0 !== $site_id && ! is_main_site( $site_id ) ) {
switch ( $doaction ) {
case 'delete':
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
id, $redirect_to, $doaction, $blogs, $id ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
wp_safe_redirect( $redirect_to );
exit;
}
} else {
// Process query defined by WP_MS_Site_List_Table::extra_table_nav().
$location = remove_query_arg(
array( '_wp_http_referer', '_wpnonce' ),
add_query_arg( $_POST, network_admin_url( 'sites.php' ) )
);
wp_redirect( $location );
exit;
}
break;
case 'archiveblog':
case 'unarchiveblog':
update_blog_status( $id, 'archived', ( 'archiveblog' === $_GET['action'] ) ? '1' : '0' );
break;
case 'activateblog':
update_blog_status( $id, 'deleted', '0' );
/**
* Fires after a network site has its deletion flag removed.
*
* @since MU (3.0.0)
*
* @param int $id The ID of the reactivated site.
*/
do_action( 'activate_blog', $id );
break;
case 'deactivateblog':
/**
* Fires before a network site is flagged for deletion.
*
* @since MU (3.0.0)
*
* @param int $id The ID of the site being flagged for deletion.
*/
do_action( 'deactivate_blog', $id );
update_blog_status( $id, 'deleted', '1' );
break;
case 'unspamblog':
case 'spamblog':
update_blog_status( $id, 'spam', ( 'spamblog' === $_GET['action'] ) ? '1' : '0' );
break;
case 'unmatureblog':
case 'matureblog':
update_blog_status( $id, 'mature', ( 'matureblog' === $_GET['action'] ) ? '1' : '0' );
break;
}
if ( empty( $updated_action ) && array_key_exists( $_GET['action'], $manage_actions ) ) {
$updated_action = $_GET['action'];
}
if ( ! empty( $updated_action ) ) {
wp_safe_redirect( add_query_arg( array( 'updated' => $updated_action ), wp_get_referer() ) );
exit;
}
}
$msg = '';
if ( isset( $_GET['updated'] ) ) {
$action = $_GET['updated'];
switch ( $action ) {
case 'all_notspam':
$msg = __( 'Sites removed from spam.' );
break;
case 'all_spam':
$msg = __( 'Sites marked as spam.' );
break;
case 'all_delete':
$msg = __( 'Sites permanently deleted.' );
break;
case 'delete':
$msg = __( 'Site permanently deleted.' );
break;
case 'not_deleted':
$msg = __( 'Sorry, you are not allowed to delete that site.' );
break;
case 'archiveblog':
$msg = __( 'Site archived.' );
break;
case 'unarchiveblog':
$msg = __( 'Site unarchived.' );
break;
case 'activateblog':
$msg = __( 'Site deletion flag removed.' );
break;
case 'deactivateblog':
$msg = __( 'Site flagged for deletion.' );
break;
case 'unspamblog':
$msg = __( 'Site removed from spam.' );
break;
case 'spamblog':
$msg = __( 'Site marked as spam.' );
break;
default:
/**
* Filters a specific, non-default, site-updated message in the Network admin.
*
* The dynamic portion of the hook name, `$action`, refers to the non-default
* site update action.
*
* @since 3.1.0
*
* @param string $msg The update message. Default 'Settings saved'.
*/
$msg = apply_filters( "network_sites_updated_message_{$action}", __( 'Settings saved.' ) );
break;
}
if ( ! empty( $msg ) ) {
$msg = wp_get_admin_notice(
$msg,
array(
'type' => 'success',
'dismissible' => true,
'id' => 'message',
)
);
}
}
$wp_list_table->prepare_items();
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
PK ! y y plugin-install.phpnu [ ' . __( 'Welcome to your Network Admin. This area of the Administration Screens is used for managing all aspects of your Multisite Network.' ) . '';
$overview .= '
' . __( 'From here you can:' ) . '
';
$overview .= '
' . __( 'Add and manage sites or users' ) . '
';
$overview .= '
' . __( 'Install and activate themes or plugins' ) . '
';
require_once ABSPATH . 'wp-admin/admin-footer.php';
exit;
case 'spam':
$user = get_userdata( $user_id );
if ( is_super_admin( $user->ID ) ) {
wp_die(
sprintf(
/* translators: %s: User login. */
__( 'Warning! User cannot be modified. The user %s is a network administrator.' ),
esc_html( $user->user_login )
),
403
);
}
$userfunction = 'all_spam';
/**
* Filters whether to propagate the blog status when a user is marked as spam.
*
* @since 7.0.0
*
* @param bool $propagate Whether to propagate the blog status. Default false.
* @param int $user_id User ID.
*/
if ( apply_filters( 'propagate_network_user_spam_to_blogs', false, $user_id ) ) {
foreach ( get_blogs_of_user( $user_id, true ) as $details ) {
// Assuming the main site is not a spam.
if ( ! is_main_site( $details->userblog_id ) ) {
update_blog_status( $details->userblog_id, 'spam', '1' );
}
}
}
$user_data = $user->to_array();
$user_data['spam'] = '1';
wp_update_user( $user_data );
break;
case 'notspam':
$user = get_userdata( $user_id );
if ( is_super_admin( $user->ID ) ) {
wp_die(
sprintf(
/* translators: %s: User login. */
__( 'Warning! User cannot be modified. The user %s is a network administrator.' ),
esc_html( $user->user_login )
),
403
);
}
$userfunction = 'all_notspam';
$blogs = get_blogs_of_user( $user_id, true );
/** This filter is documented in wp-admin/network/users.php */
if ( apply_filters( 'propagate_network_user_spam_to_blogs', false, $user_id ) ) {
foreach ( get_blogs_of_user( $user_id, true ) as $details ) {
if ( ! is_main_site( $details->userblog_id ) && get_current_network_id() === $details->site_id ) {
// Assuming main site is never a spam and part of the current network.
update_blog_status( $details->userblog_id, 'spam', '0' );
}
}
}
$user_data = $user->to_array();
$user_data['spam'] = '0';
wp_update_user( $user_data );
break;
}
}
}
if ( ! in_array( $doaction, array( 'delete', 'spam', 'notspam' ), true ) ) {
$sendback = wp_get_referer();
$user_ids = (array) $_POST['allusers'];
/** This action is documented in wp-admin/network/site-themes.php */
$sendback = apply_filters( 'handle_network_bulk_actions-' . get_current_screen()->id, $sendback, $doaction, $user_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
wp_safe_redirect( $sendback );
exit;
}
wp_safe_redirect(
add_query_arg(
array(
'updated' => 'true',
'action' => $userfunction,
),
wp_get_referer()
)
);
} else {
$location = network_admin_url( 'users.php' );
if ( ! empty( $_REQUEST['paged'] ) ) {
$location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location );
}
wp_redirect( $location );
}
exit;
case 'dodelete':
check_admin_referer( 'ms-users-delete' );
if ( ! ( current_user_can( 'manage_network_users' ) && current_user_can( 'delete_users' ) ) ) {
wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}
if ( ! empty( $_POST['blog'] ) && is_array( $_POST['blog'] ) ) {
foreach ( $_POST['blog'] as $id => $users ) {
foreach ( $users as $blogid => $user_id ) {
if ( ! current_user_can( 'delete_user', $id ) ) {
continue;
}
if ( ! empty( $_POST['delete'] ) && 'reassign' === $_POST['delete'][ $blogid ][ $id ] ) {
remove_user_from_blog( $id, $blogid, (int) $user_id );
} else {
remove_user_from_blog( $id, $blogid );
}
}
}
}
$i = 0;
if ( is_array( $_POST['user'] ) && ! empty( $_POST['user'] ) ) {
foreach ( $_POST['user'] as $id ) {
if ( ! current_user_can( 'delete_user', $id ) ) {
continue;
}
wpmu_delete_user( $id );
++$i;
}
}
if ( 1 === $i ) {
$deletefunction = 'delete';
} else {
$deletefunction = 'all_delete';
}
wp_redirect(
add_query_arg(
array(
'updated' => 'true',
'action' => $deletefunction,
),
network_admin_url( 'users.php' )
)
);
exit;
}
}
$wp_list_table = _get_list_table( 'WP_MS_Users_List_Table' );
$pagenum = $wp_list_table->get_pagenum();
$wp_list_table->prepare_items();
$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );
if ( $pagenum > $total_pages && $total_pages > 0 ) {
wp_redirect( add_query_arg( 'paged', $total_pages ) );
exit;
}
// Used in the HTML title tag.
$title = __( 'Users' );
$parent_file = 'users.php';
add_screen_option( 'per_page' );
get_current_screen()->add_help_tab(
array(
'id' => 'overview',
'title' => __( 'Overview' ),
'content' =>
'
' . __( 'This table shows all users across the network and the sites to which they are assigned.' ) . '
' .
'
' . __( 'Hover over any user on the list to make the edit links appear. The Edit link on the left will take you to their Edit User profile page; the Edit link on the right by any site name goes to an Edit Site screen for that site.' ) . '
' .
'
' . __( 'You can also go to the user’s profile page by clicking on the individual username.' ) . '
' .
'
' . __( 'You can sort the table by clicking on any of the table headings and switch between list and excerpt views by using the icons above the users list.' ) . '
' .
'
' . __( 'The bulk action will permanently delete selected users, or mark/unmark those selected as spam. Spam users will have posts removed and will be unable to sign up again with the same email addresses.' ) . '
' .
'
' . __( 'You can make an existing user an additional super admin by going to the Edit User profile page and checking the box to grant that privilege.' ) . '