PluginProbe
Double Opt-In for Contact Form 7 – Secure, GDPR-Compliant Email Verification / 5.6.0
Double Opt-In for Contact Form 7 – Secure, GDPR-Compliant Email Verification v5.6.0
5.6.0 5.5.0 5.4.0 5.3.2 5.3.1 5.1.6 5.1.5 trunk 2.1.5 2.11 2.12 2.13 2.15 3.0.0 3.0.1 3.0.2 3.0.3 3.0.5 3.0.51 3.0.60 3.0.61 3.0.62 3.0.70 3.0.71 3.0.72 All 35 releases
double-opt-in / uninstall.php

uninstall.php in Double Opt-In for Contact Form 7 – Secure, GDPR-Compliant Email Verification 5.6.0, at uninstall.php

114 lines 3.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace forge12\contactform7\CF7DoubleOptIn;
4
5 use Forge12\Shared\Logger;
6
7 if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
8 die;
9 }
10
11 require_once plugin_dir_path( __FILE__ ) . 'logger/logger.php';
12
13 /**
14 * Whether the admin asked to KEEP opt-in data when deleting the plugin.
15 *
16 * Defaults to KEEP: data is dropped ONLY when the
17 * `keep_data_on_uninstall` setting is explicitly 0. A site that never
18 * touched the setting (key absent) keeps its data — deleting the plugin
19 * must never silently destroy GDPR consent records.
20 *
21 * @return bool True if the opt-in tables should be preserved.
22 */
23 function should_keep_data_on_uninstall(): bool {
24 $settings = get_option( 'f12-doi-settings', array() );
25
26 if ( ! is_array( $settings ) || ! array_key_exists( 'keep_data_on_uninstall', $settings ) ) {
27 return true; // key absent → safe default: keep.
28 }
29
30 return (int) $settings['keep_data_on_uninstall'] !== 0;
31 }
32
33 function drop_table_optin() {
34 global $wpdb;
35
36 $logger = Logger::getInstance();
37
38 $tableName = 'f12_cf7_doubleoptin';
39 $wpTableName = $wpdb->prefix . $tableName;
40
41 $logger->info( 'Dropping table if exists', [
42 'plugin' => 'double-opt-in',
43 'table_name' => $wpTableName,
44 'class' => __CLASS__ ?? null,
45 'method' => __FUNCTION__,
46 ] );
47
48 $wpdb->query( "DROP TABLE IF EXISTS " . esc_sql( $wpTableName ) );
49
50 $logger->info( 'Table dropped', [
51 'plugin' => 'double-opt-in',
52 'table_name' => $wpTableName,
53 ] );
54 }
55
56 function drop_table_categories() {
57 global $wpdb;
58
59 $logger = Logger::getInstance();
60
61 $tableName = 'f12_cf7_doubleoptin_categories';
62 $wpTableName = $wpdb->prefix . $tableName;
63
64 $logger->info( 'Dropping table if exists', [
65 'plugin' => 'double-opt-in',
66 'table_name' => $wpTableName,
67 'class' => __CLASS__ ?? null,
68 'method' => __FUNCTION__,
69 ] );
70
71 $wpdb->query( "DROP TABLE IF EXISTS " . esc_sql( $wpTableName ) );
72
73 $logger->info( 'Table dropped', [
74 'plugin' => 'double-opt-in',
75 'table_name' => $wpTableName,
76 ] );
77 }
78
79 function drop_table_followup() {
80 global $wpdb;
81
82 // Follow-up status only references opt-ins; it goes with them.
83 $wpdb->query( "DROP TABLE IF EXISTS " . esc_sql( $wpdb->prefix . 'f12_cf7_doubleoptin_followup' ) );
84 }
85
86 if ( should_keep_data_on_uninstall() ) {
87 Logger::getInstance()->info( 'Uninstall: keeping opt-in data (keep_data_on_uninstall enabled).', [
88 'plugin' => 'double-opt-in',
89 ] );
90 } else {
91 Logger::getInstance()->info( 'Uninstall: deleting opt-in data (keep_data_on_uninstall disabled by admin).', [
92 'plugin' => 'double-opt-in',
93 ] );
94 drop_table_categories();
95 drop_table_followup();
96 drop_table_optin();
97 }
98
99 // Purely operational options with no value after removal. Admin-set config
100 // (f12-doi-settings) is intentionally left in place, and cross-package options
101 // (bundle-pro licence, addon settings) are owned by their own uninstallers.
102 delete_option( 'f12_cf7_doubleoptin_installed_at' );
103 delete_option( 'f12_cf7_doubleoptin_installation_uuid' );
104 delete_option( 'f12_cf7_doubleoptin_telemetry_counters' );
105
106 // The daily telemetry job is no longer scheduled, but an installation that ran
107 // an older version still carries the event. Uninstalling has to take it with
108 // it, otherwise the entry outlives the plugin in the WP-Cron table.
109 wp_clear_scheduled_hook( 'f12_cf7_doubleoptin_daily_telemetry' );
110 wp_clear_scheduled_hook( 'f12_doi_follow_up_sweep' );
111 // Retry events carry the opt-in id as argument; only unschedule_hook
112 // removes them regardless of arguments.
113 wp_unschedule_hook( 'f12_doi_follow_up_retry' );
114