query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE %s", $wpdb->esc_like('_shadowsync_seo_') . '%' ) ); // Options and the transients that back the sitemap and llms.txt caches. // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $shadowsync_seo_option_names = $wpdb->get_col( $wpdb->prepare( "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s", $wpdb->esc_like('shadowsync_seo_') . '%', $wpdb->esc_like('_transient_shadowsync_seo_') . '%', $wpdb->esc_like('_transient_timeout_shadowsync_seo_') . '%' ) ); foreach ((array) $shadowsync_seo_option_names as $shadowsync_seo_option_name) { delete_option($shadowsync_seo_option_name); } // Scheduled work. foreach (['shadowsync_seo_weekly_llms_regenerate', 'shadowsync_seo_autopilot_run'] as $shadowsync_seo_hook) { $shadowsync_seo_timestamp = wp_next_scheduled($shadowsync_seo_hook); if ($shadowsync_seo_timestamp) { wp_unschedule_event($shadowsync_seo_timestamp, $shadowsync_seo_hook); } wp_clear_scheduled_hook($shadowsync_seo_hook); } // The plugin's own table. $shadowsync_seo_table = $wpdb->prefix . 'shadowsync_seo_platform'; // dbDelta created this table; DROP cannot bind an identifier, and the name is // $wpdb->prefix plus a hardcoded suffix. // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.SchemaChange, PluginCheck.Security.DirectDB.UnescapedDBParameter $wpdb->query("DROP TABLE IF EXISTS {$shadowsync_seo_table}");