/** * Regenerate Thumbnails: Attachment regenerator class * * @package RegenerateThumbnails * @since 3.0.0 */ /** * Regenerates the thumbnails for a given attachment. * * @since 3.0.0 */ class RegenerateThumbnails_Regenerator { /** * The WP_Post object for the attachment that is being operated on. * * @since 3.0.0 * * @var WP_Post */ public $attachment; /** * The full path to the original image so that it can be passed between methods. * * @since 3.0.0 * * @var string */ public $fullsizepath; /** * An array of thumbnail size(s) that were skipped during regeneration due to already existing. * A class variable is used so that the data can later be used to merge the size(s) back in. * * @since 3.0.0 * * @var array */ public $skipped_thumbnails = array(); /** * Generates an instance of this class after doing some setup. * * MIME type is purposefully not validated in order to be more future proof and * to avoid duplicating a ton of logic that already exists in WordPress core. * * @since 3.0.0 * * @param int $attachment_id Attachment ID to process. * * @return RegenerateThumbnails_Regenerator|WP_Error A new instance of RegenerateThumbnails_Regenerator on success, or WP_Error on error. */ public static function get_instance( $attachment_id ) { $attachment = get_post( $attachment_id ); if ( ! $attachment ) { return new WP_Error( 'regenerate_thumbnails_regenerator_attachment_doesnt_exist', __( 'No attachment exists with that ID.', 'regenerate-thumbnails' ), array( 'status' => 404, ) ); } // We can only regenerate thumbnails for attachments. if ( 'attachment' !== get_post_type( $attachment ) ) { return new WP_Error( 'regenerate_thumbnails_regenerator_not_attachment', __( 'This item is not an attachment.', 'regenerate-thumbnails' ), array( 'status' => 400, ) ); } // Don't touch any attachments that are being used as a site icon. Their thumbnails are usually custom cropped. if ( self::is_site_icon( $attachment ) ) { return new WP_Error( 'regenerate_thumbnails_regenerator_is_site_icon', __( "This attachment is a site icon and therefore the thumbnails shouldn't be touched.", 'regenerate-thumbnails' ), array( 'status' => 415, 'attachment' => $attachment, ) ); } return new RegenerateThumbnails_Regenerator( $attachment ); } /** * The constructor for this class. Don't call this directly, see get_instance() instead. * This is done so that WP_Error objects can be returned during class initiation. * * @since 3.0.0 * * @param WP_Post $attachment The WP_Post object for the attachment that is being operated on. */ private function __construct( WP_Post $attachment ) { $this->attachment = $attachment; } /** * Returns whether the attachment is or was a site icon. * * @since 3.0.0 * * @param WP_Post $attachment The WP_Post object for the attachment that is being operated on. * * @return bool Whether the attachment is or was a site icon. */ public static function is_site_icon( WP_Post $attachment ) { return ( 'site-icon' === get_post_meta( $attachment->ID, '_wp_attachment_context', true ) ); } /** * Get the path to the fullsize attachment. * * @return string|WP_Error The path to the fullsize attachment, or a WP_Error object on error. */ public function get_fullsizepath() { if ( $this->fullsizepath ) { return $this->fullsizepath; } if ( function_exists( 'wp_get_original_image_path' ) ) { $this->fullsizepath = wp_get_original_image_path( $this->attachment->ID ); } else { $this->fullsizepath = get_attached_file( $this->attachment->ID ); } if ( false === $this->fullsizepath || ! file_exists( $this->fullsizepath ) ) { $error = new WP_Error( 'regenerate_thumbnails_regenerator_file_not_found', sprintf( /* translators: The relative upload path to the attachment. */ __( "The fullsize image file cannot be found in your uploads directory at %s. Without it, new thumbnail images can't be generated.", 'regenerate-thumbnails' ), _wp_relative_upload_path( $this->fullsizepath ) ), array( 'status' => 404, 'fullsizepath' => _wp_relative_upload_path( $this->fullsizepath ), 'attachment' => $this->attachment, ) ); $this->fullsizepath = $error; } return $this->fullsizepath; } /** * Regenerate the thumbnails for this instance's attachment. * * @since 3.0.0 * * @param array|string $args { * Optional. Array or string of arguments for thumbnail regeneration. * * @type bool $only_regenerate_missing_thumbnails Skip regenerating existing thumbnail files. Default true. * @type bool $delete_unregistered_thumbnail_files Delete any thumbnail sizes that are no longer registered. Default false. * } * * @return mixed|WP_Error Metadata for attachment (see wp_generate_attachment_metadata()), or WP_Error on error. */ public function regenerate( $args = array() ) { global $wpdb; $args = wp_parse_args( $args, array( 'only_regenerate_missing_thumbnails' => true, 'delete_unregistered_thumbnail_files' => false, ) ); $fullsizepath = $this->get_fullsizepath(); if ( is_wp_error( $fullsizepath ) ) { $fullsizepath->add_data( array( 'attachment' => $this->attachment ) ); return $fullsizepath; } $old_metadata = wp_get_attachment_metadata( $this->attachment->ID ); if ( $args['only_regenerate_missing_thumbnails'] ) { add_filter( 'intermediate_image_sizes_advanced', array( $this, 'filter_image_sizes_to_only_missing_thumbnails' ), 10, 2 ); } require_once( ABSPATH . 'wp-admin/includes/admin.php' ); $new_metadata = wp_generate_attachment_metadata( $this->attachment->ID, $fullsizepath ); if ( $args['only_regenerate_missing_thumbnails'] ) { // Thumbnail sizes that existed were removed and need to be added back to the metadata. foreach ( $this->skipped_thumbnails as $skipped_thumbnail ) { if ( ! empty( $old_metadata['sizes'][ $skipped_thumbnail ] ) ) { $new_metadata['sizes'][ $skipped_thumbnail ] = $old_metadata['sizes'][ $skipped_thumbnail ]; } } $this->skipped_thumbnails = array(); remove_filter( 'intermediate_image_sizes_advanced', array( $this, 'filter_image_sizes_to_only_missing_thumbnails' ), 10 ); } $wp_upload_dir = dirname( $fullsizepath ) . DIRECTORY_SEPARATOR; if ( $args['delete_unregistered_thumbnail_files'] ) { // Delete old sizes that are still in the metadata. $intermediate_image_sizes = get_intermediate_image_sizes(); foreach ( $old_metadata['sizes'] as $old_size => $old_size_data ) { if ( in_array( $old_size, $intermediate_image_sizes ) ) { continue; } wp_delete_file( $wp_upload_dir . $old_size_data['file'] ); unset( $new_metadata['sizes'][ $old_size ] ); } $relative_path = dirname( $new_metadata['file'] ) . DIRECTORY_SEPARATOR; // It's possible to upload an image with a filename like image-123x456.jpg and it shouldn't be deleted. $whitelist = $wpdb->get_col( $wpdb->prepare( " SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_wp_attached_file' AND meta_value REGEXP %s /* Regenerate Thumbnails */ ", '^' . preg_quote( $relative_path ) . '[^' . preg_quote( DIRECTORY_SEPARATOR ) . ']+-[0-9]+x[0-9]+\.' ) ); $whitelist = array_map( 'basename', $whitelist ); $filelist = array(); foreach ( scandir( $wp_upload_dir ) as $file ) { if ( '.' == $file || '..' == $file || ! is_file( $wp_upload_dir . $file ) ) { continue; } $filelist[] = $file; } $registered_thumbnails = array(); foreach ( $new_metadata['sizes'] as $size ) { $registered_thumbnails[] = $size['file']; } $fullsize_parts = pathinfo( $fullsizepath ); foreach ( $filelist as $file ) { if ( in_array( $file, $whitelist ) || in_array( $file, $registered_thumbnails ) ) { continue; } if ( ! preg_match( '#^' . preg_quote( $fullsize_parts['filename'], '#' ) . '-[0-9]+x[0-9]+\.' . preg_quote( $fullsize_parts['extension'], '#' ) . '$#', $file ) ) { continue; } wp_delete_file( $wp_upload_dir . $file ); } } elseif ( ! empty( $old_metadata ) && ! empty( $old_metadata['sizes'] ) && is_array( $old_metadata['sizes'] ) ) { // If not deleting, rename any size conflicts to avoid them being lost if the file still exists. foreach ( $old_metadata['sizes'] as $old_size => $old_size_data ) { if ( empty( $new_metadata['sizes'][ $old_size ] ) ) { $new_metadata['sizes'][ $old_size ] = $old_metadata['sizes'][ $old_size ]; continue; } $new_size_data = $new_metadata['sizes'][ $old_size ]; if ( $new_size_data['width'] !== $old_size_data['width'] && $new_size_data['height'] !== $old_size_data['height'] && file_exists( $wp_upload_dir . $old_size_data['file'] ) ) { $new_metadata['sizes'][ $old_size . '_old_' . $old_size_data['width'] . 'x' . $old_size_data['height'] ] = $old_size_data; } } } wp_update_attachment_metadata( $this->attachment->ID, $new_metadata ); return $new_metadata; } /** * Filters the list of thumbnail sizes to only include those which have missing files. * * @since 3.0.0 * * @param array $sizes An associative array of registered thumbnail image sizes. * @param array $fullsize_metadata An associative array of fullsize image metadata: width, height, file. * * @return array An associative array of image sizes. */ public function filter_image_sizes_to_only_missing_thumbnails( $sizes, $fullsize_metadata ) { if ( ! $sizes ) { return $sizes; } $fullsizepath = $this->get_fullsizepath(); if ( is_wp_error( $fullsizepath ) ) { return $sizes; } $editor = wp_get_image_editor( $fullsizepath ); if ( is_wp_error( $editor ) ) { return $sizes; } $metadata = wp_get_attachment_metadata( $this->attachment->ID ); // This is based on WP_Image_Editor_GD::multi_resize() and others. foreach ( $sizes as $size => $size_data ) { if ( empty( $metadata['sizes'][ $size ] ) ) { continue; } if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) { continue; } if ( ! isset( $size_data['width'] ) ) { $size_data['width'] = null; } if ( ! isset( $size_data['height'] ) ) { $size_data['height'] = null; } if ( ! isset( $size_data['crop'] ) ) { $size_data['crop'] = false; } $thumbnail = $this->get_thumbnail( $editor, $fullsize_metadata['width'], $fullsize_metadata['height'], $size_data['width'], $size_data['height'], $size_data['crop'] ); // The false check filters out thumbnails that would be larger than the fullsize image. // The size comparison makes sure that the size is also correct. if ( false === $thumbnail || ( $thumbnail['width'] === $metadata['sizes'][ $size ]['width'] && $thumbnail['height'] === $metadata['sizes'][ $size ]['height'] && file_exists( $thumbnail['filename'] ) ) ) { $this->skipped_thumbnails[] = $size; unset( $sizes[ $size ] ); } } /** * Filters the list of missing thumbnail sizes if you want to add/remove any. * * @since 3.1.0 * * @param array $sizes An associative array of image sizes that are missing. * @param array $fullsize_metadata An associative array of fullsize image metadata: width, height, file. * @param object $this The current instance of this class. * * @return array An associative array of image sizes. */ return apply_filters( 'regenerate_thumbnails_missing_thumbnails', $sizes, $fullsize_metadata, $this ); } /** * Generate the thumbnail filename and dimensions for a given set of constraint dimensions. * * @since 3.0.0 * * @param WP_Image_Editor|WP_Error $editor An instance of WP_Image_Editor, as returned by wp_get_image_editor(). * @param int $fullsize_width The width of the fullsize image. * @param int $fullsize_height The height of the fullsize image. * @param int $thumbnail_width The width of the thumbnail. * @param int $thumbnail_height The height of the thumbnail. * @param bool $crop Whether to crop or not. * * @return array|false An array of the filename, thumbnail width, and thumbnail height, * or false on failure to resize such as the thumbnail being larger than the fullsize image. */ public function get_thumbnail( $editor, $fullsize_width, $fullsize_height, $thumbnail_width, $thumbnail_height, $crop ) { $dims = image_resize_dimensions( $fullsize_width, $fullsize_height, $thumbnail_width, $thumbnail_height, $crop ); if ( ! $dims ) { return false; } list( , , , , $dst_w, $dst_h ) = $dims; $suffix = "{$dst_w}x{$dst_h}"; $file_ext = strtolower( pathinfo( $this->get_fullsizepath(), PATHINFO_EXTENSION ) ); return array( 'filename' => $editor->generate_filename( $suffix, null, $file_ext ), 'width' => $dst_w, 'height' => $dst_h, ); } /** * Update the post content of any public post types (posts and pages by default) * that make use of this attachment. * * @since 3.0.0 * * @param array|string $args { * Optional. Array or string of arguments for controlling the updating. * * @type array $post_type The post types to update. Defaults to public post types (posts and pages by default). * @type array $post_ids Specific post IDs to update as opposed to any that uses the attachment. * @type int $posts_per_loop How many posts to query at a time to keep memory usage down. You shouldn't need to modify this. * } * * @return array|WP_Error List of post IDs that were modified. The key is the post ID and the value is either the post ID again or a WP_Error object if wp_update_post() failed. */ public function update_usages_in_posts( $args = array() ) { // Temporarily disabled until it can be even better tested for edge cases return array(); $args = wp_parse_args( $args, array( 'post_type' => array(), 'post_ids' => array(), 'posts_per_loop' => 10, ) ); if ( empty( $args['post_type'] ) ) { $args['post_type'] = array_values( get_post_types( array( 'public' => true ) ) ); unset( $args['post_type']['attachment'] ); } $offset = 0; $posts_updated = array(); while ( true ) { $posts = get_posts( array( 'numberposts' => $args['posts_per_loop'], 'offset' => $offset, 'orderby' => 'ID', 'order' => 'ASC', 'include' => $args['post_ids'], 'post_type' => $args['post_type'], 's' => 'wp-image-' . $this->attachment->ID, // For faster queries. 'update_post_meta_cache' => false, 'update_post_term_cache' => false, ) ); if ( ! $posts ) { break; } $offset += $args['posts_per_loop']; foreach ( $posts as $post ) { $content = $post->post_content; $search = array(); $replace = array(); // Find all tags for this attachment and update them. preg_match_all( '#]+wp-image-' . $this->attachment->ID . '[^>]+/>#i', $content, $matches, PREG_SET_ORDER ); if ( $matches ) { foreach ( $matches as $img_tag ) { preg_match( '# class="([^"]+)?size-([^" ]+)#i', $img_tag[0], $thumbnail_size ); if ( $thumbnail_size ) { $thumbnail = image_downsize( $this->attachment->ID, $thumbnail_size[2] ); if ( ! $thumbnail ) { continue; } $search[] = $img_tag[0]; $img_tag[0] = preg_replace( '# src="[^"]+"#i', ' src="' . esc_url( $thumbnail[0] ) . '"', $img_tag[0] ); $img_tag[0] = preg_replace( '# width="[^"]+" height="[^"]+"#i', ' width="' . esc_attr( $thumbnail[1] ) . '" height="' . esc_attr( $thumbnail[2] ) . '"', $img_tag[0] ); $replace[] = $img_tag[0]; } } } $content = str_replace( $search, $replace, $content ); $search = array(); $replace = array(); // Update the width in any [caption] shortcodes. preg_match_all( '#\[caption id="attachment_' . $this->attachment->ID . '"([^\]]+)? width="[^"]+"\]([^\[]+)size-([^" ]+)([^\[]+)\[\/caption\]#i', $content, $matches, PREG_SET_ORDER ); if ( $matches ) { foreach ( $matches as $match ) { $thumbnail = image_downsize( $this->attachment->ID, $match[3] ); if ( ! $thumbnail ) { continue; } $search[] = $match[0]; $replace[] = '[caption id="attachment_' . $this->attachment->ID . '"' . $match[1] . ' width="' . esc_attr( $thumbnail[1] ) . '"]' . $match[2] . 'size-' . $match[3] . $match[4] . '[/caption]'; } } $content = str_replace( $search, $replace, $content ); $updated_post_object = (object) array( 'ID' => $post->ID, 'post_content' => $content, ); $posts_updated[ $post->ID ] = wp_update_post( $updated_post_object, true ); } } return $posts_updated; } /** * Returns information about the current attachment for use in the REST API. * * @since 3.0.0 * * @return array|WP_Error The attachment name, fullsize URL, registered thumbnail size status, and any unregistered sizes, or WP_Error on error. */ public function get_attachment_info() { $fullsizepath = $this->get_fullsizepath(); if ( is_wp_error( $fullsizepath ) ) { $fullsizepath->add_data( array( 'attachment' => $this->attachment ) ); return $fullsizepath; } $editor = wp_get_image_editor( $fullsizepath ); if ( is_wp_error( $editor ) ) { // Display a more helpful error message. if ( 'image_no_editor' === $editor->get_error_code() ) { $editor = new WP_Error( 'image_no_editor', __( 'The current image editor cannot process this file type.', 'regenerate-thumbnails' ) ); } $editor->add_data( array( 'attachment' => $this->attachment, 'status' => 415, ) ); return $editor; } $metadata = wp_get_attachment_metadata( $this->attachment->ID ); if ( false === $metadata || ! is_array( $metadata ) ) { return new WP_Error( 'regenerate_thumbnails_regenerator_no_metadata', __( 'Unable to load the metadata for this attachment.', 'regenerate-thumbnails' ), array( 'status' => 404, 'attachment' => $this->attachment, ) ); } if ( ! isset( $metadata['sizes'] ) ) { $metadata['sizes'] = array(); } // PDFs don't have width/height set. $width = ( isset( $metadata['width'] ) ) ? $metadata['width'] : null; $height = ( isset( $metadata['height'] ) ) ? $metadata['height'] : null; require_once( ABSPATH . '/wp-admin/includes/image.php' ); $preview = false; if ( file_is_displayable_image( $fullsizepath ) ) { $preview = wp_get_attachment_url( $this->attachment->ID ); } elseif ( is_array( $metadata['sizes'] ) && is_array( $metadata['sizes']['full'] ) && ! empty( $metadata['sizes']['full']['file'] ) ) { $preview = str_replace( wp_basename( $fullsizepath ), $metadata['sizes']['full']['file'], wp_get_attachment_url( $this->attachment->ID ) ); if ( ! file_exists( $preview ) ) { $preview = false; } } $response = array( 'name' => ( $this->attachment->post_title ) ? $this->attachment->post_title : sprintf( __( 'Attachment %d', 'regenerate-thumbnails' ), $this->attachment->ID ), 'preview' => $preview, 'relative_path' => _wp_get_attachment_relative_path( $fullsizepath ) . DIRECTORY_SEPARATOR . wp_basename( $fullsizepath ), 'edit_url' => get_edit_post_link( $this->attachment->ID, 'raw' ), 'width' => $width, 'height' => $height, 'registered_sizes' => array(), 'unregistered_sizes' => array(), ); $wp_upload_dir = dirname( $fullsizepath ) . DIRECTORY_SEPARATOR; $registered_sizes = RegenerateThumbnails()->get_thumbnail_sizes(); if ( 'application/pdf' === get_post_mime_type( $this->attachment ) ) { $registered_sizes = array_intersect_key( $registered_sizes, array( 'thumbnail' => true, 'medium' => true, 'large' => true, ) ); } // Check the status of all currently registered sizes. foreach ( $registered_sizes as $size ) { // Width and height are needed to generate the thumbnail filename. if ( $width && $height ) { $thumbnail = $this->get_thumbnail( $editor, $width, $height, $size['width'], $size['height'], $size['crop'] ); if ( $thumbnail ) { $size['filename'] = wp_basename( $thumbnail['filename'] ); $size['fileexists'] = file_exists( $thumbnail['filename'] ); } else { $size['filename'] = false; $size['fileexists'] = false; } } elseif ( ! empty( $metadata['sizes'][ $size['label'] ]['file'] ) ) { $size['filename'] = wp_basename( $metadata['sizes'][ $size['label'] ]['file'] ); $size['fileexists'] = file_exists( $wp_upload_dir . $metadata['sizes'][ $size['label'] ]['file'] ); } else { $size['filename'] = false; $size['fileexists'] = false; } $response['registered_sizes'][] = $size; } if ( ! $width && ! $height && is_array( $metadata['sizes']['full'] ) ) { $response['registered_sizes'][] = array( 'label' => 'full', 'width' => $metadata['sizes']['full']['width'], 'height' => $metadata['sizes']['full']['height'], 'filename' => $metadata['sizes']['full']['file'], 'fileexists' => file_exists( $wp_upload_dir . $metadata['sizes']['full']['file'] ), ); } // Look at the attachment metadata and see if we have any extra files from sizes that are no longer registered. foreach ( $metadata['sizes'] as $label => $size ) { if ( ! file_exists( $wp_upload_dir . $size['file'] ) ) { continue; } // An unregistered size could match a registered size's dimensions. Ignore these. foreach ( $response['registered_sizes'] as $registered_size ) { if ( $size['file'] === $registered_size['filename'] ) { continue 2; } } if ( ! empty( $registered_sizes[ $label ] ) ) { /* translators: Used for listing old sizes of currently registered thumbnails */ $label = sprintf( __( '%s (old)', 'regenerate-thumbnails' ), $label ); } $response['unregistered_sizes'][] = array( 'label' => $label, 'width' => $size['width'], 'height' => $size['height'], 'filename' => $size['file'], 'fileexists' => true, ); } return $response; } } https://solvair.co.uk/news/ 2026-07-27T10:38:37+00:00 https://solvair.co.uk/2013-exhibition-list/ 2017-07-21T08:58:06+00:00 https://solvair.co.uk/wp-content/uploads/2013-exhibitions.png https://solvair.co.uk/air-knife-systems-at-a-glance/ 2017-07-21T09:00:11+00:00 https://solvair.co.uk/wp-content/uploads/system-overview.jpg https://solvair.co.uk/brau-beviale-2011/ 2017-07-21T09:02:33+00:00 https://solvair.co.uk/wp-content/uploads/news_BRAU_11_525x67_engl_stat.gif https://solvair.co.uk/brau-beviale-2015/ 2017-07-21T09:03:13+00:00 https://solvair.co.uk/wp-content/uploads/BB15_Logo_UnterzeileohneDatum_rgb_72dpi.jpg https://solvair.co.uk/custom-air-knife-drying-systems/ 2017-07-21T09:04:52+00:00 https://solvair.co.uk/wp-content/uploads/news_article_AT1200-AirBlower.jpg https://solvair.co.uk/drinktec-2017-beverage-liquid-food-exhibition/ 2017-07-21T09:22:28+00:00 https://solvair.co.uk/wp-content/uploads/drinktec2017.jpg https://solvair.co.uk/european-expansion-in-denmark/ 2017-07-21T09:24:15+00:00 https://solvair.co.uk/wp-content/uploads/lina-2013.png https://solvair.co.uk/new-website-launch/ 2017-07-21T09:25:12+00:00 https://solvair.co.uk/wp-content/uploads/news-new-website.jpg https://solvair.co.uk/ppma-show-2012-nec-birmingham-uk/ 2017-07-21T09:25:48+00:00 https://solvair.co.uk/wp-content/uploads/ppma-advert.png https://solvair.co.uk/re-designed-sv10-air-nozzles-bring-improvements/ 2017-07-21T09:27:01+00:00 https://solvair.co.uk/wp-content/uploads/SV10-Air-Nozzle.jpg https://solvair.co.uk/solvair-at-key-beverage-industry-event-march-2016/ 2017-07-21T09:30:40+00:00 https://solvair.co.uk/wp-content/uploads/bfbi-logo1.jpg https://solvair.co.uk/successful-air-knife-drying-system-installation-video/ 2017-07-21T09:35:29+00:00 https://solvair.co.uk/wp-content/uploads/news-vector.jpg https://solvair.co.uk/the-energy-efficiency-strategy-the-energy-efficiency-opportunity-in-the-uk/ 2017-07-21T09:36:42+00:00 https://solvair.co.uk/wp-content/uploads/carbon-Funding-Logo.png https://solvair.co.uk/drinktec-2017-success/ 2017-12-21T10:49:36+00:00 https://solvair.co.uk/wp-content/uploads/drinktec20171.jpg https://solvair.co.uk/christmas-break-opening-times/ 2017-12-21T10:53:54+00:00 https://solvair.co.uk/wp-content/uploads/solvair_christmas2017.jpg https://solvair.co.uk/bev-expo-2018-beverage-industry-exhibition/ 2018-01-22T17:54:21+00:00 https://solvair.co.uk/wp-content/uploads/bevExpo2018.jpg https://solvair.co.uk/ecoblow-kiekens-vacuum-cleaning-systems-display-bevexpo/ 2018-03-12T16:53:31+00:00 https://solvair.co.uk/wp-content/uploads/bev-expo-2018-a.jpg https://solvair.co.uk/2012-exhibition-list/ 2019-07-30T21:31:56+00:00 https://solvair.co.uk/wp-content/uploads/2012-exhibitions.png https://solvair.co.uk/anuga-foodtec-2012/ 2019-07-30T21:32:02+00:00 https://solvair.co.uk/wp-content/uploads/anuga-food-tec.gif https://solvair.co.uk/tbos-plastic-pellet-removal-system/ 2019-10-07T16:06:25+00:00 https://solvair.co.uk/wp-content/uploads/TruckBlowOffStation-PlasticPelletRemoval.jpg https://solvair.co.uk/wp-content/uploads/TBOS-Logo-Colour-500x113.jpg https://solvair.co.uk/wp-content/uploads/TruckBlowOffStation-PlasticPelletRemoval.jpg https://solvair.co.uk/wp-content/uploads/ocs-logo.png https://solvair.co.uk/solvair-and-cranfield-university-new-rd-link/ 2020-05-26T12:54:41+00:00 https://solvair.co.uk/wp-content/uploads/cranfield-engineering-research.jpg https://solvair.co.uk/wp-content/uploads/european_regional_development_fund_logo.jpg https://solvair.co.uk/is-energy-efficiency-a-priority-avoid-compressed-air/ 2020-05-26T12:55:58+00:00 https://solvair.co.uk/wp-content/uploads/compressed-air.jpg https://solvair.co.uk/braubeviale-2018/ 2020-05-26T12:56:51+00:00 https://solvair.co.uk/wp-content/uploads/2018-November-BrauBeviale2018.jpg https://solvair.co.uk/air-knife-experts-banner-how-good-are-paxton-products/ 2020-05-26T12:58:47+00:00 https://solvair.co.uk/wp-content/uploads/Image_6305-e1383842211968.jpg https://solvair.co.uk/bfbi-meeting-robinsons-brewery-stockport/ 2020-05-26T13:00:52+00:00 https://solvair.co.uk/wp-content/uploads/bfbi-logo1.jpg https://solvair.co.uk/christmas-2018-seasons-greetings-closing-times/ 2020-05-26T13:02:23+00:00 https://solvair.co.uk/wp-content/uploads/christmas-image-2018.jpg https://solvair.co.uk/siba-braubeviale-2018/ 2020-05-26T13:04:54+00:00 https://solvair.co.uk/wp-content/uploads/SIBA-BrauBeviale2018.jpg https://solvair.co.uk/wp-content/uploads/craft-brewing-bottles.jpg https://solvair.co.uk/wp-content/uploads/beer_bottle_SIBA_logo.jpg https://solvair.co.uk/solvair-announce-launch-of-most-efficient-system/ 2020-05-26T13:06:42+00:00 https://solvair.co.uk/wp-content/uploads/IMG_1873a.jpg https://solvair.co.uk/solvairs-eco-blow-bevexpo-2019-coventry/ 2020-05-26T13:08:42+00:00 https://solvair.co.uk/wp-content/uploads/BevExpo2019.jpg https://solvair.co.uk/bespoke-air-blower-enclosures-quiet-efficient/ 2020-05-26T13:15:22+00:00 https://solvair.co.uk/wp-content/uploads/blower_sound_enclosures.jpg https://solvair.co.uk/cost-saving-blow-off-system-for-ceramic-tile-manufacturers/ 2020-05-26T13:19:27+00:00 https://solvair.co.uk/wp-content/uploads/cost_saving_blow_off_system_for_ceramic_tile_manufacturers.jpg https://solvair.co.uk/solvair-launch-new-circular-air-knife-design/ 2020-05-26T13:21:29+00:00 https://solvair.co.uk/wp-content/uploads/ca-circular-air-knife_image_0747.jpg https://solvair.co.uk/turnkey-solution-result-for-food-producer/ 2020-05-26T13:24:04+00:00 https://solvair.co.uk/wp-content/uploads/MG_3999.jpg https://solvair.co.uk/wp-content/uploads/MG_3993.jpg https://solvair.co.uk/wp-content/uploads/MG_3977.jpg https://solvair.co.uk/wp-content/uploads/MG_3965.jpg https://solvair.co.uk/3-in-1-bespoke-air-knife-system/ 2020-07-03T12:15:07+00:00 https://solvair.co.uk/wp-content/uploads/daragel-3in1-product-examples-1.jpg https://solvair.co.uk/wp-content/uploads/bespoke-air-knife-system-1.jpg https://solvair.co.uk/wp-content/uploads/daragel-3in1-product-examples-1.jpg https://solvair.co.uk/wp-content/uploads/paxton-air-blower.jpg https://solvair.co.uk/wp-content/uploads/bespoke-air-knives.jpg https://solvair.co.uk/wp-content/uploads/MG_3993.jpg https://solvair.co.uk/wp-content/uploads/MG_3993.jpg https://solvair.co.uk/wp-content/uploads/MG_3993.jpg https://solvair.co.uk/wp-content/uploads/air-knife-system-blueprints.jpg https://solvair.co.uk/wp-content/uploads/bespoke-air-knife-system-power-unit.jpg https://solvair.co.uk/2020-annual-review-update/ 2020-12-18T12:05:37+00:00 https://solvair.co.uk/wp-content/uploads/2020-annual-update.jpg https://solvair.co.uk/covid19-november-2020-update/ 2020-12-18T12:07:03+00:00 https://solvair.co.uk/wp-content/uploads/covid_nov_2020.jpg https://solvair.co.uk/announcement-global-air-knife-distributor-partnership/ 2021-02-12T19:55:12+00:00 https://solvair.co.uk/wp-content/uploads/al_fanar_air_knife_dubai_uae_2021.jpg https://solvair.co.uk/solvairs-solojet-air-nozzles-and-cranfield-university/ 2021-10-27T20:45:01+00:00 https://solvair.co.uk/wp-content/uploads/solojet-fluid-dynamics02.jpg https://solvair.co.uk/wp-content/uploads/cranfield-engineering-research-450x299.jpg https://solvair.co.uk/wp-content/uploads/Pellet_Removal_Solojet_Nozzles-1454x818.jpg https://solvair.co.uk/wp-content/uploads/solojet-air-nozzles-03-450x360.jpg https://solvair.co.uk/wp-content/uploads/air-nozzle-solojet-01-450x360.jpg https://solvair.co.uk/wp-content/uploads/air-knife-nozzles-solojet-02-450x360.jpg https://solvair.co.uk/wp-content/uploads/TBOS-Logo-Colour-730x165.jpg https://solvair.co.uk/wp-content/uploads/TruckBlowOffStation-PlasticPelletRemoval-730x411.jpg https://solvair.co.uk/wp-content/uploads/ocs-logo-white-450x72.png https://solvair.co.uk/wp-content/uploads/solojet-air-nozzles-fluid-dynamics03.jpg https://solvair.co.uk/wp-content/uploads/solojet-air-nozzle-fluid-dynamics02.jpg https://solvair.co.uk/wp-content/uploads/solojet-air-nozzle-blow-off-fluid-dynamics04.jpg https://solvair.co.uk/wp-content/uploads/solojet-fluid-dynamics02.jpg https://solvair.co.uk/multipack-turnkey-food-beverage-air-knife-drying-system/ 2022-04-20T12:21:45+00:00 https://solvair.co.uk/wp-content/uploads/MultiPack-Turkney-Food-Drying-Systems-thumbnail.jpg https://solvair.co.uk/wp-content/uploads/multi-pack-drying-system.jpg https://solvair.co.uk/wp-content/uploads/air-knives-stainless-steel-air-knife.jpg https://solvair.co.uk/wp-content/uploads/home-air-knife-blower.jpg https://solvair.co.uk/wp-content/uploads/air_knife_manifold_sv10-nozzles-small.jpg https://solvair.co.uk/wp-content/uploads/MultiPack-Turkney-Food-Drying-Systems-730x632.jpg https://solvair.co.uk/new-truck-blow-off-system-tbos-solves-plastic-pellet-pollution/ 2022-09-01T12:44:00+00:00 https://solvair.co.uk/wp-content/uploads/TruckBlowOffStation-PlasticPelletRemoval.jpg https://solvair.co.uk/drying-systems-for-bottles/ 2022-09-01T12:45:01+00:00 https://solvair.co.uk/wp-content/uploads/beer-bottle-drying-system.jpg https://solvair.co.uk/wp-content/uploads/bottle-drying-air-knife-system.jpg https://solvair.co.uk/wp-content/uploads/MultiPack-Turkney-Food-Drying-Systems-1.jpg https://solvair.co.uk/wp-content/uploads/bottle-can-drying-systems.jpg https://solvair.co.uk/wp-content/uploads/bottle-cap-dryer.jpg https://solvair.co.uk/wp-content/uploads/beer-bottle-drying-system.jpg https://solvair.co.uk/wp-content/uploads/pet_bottle_drying_systems.jpg https://solvair.co.uk/can-drying-systems/ 2022-09-01T12:45:10+00:00 https://solvair.co.uk/wp-content/uploads/aluminium_can_drying_system.jpg https://solvair.co.uk/wp-content/uploads/drying_systems_for_beverage_containers.jpg https://solvair.co.uk/wp-content/uploads/beverage_can_drying_system.jpg https://solvair.co.uk/wp-content/uploads/aluminium_can_drying_system.jpg https://solvair.co.uk/wp-content/uploads/Ionized-Air-System-close-up.jpg https://solvair.co.uk/the-industrial-air-knife/ 2022-09-01T12:45:34+00:00 https://solvair.co.uk/wp-content/uploads/solvair-air-knife.jpg https://solvair.co.uk/wp-content/uploads/solvair-industrial-air-knife-450x317.jpg https://www.solvair.co.uk/wp-content/uploads/air-knife-profile-450x506.jpg https://www.solvair.co.uk/wp-content/uploads/application_automotive-450x316.jpg https://www.solvair.co.uk/wp-content/uploads/beverage-can-water-blow-off-450x300.jpg https://www.solvair.co.uk/wp-content/uploads/air-knives-alluminium-electrical-drying-450x299.jpg https://www.solvair.co.uk/wp-content/uploads/air_knife_food_production_drying_equipment-450x300.jpg https://www.solvair.co.uk/wp-content/uploads/iv_bag_pharmaceutical_production-450x300.jpg https://solvair.co.uk/air-blade-nozzles/ 2022-09-01T12:46:33+00:00 https://solvair.co.uk/wp-content/uploads/cheap_plastic_air_blade_nozzle.jpg https://solvair.co.uk/wp-content/uploads/cheap_plastic_air_blade_nozzle-450x263.jpg https://solvair.co.uk/wp-content/uploads/air-knife-consumption-compressed-air-nozzles-450x315.jpg https://solvair.co.uk/wp-content/uploads/carbon-trust-logo-450x295.jpg https://solvair.co.uk/wp-content/uploads/AirKnifeBlower-Paxton-XT500.jpg https://solvair.co.uk/wp-content/uploads/AirKnifeBlower-PX1550-main.jpg https://solvair.co.uk/air-knife-consumption/ 2022-09-01T12:47:15+00:00 https://solvair.co.uk/wp-content/uploads/air-knife-consumption-compressed-air-nozzles.jpg https://solvair.co.uk/wp-content/uploads/air-knife-consumption-compressed-air-nozzles-450x315.jpg https://solvair.co.uk/wp-content/uploads/AirKnifeBlower-PX1550-main-450x283.jpg https://solvair.co.uk/wp-content/uploads/CompressedAirCosts.png https://solvair.co.uk/wp-content/uploads/compressed_air-vs-air_blowers-450x333.jpg https://solvair.co.uk/wp-content/uploads/PX-Centrifugal-Blower-3-Year-Guarantee-scaled.jpg https://solvair.co.uk/wp-content/uploads/CiompressedAirCo2Impact.png https://solvair.co.uk/reducing-your-business-energy-consumption/ 2022-10-05T14:19:46+00:00 https://solvair.co.uk/wp-content/uploads/electric-meters-in-a-row-measuring-power-use-electricity-consum.jpg https://solvair.co.uk/wp-content/uploads/compressed_air_nozzles_inefficient-450x338.jpg https://solvair.co.uk/wp-content/uploads/bar_chart_compressed_air_vs_blower.png https://solvair.co.uk/wp-content/uploads/PX-Centrifugal-Blower-3-Year-Guarantee-450x307.jpg https://solvair.co.uk/solvair-new-office-announcement/ 2022-10-10T11:04:54+00:00 https://solvair.co.uk/wp-content/uploads/SolvAir_Unit08_04.jpg https://solvair.co.uk/wp-content/uploads/SolvAir_Unit08_01-450x281.jpg https://solvair.co.uk/small-grant-awarded-from-the-new-anglia-business-growth-programme/ 2022-10-25T13:28:23+00:00 https://solvair.co.uk/wp-content/uploads/New-Anglia-SGS-EU-Logo-Featured.jpg https://solvair.co.uk/wp-content/uploads/New-Anglia-SGS-EU-Logo-HR.jpg https://solvair.co.uk/wp-content/uploads/solvair-ipswich-location2-740x515.jpg https://solvair.co.uk/christmas-2020-opening-hours/ 2022-12-20T17:11:06+00:00 https://solvair.co.uk/wp-content/uploads/christmas-image-2020.jpg https://solvair.co.uk/blowing-off-plastic-pellets-from-tankers-trucks/ 2023-01-11T14:12:11+00:00 https://solvair.co.uk/wp-content/uploads/nurdle-polution-header-scaled.jpg https://solvair.co.uk/wp-content/uploads/nurdle-polution-in-water-450x293.jpg https://solvair.co.uk/wp-content/uploads/Great-Nurdle-Hunt-FIDRA-450x450.jpg https://solvair.co.uk/wp-content/uploads/OCS-logo-wide.fw_-450x83.png https://solvair.co.uk/wp-content/uploads/tbos-truck-close-up@2x-441x600.jpg https://solvair.co.uk/industrial-drying-process-solutions/ 2023-01-11T14:13:50+00:00 https://solvair.co.uk/wp-content/uploads/beverage-drink-bottle-water-cleaning.jpg https://solvair.co.uk/wp-content/uploads/doy-food-bevage-packaging-water-removal-cleaning-740x515.jpg https://solvair.co.uk/wp-content/uploads/compressed_air_vs_air_blower_energy_usage-450x349.png https://solvair.co.uk/wp-content/uploads/air_knife_system_turnkey_enclosures-450x389.jpg https://solvair.co.uk/christmas-2022-opening-hours/ 2023-01-11T14:22:49+00:00 https://solvair.co.uk/wp-content/uploads/christmas-image-2022.jpg https://solvair.co.uk/plastic-pellets/ 2023-02-24T17:31:42+00:00 https://solvair.co.uk/wp-content/uploads/FIDRA-Nurdles-Beach.jpg https://solvair.co.uk/wp-content/uploads/nurdle-polution-in-water-740x515.jpg https://solvair.co.uk/wp-content/uploads/home-rubber-plastic-drying-450x450.jpg https://solvair.co.uk/wp-content/uploads/TruckBlowOffStation-PlasticPelletRemoval-450x253.jpg https://solvair.co.uk/wp-content/uploads/ocs-logo.png https://solvair.co.uk/2022-solvair-annual-review-update/ 2023-04-25T13:34:09+00:00 https://solvair.co.uk/wp-content/uploads/2022-annual-update-e1682429641239.jpg https://solvair.co.uk/ocs-compliance-why-its-important-for-the-transport-industry/ 2023-04-25T13:36:13+00:00 https://solvair.co.uk/wp-content/uploads/operationCleanSweep.jpg https://solvair.co.uk/wp-content/uploads/air-nozzles-pellet-removal-740x410.jpg https://solvair.co.uk/wp-content/uploads/operationCleanSweep.jpg https://solvair.co.uk/wp-content/uploads/home-rubber-plastic-drying-450x450.jpg https://solvair.co.uk/wp-content/uploads/ocs-logo.png https://solvair.co.uk/nurdles-what-are-they-and-how-do-they-affect-the-environment/ 2023-05-12T09:00:36+00:00 https://solvair.co.uk/wp-content/uploads/industrial-clean-up-nurdles-plastic-pellets.jpg https://solvair.co.uk/wp-content/uploads/FIDRA-Nurdles-Beach-740x515.jpg https://solvair.co.uk/wp-content/uploads/plastic-pellets-nurdles-industrial-clean-up-450x300.jpg https://solvair.co.uk/wp-content/uploads/operationCleanSweep-450x300.jpg https://solvair.co.uk/wp-content/uploads/tbos-truck-close-up@2x-441x600.jpg https://solvair.co.uk/christmas-2023-opening-times/ 2023-12-14T14:21:07+00:00 https://solvair.co.uk/wp-content/uploads/SolvAirChristmas2023.jpg https://solvair.co.uk/nurdles-in-the-news/ 2024-02-09T08:00:34+00:00 https://solvair.co.uk/wp-content/uploads/nurdle-polution-in-water.jpg https://solvair.co.uk/wp-content/uploads/nurdle-polution-in-water-730x475.jpg https://solvair.co.uk/wp-content/uploads/OCS-logo-wide.fw_.png https://solvair.co.uk/wp-content/uploads/European_Commission_Logo.svg-1536x404.png https://solvair.co.uk/wp-content/uploads/FIDRA-Nurdles-Beach-740x410.jpg https://solvair.co.uk/wp-content/uploads/truck-pellet-removal-blow-off-system-740x515.jpg https://solvair.co.uk/gesete-braubeviale-2023-visit/ 2024-02-01T14:29:57+00:00 https://solvair.co.uk/wp-content/uploads/BrauBeviale2023.jpg https://solvair.co.uk/wp-content/uploads/braubeviale.jpg https://solvair.co.uk/wp-content/uploads/GESETE-logo.png https://solvair.co.uk/wp-content/uploads/Jamie-solo.jpg https://solvair.co.uk/solvair-launches-vortextubes-co-uk-efficient-compressed-air-based-cooling-solutions/ 2024-02-01T14:30:13+00:00 https://solvair.co.uk/wp-content/uploads/vortext-website-launch-mobile.jpg https://solvair.co.uk/wp-content/uploads/vortext-website-launch-mobile-740x610.jpg https://solvair.co.uk/wp-content/uploads/Vortex-Tube_106-2-H-450x321.jpg https://solvair.co.uk/wp-content/uploads/vortex-cooler.jpg https://solvair.co.uk/wp-content/uploads/Standard_Cold_Air_Gun_610-450x321.jpg https://solvair.co.uk/wp-content/uploads/Air_Knife_921-12-450x321.jpg https://solvair.co.uk/custom-air-knife-systems-design-installation/ 2024-02-01T14:30:27+00:00 https://solvair.co.uk/wp-content/uploads/solvair-bespoke-air-knife-solutions.jpg https://solvair.co.uk/wp-content/uploads/air_knives_system_enclosure-740x515.jpg https://solvair.co.uk/wp-content/uploads/solvair-bespoke-air-knife-solutions-740x515.jpg https://solvair.co.uk/wp-content/uploads/air_knife_system_conveyor_bottle-drying_nozzle-740x610.jpg https://solvair.co.uk/wp-content/uploads/TruckBlowOffStation-PlasticPelletRemoval-2-740x410.jpg https://solvair.co.uk/solvair-sponsor-smithy-speeders-f1-team/ 2024-04-15T10:00:21+00:00 https://solvair.co.uk/wp-content/uploads/solvair-school-f1-engineering-featured.jpg https://solvair.co.uk/wp-content/uploads/solvair-school-f1-engineering-01.jpg https://solvair.co.uk/congratulations-jordan/ 2024-07-02T15:01:27+00:00 https://solvair.co.uk/wp-content/uploads/jordan-congratulations-featured.jpg https://solvair.co.uk/wp-content/uploads/jordan-congratulations-740x515.jpg https://solvair.co.uk/solvair-and-gesete-distributor-meeting-september-2024/ 2024-11-08T12:38:47+00:00 https://solvair.co.uk/wp-content/uploads/distributor-meeting-featured.jpg https://solvair.co.uk/wp-content/uploads/distributor-meeting-6925b-918x500.jpg https://solvair.co.uk/wp-content/uploads/distributor-meeting-6762b-740x610.jpg https://solvair.co.uk/wp-content/uploads/distributor-meeting-9530b-721x500.jpg https://solvair.co.uk/christmas-hours-2024/ 2024-12-18T08:20:12+00:00 https://solvair.co.uk/wp-content/uploads/xmas-2024-featured.jpg https://solvair.co.uk/brau-beviale-2024-exhibition/ 2024-12-20T13:14:24+00:00 https://solvair.co.uk/wp-content/uploads/BrauBeviale2024-featured.jpg https://solvair.co.uk/wp-content/uploads/BrauBeviale2024-gesete-02b-730x485.jpg https://solvair.co.uk/wp-content/uploads/BrauBeviale2024-gesete-01b-703x730.jpg https://solvair.co.uk/2024-year-in-review/ 2025-01-24T13:12:02+00:00 https://solvair.co.uk/wp-content/uploads/SolvAir-2024-review-featured.jpg https://solvair.co.uk/wp-content/uploads/case-studies-740x410.jpg https://solvair.co.uk/wp-content/uploads/distributor-meeting-6925-730x548.jpg https://solvair.co.uk/wp-content/uploads/air-alliance-news-740x410.jpg https://solvair.co.uk/wp-content/uploads/circular-air-knife-cutaway-740x515.jpg https://solvair.co.uk/wp-content/uploads/big-drying-system-740x410.jpg https://solvair.co.uk/wp-content/uploads/2024-brochure-740x410.jpg https://solvair.co.uk/wp-content/uploads/BrauBeviale2024-gesete-02b-740x515.jpg https://solvair.co.uk/wp-content/uploads/solvair-school-f1-engineering-featured-740x515.jpg https://solvair.co.uk/wp-content/uploads/steve_hand_main-740x610.jpg https://solvair.co.uk/congratulations-peter-3-months-at-solvair/ 2025-04-15T08:00:06+00:00 https://solvair.co.uk/wp-content/uploads/News-staff-peter-featured.jpg https://solvair.co.uk/wp-content/uploads/Peter-solo.jpg https://solvair.co.uk/solvair-partner-launches-optimus-instruments/ 2025-05-27T08:07:36+00:00 https://solvair.co.uk/wp-content/uploads/optimus-cover.jpg https://solvair.co.uk/wp-content/uploads/optimus-logo-white-1.webp https://solvair.co.uk/wp-content/uploads/optimus-logo-large.webp https://solvair.co.uk/world-environment-day-5-june-2025-beatplastic-pollution/ 2025-06-06T11:33:38+00:00 https://solvair.co.uk/wp-content/uploads/WorldEnvironmentDay-featured.jpg https://solvair.co.uk/wp-content/uploads/WorldEnvironmentDay-main-740x410.jpg https://solvair.co.uk/wp-content/uploads/BritishPlasticFederation-logo.png https://solvair.co.uk/wp-content/uploads/FIDRA-Nurdles-Beach-740x410.jpg https://solvair.co.uk/wp-content/uploads/tbos-truck-close-up@2x-368x500.jpg https://solvair.co.uk/wp-content/uploads/TBOS-Logo-Colour-730x165.jpg https://solvair.co.uk/solvair-launch-equipment-access-by-lease-option/ 2025-08-20T10:52:16+00:00 https://solvair.co.uk/wp-content/uploads/shire-logo.png https://solvair.co.uk/wp-content/uploads/shire-infosheet.jpg https://solvair.co.uk/wp-content/uploads/shire-logo.png https://solvair.co.uk/solvair-returns-to-drinktec-2025/ 2025-10-13T13:34:49+00:00 https://solvair.co.uk/wp-content/uploads/SolvAir-drinktec-2025.jpg https://solvair.co.uk/wp-content/uploads/drinktec2025-1.jpg https://solvair.co.uk/wp-content/uploads/drinktec2025-2-500x500.jpg https://solvair.co.uk/new-hepa-filter-for-air-knife-drying-cleaning-systems/ 2025-10-14T10:00:15+00:00 https://solvair.co.uk/wp-content/uploads/SolvAir-HEPA-filter.jpg https://solvair.co.uk/wp-content/uploads/inline-air-knife-filter01.jpg https://solvair.co.uk/wp-content/uploads/inline-air-knife-filter02.jpg https://solvair.co.uk/new-solvair-team-member/ 2025-12-19T11:44:31+00:00 https://solvair.co.uk/wp-content/uploads/Team-Member-Jamie-solo.jpg https://solvair.co.uk/wp-content/uploads/Jamie-solo.jpg https://solvair.co.uk/2023-year-in-review/ 2025-12-19T11:48:35+00:00 https://solvair.co.uk/wp-content/uploads/SolvAir-20-Years-v2.jpg https://solvair.co.uk/wp-content/uploads/SolvAir-20-Years-v2-730x487.jpg https://solvair.co.uk/wp-content/uploads/SolvAir-20-Years-730x487.jpg https://solvair.co.uk/wp-content/uploads/steve_hand_featured-740x410.jpg https://solvair.co.uk/wp-content/uploads/VortexTube-Website-Compressed-Air-Specialists-For-Spot-Process-Cooling-SolvAir-Hero-740x515.png https://solvair.co.uk/wp-content/uploads/Pellet_Removal_Solojet_Nozzles-2-730x411.jpg https://solvair.co.uk/wp-content/uploads/vegetables-are-growing-in-indoor-farm-vertical-far-2023-11-27-05-32-47-utc-740x410.jpeg https://solvair.co.uk/wp-content/uploads/s-p-logo-740x410.jpg https://solvair.co.uk/wp-content/uploads/Team-Member-Jamie-solo-730x487.jpg https://solvair.co.uk/wp-content/uploads/SolvAir-staff-group-shot-narrow.jpg https://solvair.co.uk/solvair-celebrates-20-years/ 2025-12-19T11:50:35+00:00 https://solvair.co.uk/wp-content/uploads/SolvAir-20-Years.jpg https://solvair.co.uk/wp-content/uploads/SolvAir-20-Years-730x487.jpg https://solvair.co.uk/wp-content/uploads/SolvAir-staff-group-shot.jpg https://solvair.co.uk/wp-content/uploads/air_knife_system_turnkey_enclosures-740x515.jpg https://solvair.co.uk/milestone-birthday-steve-hand/ 2025-12-19T11:51:25+00:00 https://solvair.co.uk/wp-content/uploads/steve_hand_featured.jpg https://solvair.co.uk/wp-content/uploads/steve_hand_main-740x515.jpg https://solvair.co.uk/wp-content/uploads/SolvAir-staff-group-shot-narrow.jpg https://solvair.co.uk/new-solvair-production-team-member/ 2025-12-19T11:52:15+00:00 https://solvair.co.uk/wp-content/uploads/News-staff-dan-featured.jpg https://solvair.co.uk/wp-content/uploads/Dan-solo.jpg https://solvair.co.uk/wp-content/uploads/staff-dan-zack-uk-air-knife-distribution-740x410.jpg https://solvair.co.uk/christmas-hours-2025/ 2025-12-23T11:14:43+00:00 https://solvair.co.uk/wp-content/uploads/christmas-image-main-2025.jpg https://solvair.co.uk/open-blowing-energy-efficient-alternatives-to-compressed-air-solvair-webinar/ 2026-07-27T10:38:37+00:00 https://solvair.co.uk/wp-content/uploads/webinar-featured.jpg