@@ -174,42 +174,101 @@ public static function get_stats( $request ) {
174
174
* @since 2.0.0
175
175
*/
176
176
public static function get_extended ( $ request ) {
177
+ // Verify scope.
177
178
$ scope = $ request ->get_param ( 'scope ' );
179
+ if ( ! in_array ( $ scope , array ( 'year ' , 'month ' , 'day ' ) ) ) {
180
+ return new WP_REST_Response (
181
+ array ( 'error ' => 'invalid scope (allowed: year, month, day) ' ),
182
+ 400
183
+ );
184
+ }
185
+
186
+ // Retrieve from cache, if data is not post-specific.
178
187
$ post = $ request ->get_param ( 'post ' );
188
+ $ stats = false ;
189
+ if ( ! $ post ) {
190
+ $ stats = self ::from_cache ( $ scope );
191
+ }
179
192
180
- $ status = 200 ;
181
- if ( 'year ' === $ scope ) {
182
- $ stats = Statify_Evaluation::get_views_for_all_years ( $ post );
183
- } elseif ( 'month ' === $ scope ) {
184
- $ visits = Statify_Evaluation::get_views_for_all_months ( $ post );
185
- $ stats = array ( 'visits ' => array () );
186
- $ last_ym = 0 ;
187
- foreach ( $ visits as $ ym => $ v ) {
188
- $ ym = explode ( '- ' , $ ym );
189
- $ year = intval ( $ ym [0 ] );
190
- $ month = intval ( $ ym [1 ] );
191
- $ year_month = $ year * 12 + $ month ;
192
- for ( $ ym = $ last_ym + 1 ; $ last_ym > 0 && $ ym < $ year_month ; $ ym ++ ) {
193
- // Fill gaps.
194
- $ y = intval ( $ ym / 12 );
195
- if ( ! isset ( $ stats ['visits ' ][ $ y ] ) ) {
196
- $ stats ['visits ' ][ $ y ] = array ();
193
+ if ( ! $ stats ) {
194
+ if ( 'year ' === $ scope ) {
195
+ if ( ! $ post ) {
196
+ $ stats = self ::from_cache ( $ scope );
197
+ }
198
+
199
+ if ( ! $ stats ) {
200
+ $ stats = Statify_Evaluation::get_views_for_all_years ( $ post );
201
+ }
202
+ } elseif ( 'month ' === $ scope ) {
203
+ if ( ! $ post ) {
204
+ $ stats = self ::from_cache ( $ scope );
205
+ }
206
+
207
+ if ( ! $ stats ) {
208
+ $ visits = Statify_Evaluation::get_views_for_all_months ( $ post );
209
+ $ stats = array ( 'visits ' => array () );
210
+ $ last_ym = 0 ;
211
+ foreach ( $ visits as $ ym => $ v ) {
212
+ $ ym = explode ( '- ' , $ ym );
213
+ $ year = intval ( $ ym [0 ] );
214
+ $ month = intval ( $ ym [1 ] );
215
+ $ year_month = $ year * 12 + $ month ;
216
+ for ( $ ym = $ last_ym + 1 ; $ last_ym > 0 && $ ym < $ year_month ; $ ym ++ ) {
217
+ // Fill gaps.
218
+ $ y = intval ( $ ym / 12 );
219
+ if ( ! isset ( $ stats ['visits ' ][ $ y ] ) ) {
220
+ $ stats ['visits ' ][ $ y ] = array ();
221
+ }
222
+ $ stats ['visits ' ][ $ y ][ $ ym % 12 ] = 0 ;
223
+ }
224
+ if ( ! isset ( $ stats ['visits ' ][ $ year ] ) ) {
225
+ $ stats ['visits ' ][ $ year ] = array ();
226
+ }
227
+ $ stats ['visits ' ][ $ year ][ $ month ] = $ v ;
228
+ $ last_ym = $ year_month ;
197
229
}
198
- $ stats ['visits ' ][ $ y ][ $ ym % 12 ] = 0 ;
199
230
}
200
- if ( ! isset ( $ stats ['visits ' ][ $ year ] ) ) {
201
- $ stats ['visits ' ][ $ year ] = array ();
231
+ } elseif ( 'day ' === $ scope ) {
232
+ if ( ! $ post ) {
233
+ $ stats = self ::from_cache ( $ scope );
234
+ }
235
+
236
+ if ( ! $ stats ) {
237
+ $ stats = Statify_Evaluation::get_views_for_all_days ( $ post );
202
238
}
203
- $ stats ['visits ' ][ $ year ][ $ month ] = $ v ;
204
- $ last_ym = $ year_month ;
205
239
}
206
- } elseif ( ' day ' === $ scope ) {
207
- $ stats = Statify_Evaluation:: get_views_for_all_days ( $ post );
208
- } else {
209
- $ stats = array ( ' error ' => ' invalid scope (allowed: year, month, day) ' );
210
- $ status = 400 ;
240
+
241
+ // Update cache, if data is not post-specific.
242
+ if ( ! $ post ) {
243
+ self :: update_cache ( $ scope, $ stats );
244
+ }
211
245
}
212
246
213
- return new WP_REST_Response ( $ stats , $ status );
247
+ return new WP_REST_Response ( $ stats );
248
+ }
249
+
250
+ /**
251
+ * Retrieve data from cache.
252
+ *
253
+ * @param string $scope Scope (year, month, day).
254
+ *
255
+ * @return array|false Transient data or FALSE.
256
+ */
257
+ private static function from_cache ( $ scope ) {
258
+ return get_transient ( 'statify_data_ ' . $ scope );
259
+ }
260
+
261
+ /**
262
+ * Update data cache.
263
+ *
264
+ * @param string $scope Scope (year, month, day).
265
+ * @param array $data Data.
266
+ */
267
+ private static function update_cache ( $ scope , $ data ) {
268
+ set_transient (
269
+ 'statify_data_ ' . $ scope ,
270
+ $ data ,
271
+ 30 * MINUTE_IN_SECONDS
272
+ );
214
273
}
215
274
}
0 commit comments