129 lines
5.3 KiB
PHP
129 lines
5.3 KiB
PHP
<?php
|
|
/**
|
|
* Uninstall handler.
|
|
*
|
|
* By default all telemetry data is preserved. When the user opts in via the
|
|
* "Delete all telemetry logs on uninstall" setting, the logs table and plugin
|
|
* options are removed.
|
|
*
|
|
* On Multisite in global mode the delete-data setting is a network option and
|
|
* the uninstall routine covers every site plus the shared network options.
|
|
*
|
|
* @package RobotstxtTelemetry
|
|
*/
|
|
|
|
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
|
|
exit;
|
|
}
|
|
|
|
$robotstxt_telemetry_is_global = is_multisite() && 'global' === get_site_option( 'robotstxt_telemetry_config_mode', 'per-site' );
|
|
$robotstxt_telemetry_delete_data = $robotstxt_telemetry_is_global
|
|
? (bool) get_site_option( 'robotstxt_telemetry_delete_on_uninstall', false )
|
|
: (bool) get_option( 'robotstxt_telemetry_delete_on_uninstall', false );
|
|
|
|
// Clear the scheduled cleanup event on every site.
|
|
wp_clear_scheduled_hook( 'robotstxt_telemetry_cleanup' );
|
|
|
|
if ( is_multisite() ) {
|
|
if ( function_exists( 'get_sites' ) ) {
|
|
$robotstxt_telemetry_uninstall_sites = get_sites(
|
|
array(
|
|
'fields' => 'ids',
|
|
'number' => 0,
|
|
'update_site_cache' => false,
|
|
'update_archived_cache' => false,
|
|
)
|
|
);
|
|
} else {
|
|
// WordPress 3.7 - 4.5 fallback.
|
|
$robotstxt_telemetry_uninstall_sites = array();
|
|
|
|
// phpcs:ignore WordPress.WP.DeprecatedFunctions.wp_get_sitesFound -- Only called when get_sites() is unavailable (WordPress 3.7 - 4.5).
|
|
foreach ( (array) wp_get_sites( array( 'limit' => 100000 ) ) as $robotstxt_telemetry_uninstall_site ) {
|
|
if ( ! empty( $robotstxt_telemetry_uninstall_site['blog_id'] ) ) {
|
|
$robotstxt_telemetry_uninstall_sites[] = (int) $robotstxt_telemetry_uninstall_site['blog_id'];
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach ( $robotstxt_telemetry_uninstall_sites as $robotstxt_telemetry_uninstall_id ) {
|
|
switch_to_blog( $robotstxt_telemetry_uninstall_id );
|
|
wp_clear_scheduled_hook( 'robotstxt_telemetry_cleanup' );
|
|
restore_current_blog();
|
|
}
|
|
}
|
|
|
|
// Remove per-user manager notice dismissals (user meta is global).
|
|
delete_metadata( 'user', 0, 'robotstxt_telemetry_manager_notice_dismissed', '', true );
|
|
|
|
/**
|
|
* Delete the plugin options (and the logs table when requested) for a site.
|
|
*
|
|
* @param bool|null $force_drop Whether to drop the table, or null to use the
|
|
* site's own delete-data option.
|
|
* @return void
|
|
*/
|
|
function robotstxt_telemetry_uninstall_site( $force_drop = null ) {
|
|
global $wpdb;
|
|
|
|
$drop = null === $force_drop ? (bool) get_option( 'robotstxt_telemetry_delete_on_uninstall', false ) : $force_drop;
|
|
|
|
if ( $drop ) {
|
|
$table_name = $wpdb->prefix . 'robotstxt_telemetry_logs';
|
|
$wpdb->query( "DROP TABLE IF EXISTS {$table_name}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Table name is internal; the %i placeholder requires WordPress 6.2. // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.DirectDatabaseQuery.NoCaching
|
|
}
|
|
|
|
delete_option( 'robotstxt_telemetry_delete_on_uninstall' );
|
|
delete_option( 'robotstxt_telemetry_hash_useragent_url' );
|
|
delete_option( 'robotstxt_telemetry_useragent_url' );
|
|
delete_option( 'robotstxt_telemetry_wp_version' );
|
|
delete_option( 'robotstxt_telemetry_mask_locale' );
|
|
delete_option( 'robotstxt_telemetry_replace_news_feed' );
|
|
delete_option( 'robotstxt_telemetry_replace_events_api' );
|
|
delete_option( 'robotstxt_telemetry_disable_browse_happy' );
|
|
delete_option( 'robotstxt_telemetry_wp_core_check' );
|
|
delete_option( 'robotstxt_telemetry_wp_themes_check' );
|
|
delete_option( 'robotstxt_telemetry_wp_plugins_check' );
|
|
delete_option( 'robotstxt_telemetry_hidden_plugins' );
|
|
delete_option( 'robotstxt_telemetry_plugin_modes' );
|
|
delete_option( 'robotstxt_telemetry_retention_period' );
|
|
delete_option( 'robotstxt_telemetry_db_version' );
|
|
}
|
|
|
|
/**
|
|
* Delete the shared network options (Multisite in global mode).
|
|
*
|
|
* @return void
|
|
*/
|
|
function robotstxt_telemetry_uninstall_network() {
|
|
delete_site_option( 'robotstxt_telemetry_config_mode' );
|
|
delete_site_option( 'robotstxt_telemetry_delete_on_uninstall' );
|
|
delete_site_option( 'robotstxt_telemetry_hash_useragent_url' );
|
|
delete_site_option( 'robotstxt_telemetry_useragent_url' );
|
|
delete_site_option( 'robotstxt_telemetry_wp_version' );
|
|
delete_site_option( 'robotstxt_telemetry_mask_locale' );
|
|
delete_site_option( 'robotstxt_telemetry_replace_news_feed' );
|
|
delete_site_option( 'robotstxt_telemetry_replace_events_api' );
|
|
delete_site_option( 'robotstxt_telemetry_disable_browse_happy' );
|
|
delete_site_option( 'robotstxt_telemetry_wp_core_check' );
|
|
delete_site_option( 'robotstxt_telemetry_wp_themes_check' );
|
|
delete_site_option( 'robotstxt_telemetry_wp_plugins_check' );
|
|
delete_site_option( 'robotstxt_telemetry_hidden_plugins' );
|
|
delete_site_option( 'robotstxt_telemetry_plugin_modes' );
|
|
delete_site_option( 'robotstxt_telemetry_retention_period' );
|
|
}
|
|
|
|
if ( is_multisite() ) {
|
|
// In global mode the network-wide flag decides; per-site, each site's own option does.
|
|
$robotstxt_telemetry_drop_flag = $robotstxt_telemetry_is_global ? $robotstxt_telemetry_delete_data : null;
|
|
|
|
foreach ( $robotstxt_telemetry_uninstall_sites as $robotstxt_telemetry_uninstall_id ) {
|
|
switch_to_blog( $robotstxt_telemetry_uninstall_id );
|
|
robotstxt_telemetry_uninstall_site( $robotstxt_telemetry_drop_flag );
|
|
restore_current_blog();
|
|
}
|
|
|
|
robotstxt_telemetry_uninstall_network();
|
|
} else {
|
|
robotstxt_telemetry_uninstall_site();
|
|
}
|