class-media-item-query.php
3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
namespace Smush\Core\Media;
use Smush\Core\Smush\Smush_Optimization;
use Smush\Core\Smush_File;
class Media_Item_Query {
public function fetch( $offset = 0, $limit = - 1 ) {
global $wpdb;
$query = $this->make_query( 'ID', $offset, $limit );
return $wpdb->get_col( $query );
}
public function fetch_slice_post_meta( $slice, $slice_size ) {
global $wpdb;
$offset = $this->get_offset( $slice, $slice_size );
$limit = (int) $slice_size;
$ids_query = $this->make_query( 'ID', $offset, $limit );
$query = "SELECT CONCAT(post_id, '-', meta_key), post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE post_id IN (SELECT * FROM ($ids_query) AS slice_ids);";
return $wpdb->get_results( $query, OBJECT_K );
}
public function fetch_slice_posts( $slice, $slice_size ) {
global $wpdb;
$offset = $this->get_offset( $slice, $slice_size );
$limit = (int) $slice_size;
$posts_query = $this->make_query( '*', $offset, $limit );
return $wpdb->get_results( $posts_query, OBJECT_K );
}
public function fetch_slice_ids( $slice, $slice_size ) {
$offset = $this->get_offset( $slice, $slice_size );
$limit = (int) $slice_size;
return $this->fetch( $offset, $limit );
}
public function get_slice_count( $slice_size ) {
if ( empty( $slice_size ) ) {
return 0;
}
$image_attachment_count = $this->get_image_attachment_count();
return (int) ceil( $image_attachment_count / $slice_size );
}
public function get_image_attachment_count() {
global $wpdb;
$query = $this->make_query( 'COUNT(*)' );
return (int) $wpdb->get_var( $query );
}
/**
* @param $select
* @param $offset
* @param $limit
*
* @return string|null
*/
private function make_query( $select, $offset = 0, $limit = - 1 ) {
global $wpdb;
$mime_types = ( new Smush_File() )->get_supported_mime_types();
$placeholders = implode( ',', array_fill( 0, count( $mime_types ), '%s' ) );
$column = $select;
$query = "SELECT %s FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type IN (%s)";
$query = sprintf( $query, $column, $placeholders );
$args = $mime_types;
if ( $limit > 0 ) {
$query = "$query LIMIT %d";
$args[] = $limit;
if ( $offset >= 0 ) {
$query = "$query OFFSET %d";
$args[] = $offset;
}
}
return $wpdb->prepare( $query, $args );
}
public function get_lossy_count() {
global $wpdb;
$query = $wpdb->prepare( "SELECT COUNT(DISTINCT post_id) FROM $wpdb->postmeta WHERE meta_key = %s AND meta_value = 1", Smush_Optimization::LOSSY_META_KEY );
return $wpdb->get_var( $query );
}
public function get_smushed_count() {
global $wpdb;
$query = $wpdb->prepare(
"SELECT COUNT(DISTINCT post_meta_optimized.post_id) FROM $wpdb->postmeta as post_meta_optimized
LEFT JOIN $wpdb->postmeta as post_meta_ignored ON post_meta_optimized.post_id = post_meta_ignored.post_id AND post_meta_ignored.meta_key= %s
WHERE post_meta_optimized.meta_key = %s AND post_meta_ignored.meta_value IS NULL",
Media_Item::IGNORED_META_KEY,
Smush_Optimization::SMUSH_META_KEY
);
return $wpdb->get_var( $query );
}
public function get_ignored_count() {
global $wpdb;
$query = $wpdb->prepare( "SELECT COUNT(DISTINCT post_id) FROM $wpdb->postmeta WHERE meta_key = %s", Media_Item::IGNORED_META_KEY );
return $wpdb->get_var( $query );
}
/**
* @param $slice
* @param $slice_size
*
* @return float|int
*/
private function get_offset( $slice, $slice_size ) {
$slice = (int) $slice;
$slice_size = (int) $slice_size;
return ( $slice - 1 ) * $slice_size;
}
}