query( "DROP TABLE IF EXISTS {$wpdb->prefix}{$table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- static table names, no user input. } // Plugin options and transients (transients live in the options table // under _transient_/_transient_timeout_ prefixes when no object cache // persists them; object-cache-backed transients age out on their own). $option_patterns = array( 'metasync\_%', '\_transient\_metasync\_%', '\_transient\_timeout\_metasync\_%', '\_site\_transient\_metasync\_%', '\_site\_transient\_timeout\_metasync\_%', ); foreach ( $option_patterns as $option_pattern ) { $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", $option_pattern ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- table name from core. } // Per-post SEO values saved by the plugin (custom titles, meta // descriptions, robots directives, schema, Open Graph, canonical URLs). // Several metaboxes store their values without the leading underscore // (metasync_common_robots, metasync_schema_markup, metasync_advance_robots, // metasync_post, metasync_post_redirection_meta), so both prefixes are // swept. $wpdb->query( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE '\_metasync\_%' OR meta_key LIKE 'metasync\_%'" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- literal patterns, no user input. // On-disk data directory (error logs, zipped logs, cache artifacts). $metasync_data_dir = WP_CONTENT_DIR . '/metasync_data'; if ( is_dir( $metasync_data_dir ) ) { metasync_uninstall_rrmdir( $metasync_data_dir ); } } /** * Recursively delete a directory. * * @param string $dir Absolute directory path. * @return void */ function metasync_uninstall_rrmdir( $dir ) { if ( ! is_dir( $dir ) ) { return; } foreach ( scandir( $dir ) as $entry ) { if ( '.' === $entry || '..' === $entry ) { continue; } $path = $dir . '/' . $entry; if ( is_dir( $path ) ) { metasync_uninstall_rrmdir( $path ); } else { @unlink( $path ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- best-effort cleanup on uninstall. } } @rmdir( $dir ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- best-effort cleanup on uninstall. } if ( is_multisite() ) { $metasync_uninstall_site_ids = get_sites( array( 'fields' => 'ids', 'number' => 0 ) ); foreach ( $metasync_uninstall_site_ids as $metasync_uninstall_site_id ) { switch_to_blog( $metasync_uninstall_site_id ); metasync_uninstall_cleanup(); } restore_current_blog(); unset( $metasync_uninstall_site_ids, $metasync_uninstall_site_id ); } else { metasync_uninstall_cleanup(); }