PluginProbe
Media Cloud Sync / trunk
Media Cloud Sync vtrunk
1.4.0 1.3.12 1.3.11 1.3.10 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.2.0 1.2.10 1.2.11 1.2.12 1.2.13 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 All 34 releases
← All changes | includes/api.php +253 -56 1.3.0trunk View file →
@@ -30,13 +30,14 @@
30 30 */
31 31
32 32 public function register_routes() {
33 33 $this->add_route( '/verifyCredentials', 'verifyCredentials', 'POST' );
34 - $this->add_route( '/permissions/checkExist', 'verifyBucketExist', 'POST' );
35 - $this->add_route( '/permissions/addNewBucket', 'createBucket', 'POST' );
36 - $this->add_route( '/permissions/write', 'verifyObjectWrite', 'POST' );
34 + $this->add_route( '/bucket/checkExist', 'verifyBucketExist', 'POST' );
35 + $this->add_route( '/bucket/addNew', 'createBucket', 'POST' );
36 + $this->add_route( '/permissions/status', 'verifyStatus', 'POST' );
37 + $this->add_route( '/permissions/write', 'verifyWrite', 'POST' );
37 38 $this->add_route( '/permissions/delete', 'verifyObjectDelete', 'POST' );
38 - $this->add_route( '/permissions/read', 'verifyObjectRead', 'POST' );
39 + $this->add_route( '/permissions/read', 'verifyRead', 'POST' );
39 40
40 41 $this->add_route( '/security/get_security', 'getBucketSecuritySettings', 'POST' );
41 42 $this->add_route( '/security/block_public_access', 'changePublicAccess', 'POST' );
42 43 $this->add_route( '/security/object_ownership_enforce', 'changeObjectOwnership', 'POST' );
@@ -44,9 +45,14 @@
44 45 $this->add_route( '/getSettings', 'getSettings' );
45 46 $this->add_route( '/saveConfig', 'saveConfig', 'POST' );
46 47 $this->add_route( '/refreshCounts', 'refreshCounts', 'POST' );
47 48 $this->add_route( '/getErrorLogs', 'getErrorLogs', 'POST' );
49 + $this->add_route( '/clearErrorLogs', 'clearErrorLogs', 'POST' );
48 50
51 + // Upgrade Database Routes
52 + $this->add_route( '/upgrade/status', 'getUpgradeStatus' );
53 + $this->add_route( '/upgrade/start', 'startUpgrade', 'POST' );
54 +
49 55 // Sync Routes
50 56 $this->add_route( '/sync/status', 'getStatus' );
51 57 $this->add_route( '/sync/start', 'startSync', 'POST' );
52 58 $this->add_route( '/sync/pause', 'pauseSync', 'POST' );
@@ -51,8 +57,10 @@
51 57 $this->add_route( '/sync/start', 'startSync', 'POST' );
52 58 $this->add_route( '/sync/pause', 'pauseSync', 'POST' );
53 59 $this->add_route( '/sync/resume', 'resumeSync', 'POST' );
54 60 $this->add_route( '/sync/stop', 'stopSync', 'POST' );
61 + $this->add_route( '/sync/tick', 'tickSync', 'POST' );
62 + $this->add_route( '/sync/setMethod', 'setSyncMethod', 'POST' );
55 63
56 64 $this->add_route( '/sync/retrySingle', 'retrySingle', 'POST' );
57 65 }
58 66
@@ -76,17 +84,31 @@
76 84 public function createBucket( $data ) {
77 85 return new WP_REST_Response( Service::instance()->createBucket($data->get_params()), 200 );
78 86 }
79 87
80 -
81 88 /**
82 - * Verify the Bucket Write Permission
89 + * Saved connection status checks (storage, CDN).
90 + * @since 1.3.11
83 91 */
84 - public function verifyObjectWrite( $data ) {
85 - return new WP_REST_Response( Service::instance()->verifyObjectWritePermission($data->get_params()), 200 );
92 + public function verifyStatus( $data ) {
93 + $params = $data->get_params();
94 + $check = isset( $params['check'] ) ? sanitize_text_field( $params['check'] ) : 'storage';
95 + return new WP_REST_Response( Service::instance()->verifyStatus( $check ), 200 );
86 96 }
87 97
88 98 /**
99 + * Verify bucket write permission (configure wizard) or saved storage status (legacy route).
100 + * @since 1.3.11
101 + */
102 + public function verifyWrite( $data ) {
103 + $params = $data->get_params();
104 + if ( !empty( $params['service'] ) ) {
105 + return new WP_REST_Response( Service::instance()->verifyObjectWritePermission( $params ), 200 );
106 + }
107 + return new WP_REST_Response( Service::instance()->verifyStatus( 'storage' ), 200 );
108 + }
109 +
110 + /**
89 111 * Verify the Bucket delete Permission
90 112 */
91 113 public function verifyObjectDelete( $data ) {
92 114 return new WP_REST_Response( Service::instance()->verifyObjectDeletePermission($data->get_params()), 200 );
@@ -92,12 +114,13 @@
92 114 return new WP_REST_Response( Service::instance()->verifyObjectDeletePermission($data->get_params()), 200 );
93 115 }
94 116
95 117 /**
96 - * Verify the Bucket Read Permission
118 + * Verify delivery read access (legacy route).
119 + * @since 1.3.11
97 120 */
98 - public function verifyObjectRead( $data ) {
99 - return new WP_REST_Response( Service::instance()->verifyObjectReadPermission($data->get_params()), 200 );
121 + public function verifyRead( $data ) {
122 + return new WP_REST_Response( Service::instance()->verifyStatus( 'cdn' ), 200 );
100 123 }
101 124
102 125 /**
103 126 * Get the Security Settings
@@ -129,11 +152,13 @@
129 152 // Fetch and update media counts for make sure they are up to date
130 153 Counter::fetch_and_update();
131 154
132 155 $data = [
133 - 'credentials' => Utils::get_credentials( '', [], true ),
134 - 'common' => [
135 - 'version' => WPMCS_VERSION,
156 + 'credentials' => Utils::get_credentials( '', [], true ),
157 + 'serviceEnabled' => Utils::is_service_enabled(),
158 + 'serviceError' => Utils::get_service_configuration_error(),
159 + 'common' => [
160 + 'version' => defined('WPMCS_PRO_VERSION') ? WPMCS_PRO_VERSION : WPMCS_VERSION,
136 161 'counts' => [
137 162 'all' => Counter::get_count(),
138 163 'categorized' => $this->getSortedMediaCounts()
139 164 ],
@@ -140,8 +165,13 @@
140 165 'status' => Utils::get_status('', false),
141 166 'settings' => Utils::get_settings(),
142 167 ],
143 168 'sync' => Sync::instance()->get_status(),
169 + 'license' => defined('WPMCS_PRO_VERSION') ? Utils::get_safe_license_data() : [],
170 + 'file_manager' => defined('WPMCS_PRO_VERSION') ? [
171 + 'delete_enabled' => (bool) Utils::get_option('delete_enabled', false, Schema::getConstant('FILE_MANAGER_SETTINGS_KEY')),
172 + 'root_folder' => Utils::get_option('root_folder', '', Schema::getConstant('FILE_MANAGER_SETTINGS_KEY')),
173 + ] : [],
144 174 ];
145 175
146 176 return new WP_REST_Response( $data, 200 );
147 177 }
@@ -162,8 +192,9 @@
162 192 $service = isset($saveData['service']) ? $saveData['service'] : false;
163 193 $serviceLabel = isset($saveData['serviceLabel']) ? $saveData['serviceLabel'] : '';
164 194 $cdn = isset($saveData['cdn']) ? $saveData['cdn'] : [];
165 195 $config = isset($saveData['config']) ? $saveData['config'] : false;
196 + $configSource = isset($saveData['configSource']) ? $saveData['configSource'] : 'database';
166 197 $bucketConfig = isset($saveData['bucketConfig']) ? $saveData['bucketConfig'] : [];
167 198 $security = isset($saveData['security']) ? $saveData['security'] : [];
168 199 $settings = isset($saveData['settings']) ? $saveData['settings'] : [];
169 200
@@ -177,13 +208,16 @@
177 208 $updated = Utils::update_option('credentials', $existing, Schema::getConstant('GLOBAL_SETTINGS_KEY'));
178 209 $updatedSettings = Utils::update_option('settings', $settings, Schema::getConstant('GLOBAL_SETTINGS_KEY'));
179 210
180 211 if(!$updated) $serviceOk = false;
212 + if(!$updatedSettings) $settingsOk = false;
181 213 }
182 214
183 215
184 216 if($action === 'all' || $action === 'service'){
185 - if ( $service === false || empty($config) || empty($bucketConfig)) return new WP_REST_Response( $result, 200 );
217 + // In 'config' source mode the credentials live in the WPMCS_CONFIG constant,
218 + // so an empty config payload is expected and must not block the save.
219 + if ( $service === false || ($configSource !== 'config' && empty($config)) || empty($bucketConfig)) return new WP_REST_Response( $result, 200 );
186 220
187 221 $updated = Utils::update_option(
188 222 'credentials',
189 223 [
@@ -189,9 +223,10 @@
189 223 [
190 224 'service' => $service,
191 225 'serviceLabel' => $serviceLabel,
192 226 'cdn' => $cdn,
193 - 'config' => $config,
227 + 'config' => $configSource === 'config' ? [] : $config,
228 + 'configSource' => $configSource,
194 229 'bucketConfig' => $bucketConfig,
195 230 'security' => $security
196 231 ],
197 232 Schema::getConstant('GLOBAL_SETTINGS_KEY')
@@ -196,8 +231,21 @@
196 231 ],
197 232 Schema::getConstant('GLOBAL_SETTINGS_KEY')
198 233 );
199 234 if(!$updated) $serviceOk = false;
235 +
236 + if($serviceOk) {
237 + Utils::set_status('cdnRead', [
238 + 'status' => false,
239 + 'message' => '',
240 + 'lastChecked' => null
241 + ]);
242 + Utils::set_status('storageCredentials', [
243 + 'status' => false,
244 + 'message' => '',
245 + 'lastChecked' => null
246 + ]);
247 + }
200 248 }
201 249
202 250 if(($action === 'all' || $action === 'settings')) {
203 251 $updatedSettings = Utils::update_option('settings', $settings, Schema::getConstant('GLOBAL_SETTINGS_KEY'));
@@ -203,15 +251,24 @@
203 251 $updatedSettings = Utils::update_option('settings', $settings, Schema::getConstant('GLOBAL_SETTINGS_KEY'));
204 252 if(!$updatedSettings) $settingsOk = false;
205 253 }
206 254
255 + // Clear plugin caches and refresh counts after any configuration save.
256 + if(in_array($action, ['all', 'service', 'settings', 'cdn'], true)) {
257 + if($action === 'all' || $action === 'service' || $action === 'settings') {
258 + Integration::instance()->clear_all_meta(false);
259 + }
207 260
261 + if($action === 'all' || $action === 'settings') {
262 + Utils::clear_all_content_meta(false, false);
263 + }
264 +
265 + Cache::flush_object_cache();
266 + Counter::instance()->fetch_and_update();
267 + }
268 +
269 +
208 270 if($serviceOk && $settingsOk) {
209 - Utils::set_status('cdnRead', [
210 - 'status' => false,
211 - 'message' => '',
212 - 'lastChecked' => null
213 - ]);
214 271 $result = [
215 272 'success' => true,
216 273 'message' => esc_html__('Configuration saved successfully', 'media-cloud-sync')
217 274 ];
@@ -225,8 +282,10 @@
225 282 * Refresh the Media Counts
226 283 *
227 284 */
228 285 public function refreshCounts( ) {
286 + Cache::flush_object_cache();
287 + Integration::instance()->clear_all_meta();
229 288 Counter::instance()->fetch_and_update();
230 289
231 290 $result = [
232 291 'success' => true,
@@ -240,8 +299,27 @@
240 299 }
241 300
242 301
243 302 /**
303 + * Start Upgrade
304 + * @since 1.3.6
305 + */
306 + public function startUpgrade( $request ) {
307 + $result = Upgrade::instance()->start_upgrade();
308 + return new WP_REST_Response( $result, 200 );
309 + }
310 +
311 +
312 + /**
313 + * Get Upgrade Status
314 + * @since 1.3.6
315 + */ public function getUpgradeStatus( $request ) {
316 + $result = Upgrade::instance()->get_progress();
317 + return new WP_REST_Response( $result, 200 );
318 + }
319 +
320 +
321 + /**
244 322 * Get Media Error Logs
245 323 * @since 1.2.13
246 324 */
247 325 public function getErrorLogs( $request ) {
@@ -265,8 +343,32 @@
265 343 }
266 344
267 345
268 346 /**
347 + * Clear all error logs for a sync type (e.g. stale entries from earlier failed attempts).
348 + * @since 1.3.13
349 + */
350 + public function clearErrorLogs( $request ) {
351 + $type = isset($request->get_params()['type']) ? $request->get_params()['type'] : '';
352 +
353 + if (empty($type) || !Sync::instance()->get_class_by_action($type)) {
354 + return new WP_REST_Response( [
355 + 'success' => false,
356 + 'message' => esc_html__('Invalid action', 'media-cloud-sync')
357 + ], 200 );
358 + }
359 +
360 + Logger::instance()->remove_logs_by_type($type);
361 +
362 + $result = [
363 + 'success' => true,
364 + 'message' => esc_html__('Error logs cleared', 'media-cloud-sync')
365 + ];
366 + return new WP_REST_Response( $result, 200 );
367 + }
368 +
369 +
370 + /**
269 371 * Get Status
270 372 * @since 1.2.13
271 373 */
272 374 public function getStatus( $request ) {
@@ -297,9 +399,9 @@
297 399 * @since 1.2.13
298 400 */
299 401 public function startSync( $data ) {
300 402 $action = isset($data->get_params()['action']) ? $data->get_params()['action'] : '';
301 - if(empty($action)) {
403 + if ( ! Sync::instance()->get_class_by_action( $action ) ) {
302 404 $result = [
303 405 'success' => false,
304 406 'message' => esc_html__('Invalid action', 'media-cloud-sync')
305 407 ];
@@ -304,10 +406,22 @@
304 406 'message' => esc_html__('Invalid action', 'media-cloud-sync')
305 407 ];
306 408 return new WP_REST_Response( $result, 200 );
307 409 }
410 + if(!Utils::is_service_enabled()) {
411 + $result = [
412 + 'success' => false,
413 + 'message' => Utils::get_service_configuration_error() ?: esc_html__('Storage is not configured correctly.', 'media-cloud-sync')
414 + ];
415 + return new WP_REST_Response( $result, 200 );
416 + }
417 + $status = Sync::instance()->start($action);
308 418
309 - $status = Sync::instance()->start($action);
419 + // Sync::start() passes a job's own precondition-failure array straight through
420 + // (e.g. no destination configured) instead of masking it as a started status.
421 + if (is_array($status) && isset($status['success']) && $status['success'] === false) {
422 + return new WP_REST_Response( $status, 200 );
423 + }
310 424
311 425 $result = [
312 426 'success' => true,
313 427 'status' => $status,
@@ -322,9 +436,9 @@
322 436 * @since 1.2.13
323 437 */
324 438 public function pauseSync( $data ) {
325 439 $action = isset($data->get_params()['action']) ? $data->get_params()['action'] : '';
326 - if(empty($action)) {
440 + if ( ! Sync::instance()->get_class_by_action( $action ) ) {
327 441 $result = [
328 442 'success' => false,
329 443 'message' => esc_html__('Invalid action', 'media-cloud-sync')
330 444 ];
@@ -329,9 +443,8 @@
329 443 'message' => esc_html__('Invalid action', 'media-cloud-sync')
330 444 ];
331 445 return new WP_REST_Response( $result, 200 );
332 446 }
333 -
334 447 $status = Sync::instance()->pause($action);
335 448
336 449 $result = [
337 450 'success' => true,
@@ -342,14 +455,46 @@
342 455 }
343 456
344 457
345 458 /**
459 + * Save the sync method ('ajax'|'cron'|'mixed') preference for a sync type.
460 + * @since 1.3.13
461 + */
462 + public function setSyncMethod( $data ) {
463 + $params = $data->get_params();
464 + $action = isset($params['action']) ? sanitize_text_field($params['action']) : '';
465 + $method = isset($params['sync_method']) ? sanitize_text_field($params['sync_method']) : '';
466 +
467 + if ( ! Sync::instance()->get_class_by_action( $action ) ) {
468 + return new WP_REST_Response( [
469 + 'success' => false,
470 + 'message' => esc_html__('Invalid action', 'media-cloud-sync')
471 + ], 200 );
472 + }
473 +
474 + $saved = Sync::instance()->set_sync_method($action, $method);
475 + if(!$saved) {
476 + return new WP_REST_Response( [
477 + 'success' => false,
478 + 'message' => esc_html__('Invalid sync method', 'media-cloud-sync')
479 + ], 200 );
480 + }
481 +
482 + $result = [
483 + 'success' => true,
484 + 'sync_method' => $method,
485 + 'status' => Sync::instance()->get_class_by_action($action)->get_status(),
486 + ];
487 + return new WP_REST_Response( $result, 200 );
488 + }
489 +
490 + /**
346 491 * Resume Sync
347 492 * @since 1.2.13
348 493 */
349 494 public function resumeSync( $data ) {
350 495 $action = isset($data->get_params()['action']) ? $data->get_params()['action'] : '';
351 - if(empty($action)) {
496 + if ( ! Sync::instance()->get_class_by_action( $action ) ) {
352 497 $result = [
353 498 'success' => false,
354 499 'message' => esc_html__('Invalid action', 'media-cloud-sync')
355 500 ];
@@ -354,9 +499,8 @@
354 499 'message' => esc_html__('Invalid action', 'media-cloud-sync')
355 500 ];
356 501 return new WP_REST_Response( $result, 200 );
357 502 }
358 -
359 503 $status = Sync::instance()->resume($action);
360 504
361 505 $result = [
362 506 'success' => true,
@@ -372,9 +516,9 @@
372 516 * @since 1.2.13
373 517 */
374 518 public function stopSync( $data ) {
375 519 $action = isset($data->get_params()['action']) ? $data->get_params()['action'] : '';
376 - if(empty($action)) {
520 + if ( ! Sync::instance()->get_class_by_action( $action ) ) {
377 521 $result = [
378 522 'success' => false,
379 523 'message' => esc_html__('Invalid action', 'media-cloud-sync')
380 524 ];
@@ -379,9 +523,8 @@
379 523 'message' => esc_html__('Invalid action', 'media-cloud-sync')
380 524 ];
381 525 return new WP_REST_Response( $result, 200 );
382 526 }
383 -
384 527 $status = Sync::instance()->stop($action);
385 528
386 529 $result = [
387 530 'success' => true,
@@ -396,8 +539,67 @@
396 539 }
397 540
398 541
399 542 /**
543 + * Tick Sync — process a small batch synchronously, driving Ajax/Mixed sync mode.
544 + * @since 1.3.13
545 + */
546 + public function tickSync( $data ) {
547 + $params = $data->get_params();
548 + $action = isset($params['action']) ? $params['action'] : '';
549 +
550 + if ( ! Sync::instance()->get_class_by_action( $action ) ) {
551 + $result = [
552 + 'success' => false,
553 + 'message' => esc_html__('Invalid action', 'media-cloud-sync')
554 + ];
555 + return new WP_REST_Response( $result, 200 );
556 + }
557 +
558 + // Defense in depth — the frontend should never call this in free/unlicensed mode, but
559 + // the endpoint must not trust that, and must not silently no-op: an unlicensed call
560 + // needs a clear rejection so the frontend's tick loop stops instead of retrying forever.
561 + if ( ! Utils::is_pro_licensed() ) {
562 + $result = [
563 + 'success' => false,
564 + 'message' => esc_html__('Ajax sync requires an active Pro license', 'media-cloud-sync')
565 + ];
566 + return new WP_REST_Response( $result, 200 );
567 + }
568 +
569 + // Clamp regardless of what the frontend sends — the endpoint itself must enforce the
570 + // ceiling, since a batch of slow uploads processed sequentially in one request risks
571 + // exceeding reverse-proxy/webserver timeouts that process_iterations() can't see.
572 + $batch = isset($params['batch']) ? (int) $params['batch'] : 5;
573 + $batch = min(10, max(1, $batch));
574 +
575 + $status = Sync::instance()->tick($action, $batch);
576 +
577 + $result = [
578 + 'success' => true,
579 + 'status' => $status,
580 + 'message' => esc_html__('Sync ticked successfully', 'media-cloud-sync')
581 + ];
582 +
583 + // Deliberately omitted on every tick (this endpoint may be hit ~once/second while a
584 + // sync runs, and Counter::get_count() is a real query) — but the Dashboard's own
585 + // Statistics widget reads a *different* redux slice (common.counts) than the Sync
586 + // screen's progress (sync[action]), only refreshed via the slower ~2-3s useSyncPolling
587 + // cadence. That's an acceptable few-seconds lag while a sync is actively running, but
588 + // right when it finishes it becomes a visibly wrong, stuck-looking number on the
589 + // Dashboard until the next poll happens to catch up. Only pay for the query at that
590 + // one transition, not on every tick.
591 + if ( isset( $status['status'] ) && $status['status'] !== 'running' ) {
592 + $result['counts'] = [
593 + 'all' => Counter::get_count(),
594 + 'categorized' => $this->getSortedMediaCounts()
595 + ];
596 + }
597 + return new WP_REST_Response( $result, 200 );
598 + }
599 +
600 +
601 + /**
400 602 * Retry a Media Sync Error
401 603 */
402 604 public function retrySingle( $data ) {
403 605 $params = $data->get_params();
@@ -411,21 +613,27 @@
411 613 'message' => esc_html__('Invalid parameters', 'media-cloud-sync')
412 614 ];
413 615 return new WP_REST_Response( $result, 200 );
414 616 }
415 -
416 - switch($type) {
417 - case 'sync_to_cloud':
418 - $handler = Integration::instance()->get_handler_class($source_type);
419 - if ($handler) {
420 - $handler::instance()->update_attachment_metadata( false, $id );
421 - }
422 - break;
423 - default:
424 - $status = false;
617 + // Retry Sync
618 + $handler = Sync::instance()->get_class_by_action($type);
619 + if(!$handler) {
620 + $result = [
621 + 'success' => false,
622 + 'message' => esc_html__('Invalid action', 'media-cloud-sync')
623 + ];
624 + return new WP_REST_Response( $result, 200 );
425 625 }
626 + if(!method_exists($handler, 'retry_single')) {
627 + $result = [
628 + 'success' => false,
629 + 'message' => esc_html__('Retry is not available for this sync type.', 'media-cloud-sync')
630 + ];
631 + return new WP_REST_Response( $result, 200 );
632 + }
633 + $handler->retry_single($id, $source_type);
426 634
427 - $status = !Logger::instance()->get_log($type, $id, $source_type);
635 + $status = Utils::is_empty(Logger::instance()->get_log($type, $id, $source_type)) ? true : false;
428 636
429 637 $result = [
430 638 'success' => $status,
431 639 'message' => $status ? esc_html__('Media synced successfully', 'media-cloud-sync') : esc_html__('Media sync failed', 'media-cloud-sync')
@@ -448,9 +656,9 @@
448 656 $prefixes = array_keys($source_labels);
449 657 foreach($detailed_counts as $source_type => $counts) {
450 658 $found_prefix = false;
451 659 foreach($prefixes as $prefix) {
452 - $found_prefix = strpos($source_type, $prefix) === 0 ? $prefix : false;;
660 + $found_prefix = strpos($source_type, $prefix) === 0 ? $prefix : false;
453 661 if($found_prefix !== false) break;
454 662 }
455 663
456 664 if($found_prefix !== false) {
@@ -455,13 +663,13 @@
455 663
456 664 if($found_prefix !== false) {
457 665 $sorted_counts[$found_prefix] = [
458 666 'label' => $source_labels[$found_prefix],
459 - 'uploaded' => isset($sorted_counts[$found_prefix]['data']['uploaded'])
460 - ? $sorted_counts[$found_prefix]['data']['uploaded'] + $counts['uploaded']
667 + 'uploaded' => isset( $sorted_counts[ $found_prefix ]['uploaded'] )
668 + ? $sorted_counts[ $found_prefix ]['uploaded'] + $counts['uploaded']
461 669 : $counts['uploaded'],
462 - 'total' => isset($sorted_counts[$found_prefix]['data']['total'])
463 - ? $sorted_counts[$found_prefix]['data']['total'] + $counts['total']
670 + 'total' => isset( $sorted_counts[ $found_prefix ]['total'] )
671 + ? $sorted_counts[ $found_prefix ]['total'] + $counts['total']
464 672 : $counts['total']
465 673 ];
466 674 }
467 675 }
@@ -469,19 +677,8 @@
469 677 }
470 678
471 679 return $sorted_counts;
472 680 }
473 -
474 -
475 - /**
476 - * Add Custom Mime Type JSON
477 - * @since 1.0.0
478 - */
479 - public function add_custom_mime_type_json($mimes) {
480 - $mimes['json'] = 'application/json';
481 - // Return the array back to the function with our added mime type.
482 - return $mimes;
483 - }
484 681
485 682
486 683 /**
487 684 * Helper function to create Adding Route