robotstxt-telemetry/uninstall.php
2026-08-20 14:31:43 +00:00

129 lines
5.4 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, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Table name is internal (%i requires WordPress 6.2); dropping the table on uninstall is the intended, opt-in behavior.
}
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();
}