namespace ImageOptimization\Classes\Image;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
class Image_Query_Builder {
public function return_images_only_with_backups(): self {
$this->query['meta_query'][] = [
'value' => '"backups";a:0', // Serialized empty array of backups
'key' => Image_Meta::IMAGE_OPTIMIZER_METADATA_KEY,
public function return_not_optimized_images(): self {
$this->query['meta_query'][] = [
'key' => Image_Meta::IMAGE_OPTIMIZER_METADATA_KEY,
'compare' => 'NOT EXISTS',
'key' => Image_Meta::IMAGE_OPTIMIZER_METADATA_KEY,
'value' => ':"not-optimized";',
'key' => Image_Meta::IMAGE_OPTIMIZER_METADATA_KEY,
public function return_optimization_in_progress_images(): self {
$this->query['meta_query'][] = [
'key' => '_wp_attachment_metadata',
'value' => 'optimization-in-progress";',
'key' => 'image_optimizer_metadata',
'value' => 'reoptimizing-in-progress";',
'key' => 'image_optimizer_metadata',
public function return_optimized_images(): self {
$this->query['meta_query'][] = [
'value' => '"status";s:9:"optimized"',
'key' => Image_Meta::IMAGE_OPTIMIZER_METADATA_KEY,
public function return_images_with_non_empty_meta(): self {
$this->query['meta_query'][] = [
'key' => Image_Meta::IMAGE_OPTIMIZER_METADATA_KEY,
public function set_paging_size( int $paging_size ): self {
$this->query['posts_per_page'] = $paging_size;
public function set_current_page( int $current_page ): self {
$this->query['paged'] = $current_page;
public function set_image_ids( array $image_ids ): self {
// Passing an empty array to post__in will return the last posts instead of an empty result.
$this->query['post__in'] = count( $image_ids ) ? $image_ids : [ 0 ];
public function set_mime_types( array $mime_types ): self {
$this->query['post_mime_type'] = $mime_types;
public function execute(): WP_Query {
return new WP_Query( $this->query );
public function __construct() {
'post_type' => 'attachment',
'post_mime_type' => Image::get_supported_mime_types(),
'key' => '_wp_attachment_metadata', // Images without this field considered invalid
$this->query = $basic_query;