query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_transient\_awbseo\_%' OR option_name LIKE '\_transient\_timeout\_awbseo\_%'" ); // ── Custom tables ───────────────────────────────────────────────────────────── $tables = [ $wpdb->prefix . 'awb_redirects', $wpdb->prefix . 'awb_broken_links', $wpdb->prefix . 'awb_rank_history', $wpdb->prefix . 'awb_local_seo', ]; foreach ( $tables as $table ) { $wpdb->query( "DROP TABLE IF EXISTS `{$table}`" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } // ── Post meta ───────────────────────────────────────────────────────────────── $meta_keys = [ '_awb_seo_title', '_awb_seo_description', '_awb_seo_focus_keyword', '_awb_seo_robots_index', '_awb_seo_robots_follow', '_awb_seo_noindex', '_awb_seo_nofollow', '_awb_seo_canonical', '_awb_seo_og_title', '_awb_seo_og_description', '_awb_seo_og_image', '_awb_seo_twitter_title', '_awb_seo_twitter_desc', '_awb_seo_twitter_image', '_awb_seo_schema', '_awb_seo_schema_type', '_awb_seo_schema_data', '_awb_seo_schema_fields', '_awb_seo_ar_quality', '_awb_seo_score', '_awb_seo_issues', '_awb_seo_failed_checks', ]; foreach ( $meta_keys as $key ) { $wpdb->delete( $wpdb->postmeta, [ 'meta_key' => $key ] ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key } // Allow Pro plugin to clean up its own data on uninstall. do_action( 'awbseo_uninstall' );