prefix . 'adminoptim_redirects'). * @param string $new_table_name Fully prefixed new table name (e.g. $wpdb->prefix . 'ao_redirects'). * * @return void */ public static function maybe_rename( string $old_table_name, string $new_table_name ): void { global $wpdb; if ( self::table_exists( $new_table_name ) ) { return; } if ( ! self::table_exists( $old_table_name ) ) { return; } // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Both names are built from $wpdb->prefix plus a hardcoded literal, never user input. $wpdb->query( "RENAME TABLE `{$old_table_name}` TO `{$new_table_name}`" ); } /** * Check whether a table currently exists. * * @param string $table_name Fully prefixed table name. * * @return bool */ private static function table_exists( string $table_name ): bool { global $wpdb; $found = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $table_name ) ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching return $table_name === $found; } }