get_upload_directory($file_info['basename'], $meta); $filename = $file_info['filename']; $original_extension = '.' . ($file_info['extension'] ?? ''); $sizes = empty($meta['sizes']) ? array() : $meta['sizes']; $images = $this->build_image_paths( $directory, $filename, $original_extension, $sizes ); $this->delete_files($images); } /** * Computes the upload directory path for the attachment * * @param string $basename The original file basename * @param array>> $meta The attachment metadata * @return string */ private function get_upload_directory($basename, $meta): string { $file = isset($meta['file']) && is_string($meta['file']) ? $meta['file'] : ''; $sub_directory = ''; if ('' !== $file) { $sub_directory = str_replace($basename, '', $file); } $uploads = wp_get_upload_dir(); return $uploads['basedir'] . '/' . $sub_directory; } /** * Builds a list of image file paths to delete, including both * original size variants and their WebP counterparts * * @param string $directory Upload directory path * @param string $filename Image filename without extension * @param string $original_extension Original file extension with leading dot * @param array> $sizes Registered image size definitions * @return array List of absolute file paths */ private function build_image_paths($directory, $filename, $original_extension, $sizes) { $webp_extension = '.webp'; $images = array( $directory . $filename . $original_extension . $webp_extension, ); $unscaled_filename = preg_replace('/-scaled$/', '', $filename); foreach ($sizes as $size) { $size_suffix = '-' . $size['width'] . 'x' . $size['height']; $images[] = $directory . $filename . $size_suffix . $original_extension; $images[] = $directory . $unscaled_filename . $size_suffix . $original_extension . $webp_extension; } return $images; } /** * Deletes the given list of files from disk * * @param array $files List of absolute file paths to delete * @return void */ private function delete_files($files): void { foreach ($files as $file) { wp_delete_file($file); } } } endif;