PluginProbe
Optimole – Optimize Images | Convert WebP & AVIF | CDN & Lazy Load | Image Optimization / 3.11.2
Optimole – Optimize Images | Convert WebP & AVIF | CDN & Lazy Load | Image Optimization v3.11.2
4.2.13 4.2.12 4.2.11 4.2.10 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 2.5.5 2.5.6 2.5.7 3.0.0 3.0.1 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.11.0 3.11.1 3.11.2 3.11.3 3.12.0 3.12.1 All 134 releases
optimole-wp / inc / rest.php

rest.php in Optimole – Optimize Images | Convert WebP & AVIF | CDN & Lazy Load | Image Optimization 3.11.2, at inc/rest.php

871 lines 23.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Optimole Rest related actions.
4 *
5 * @package Optimole/Inc
6 * @copyright Copyright (c) 2017, Marius Cristea
7 * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
8 */
9
10 /**
11 * Class Optml_Rest
12 *
13 * @codeCoverageIgnore
14 */
15 class Optml_Rest {
16
17 /**
18 * Rest api namespace.
19 *
20 * @var string Namespace.
21 */
22 private $namespace;
23
24 /**
25 * Upload conflicts api.
26 *
27 * @var array upload_conflicts_api.
28 */
29 public static $rest_routes = [
30 'service_routes' => ['update_option' => 'POST', 'request_update' => 'GET', 'check_redirects' => 'POST_PUT_PATCH',
31 'connect' => [ 'POST', 'args' => [
32 'api_key' => [
33 'type' => 'string',
34 'required' => true,
35 ],
36 ],
37 ],
38 'select_application' => [ 'POST', 'args' => [
39 'api_key' => [
40 'type' => 'string',
41 'required' => true,
42 ],
43 'application' => [
44 'type' => 'string',
45 'required' => true,
46 ],
47 ],
48 ],
49 'register_service' => [ 'POST', 'args' => [
50 'email' => [
51 'type' => 'string',
52 'required' => true,
53 ],
54 ],
55
56 ],
57 'disconnect' => 'GET',
58 ],
59 'image_routes' => [
60 'poll_optimized_images' => 'GET',
61 'get_sample_rate' => 'POST',
62 'upload_onboard_images' => [ 'POST', 'args' => [
63 'offset' => [
64 'type' => 'number',
65 'required' => false,
66 'default' => 0,
67 ],
68 ],
69 ],
70 ],
71 'media_cloud_routes' => [
72 'number_of_images_and_pages' => 'POST',
73 'get_offload_conflicts' => 'GET',
74 ],
75 'watermark_routes' => [
76 'poll_watermarks' => 'GET',
77 'add_watermark' => 'POST',
78 'remove_watermark' => 'POST',
79 ],
80 'conflict_routes' => [
81 'poll_conflicts' => 'GET',
82 'dismiss_conflict' => 'POST',
83 ],
84 'cache_routes' => [
85 'clear_cache_request' => 'POST',
86 ],
87 'dam_routes' => [
88 'insert_images' => [
89 'POST',
90 'args' => [
91 'images' => [
92 'type' => 'array',
93 'required' => true,
94 ],
95 ],
96 'permission_callback' => 'upload_files',
97 ],
98 ],
99 ];
100
101 /**
102 * Optml_Rest constructor.
103 */
104 public function __construct() {
105 $this->namespace = OPTML_NAMESPACE . '/v1';
106
107 add_action( 'rest_api_init', [ $this, 'register' ] );
108 }
109
110 /**
111 * Method to register a specific rest route.
112 *
113 * @param string $route The route name.
114 * @param string $method The route access method GET, POST, POST_PUT_PATCH.
115 * @param array $args Optional argument to include required args.
116 * @param string $permission_callback Optional permission callback.
117 */
118 private function reqister_route( $route, $method = 'GET', $args = [], $permission_callback = 'manage_options' ) {
119 $wp_method_constant = false;
120 if ( $method === 'GET' ) {
121 $wp_method_constant = \WP_REST_Server::READABLE;
122 }
123 if ( $method === 'POST' ) {
124 $wp_method_constant = \WP_REST_Server::CREATABLE;
125 }
126 if ( $method === 'POST_PUT_PATCH' ) {
127 $wp_method_constant = \WP_REST_Server::EDITABLE;
128 }
129 if ( $wp_method_constant !== false ) {
130 $params = [
131 'methods' => $wp_method_constant,
132 'permission_callback' => function () use ( $permission_callback ) {
133 return current_user_can( $permission_callback );
134 },
135 'callback' => [ $this, $route ],
136 ];
137 if ( ! empty( $args ) ) {
138 $params['args'] = $args;
139 }
140 register_rest_route(
141 $this->namespace,
142 '/' . $route,
143 [
144 $params,
145 ]
146 );
147 }
148
149 }
150
151 /**
152 * Register rest routes.
153 */
154 public function register() {
155
156 $this->register_service_routes();
157
158 $this->register_image_routes();
159 $this->register_watermark_routes();
160 $this->register_conflict_routes();
161 $this->register_cache_routes();
162 $this->register_media_offload_routes();
163 $this->register_dam_routes();
164 }
165
166 /**
167 * Method to register service specific routes.
168 */
169 public function register_service_routes() {
170 foreach ( self::$rest_routes['service_routes'] as $route => $details ) {
171 if ( is_array( $details ) ) {
172 $this->reqister_route( $route, $details[0], $details['args'] );
173 } else {
174 $this->reqister_route( $route, $details );
175 }
176 }
177 }
178
179 /**
180 * Method to register image specific routes.
181 */
182 public function register_image_routes() {
183 foreach ( self::$rest_routes['image_routes'] as $route => $details ) {
184 if ( is_array( $details ) ) {
185 $this->reqister_route( $route, $details[0], $details['args'] );
186 } else {
187 $this->reqister_route( $route, $details );
188 }
189 }
190
191 }
192 /**
193 * Method to register media offload specific routes.
194 */
195 public function register_media_offload_routes() {
196 foreach ( self::$rest_routes['media_cloud_routes'] as $route => $details ) {
197 $this->reqister_route( $route, $details );
198 }
199 }
200
201 /**
202 * Method to register watermark specific routes.
203 */
204 public function register_watermark_routes() {
205 foreach ( self::$rest_routes['watermark_routes'] as $route => $details ) {
206 $this->reqister_route( $route, $details );
207 }
208 }
209
210 /**
211 * Method to register conflicts specific routes.
212 */
213 public function register_conflict_routes() {
214 foreach ( self::$rest_routes['conflict_routes'] as $route => $details ) {
215 $this->reqister_route( $route, $details );
216 }
217 }
218
219 /**
220 * Method to register cache specific routes.
221 */
222 public function register_cache_routes() {
223 foreach ( self::$rest_routes['cache_routes'] as $route => $details ) {
224 $this->reqister_route( $route, $details );
225 }
226 }
227
228 /**
229 * Register DAM routes.
230 *
231 * @return void
232 */
233 public function register_dam_routes() {
234 foreach ( self::$rest_routes['dam_routes'] as $route => $details ) {
235 $permission = isset( $details['permission_callback'] ) ? $details['permission_callback'] : 'manage_options';
236 $args = isset( $details['args'] ) ? $details['args'] : [];
237 $this->reqister_route( $route, $details[0], $args, $permission );
238 }
239 }
240
241 /**
242 * Clear Cache request.
243 *
244 * @param WP_REST_Request $request clear cache rest request.
245 *
246 * @return WP_Error|WP_REST_Response
247 */
248 public function clear_cache_request( WP_REST_Request $request ) {
249 $settings = new Optml_Settings();
250 $type = $request->get_param( 'type' );
251 $response = $settings->clear_cache( $type );
252
253 if ( is_wp_error( $response ) ) {
254 wp_send_json_error( $response->get_error_message() );
255 }
256
257 return $this->response( $response, '200' );
258 }
259
260 /**
261 * Connect to optimole service.
262 *
263 * @param WP_REST_Request $request connect rest request.
264 *
265 * @return WP_Error|WP_REST_Response
266 */
267 public function connect( WP_REST_Request $request ) {
268 $api_key = $request->get_param( 'api_key' );
269 $original_request = $request;
270 $request = new Optml_Api();
271 $data = $request->connect( $api_key );
272
273 if ( $data === false || is_wp_error( $data ) ) {
274 $extra = '';
275 if ( is_wp_error( $data ) ) {
276 /**
277 * Error from api.
278 *
279 * @var WP_Error $data Error object.
280 */
281 $extra = sprintf( __( '. ERROR details: %s', 'optimole-wp' ), $data->get_error_message() );
282 }
283 return $this->response( __( 'Can not connect to Optimole service', 'optimole-wp' ) . $extra, 400 );
284 }
285 $settings = new Optml_Settings();
286 $settings->update( 'api_key', $api_key );
287
288 if ( isset( $data['extra_visits'] ) ) {
289 $settings->update_frontend_banner_from_remote( $data['extra_visits'] );
290 }
291
292 if ( $data['app_count'] === 1 ) {
293 return $this->select_application( $original_request );
294 }
295 return $this->response( $data );
296 }
297
298 /**
299 * Select application.
300 *
301 * @param WP_REST_Request $request Rest request.
302 *
303 * @return WP_REST_Response
304 */
305 public function select_application( WP_REST_Request $request ) {
306 $api_key = $request->get_param( 'api_key' );
307 $application = $request->get_param( 'application' );
308 $request = new Optml_Api();
309 $data = $request->get_user_data( $api_key, $application );
310 if ( $data === false || is_wp_error( $data ) ) {
311 $extra = '';
312 if ( is_wp_error( $data ) ) {
313 /**
314 * Error from api.
315 *
316 * @var WP_Error $data Error object.
317 */
318 $extra = sprintf( __( '. ERROR details: %s', 'optimole-wp' ), $data->get_error_message() );
319 }
320 wp_send_json_error( __( 'Can not connect to Optimole service', 'optimole-wp' ) . $extra );
321 }
322 $settings = new Optml_Settings();
323 $settings->update( 'service_data', $data );
324 return $this->response( $data );
325 }
326
327 /**
328 * Wrapper for api response.
329 *
330 * @param mixed $data data from api.
331 *
332 * @return WP_REST_Response
333 */
334 private function response( $data, $code = 'success' ) {
335 return new WP_REST_Response( [ 'data' => $data, 'code' => $code ], 200 );
336 }
337
338 /**
339 * Connect to optimole service.
340 *
341 * @param WP_REST_Request $request connect rest request.
342 *
343 * @return WP_Error|WP_REST_Response
344 */
345 public function register_service( WP_REST_Request $request ) {
346 $email = $request->get_param( 'email' );
347 $api = new Optml_Api();
348
349 $user = $api->create_account( $email );
350
351 $auto_connect = $request->get_param( 'auto_connect' );
352
353 if ( ! empty( $auto_connect ) && $auto_connect === 'true' ) {
354 delete_option( Optml_Settings::OPTML_USER_EMAIL );
355 }
356
357 if ( $user === false || is_wp_error( $user ) ) {
358 return new WP_REST_Response(
359 [
360 'data' => null,
361 'message' => __( 'Error creating account.', 'optimole-wp' ),
362 'code' => 'error',
363 ],
364 200
365 );
366 }
367 if ( $user === 'email_registered' ) {
368 return new WP_REST_Response(
369 [
370 'data' => null,
371 'message' => __( 'Error: This email is already registered. Please choose another one.', 'optimole-wp' ),
372 'code' => 'email_registered',
373 ],
374 200
375 );
376
377 }
378
379 if ( $user === 'site_exists' ) {
380 return new WP_REST_Response(
381 [
382 'data' => null,
383 'message' => sprintf( __( 'Error: This site has been previously registered. You can login to your account from %1$shere%2$s ', 'optimole-wp' ), '<a href="https://dashboard.optimole.com/login" target="_blank"> ', '</a>' ),
384 'code' => 'site_exists',
385 ],
386 200
387 );
388 }
389
390 $user_data = $user['res'];
391
392 $settings = new Optml_Settings();
393 $settings->update( 'api_key', $user_data['api_key'] );
394
395 if ( $user_data['app_count'] === 1 ) {
396 $settings->update( 'service_data', $user_data );
397 }
398
399 if ( isset( $user_data['extra_visits'] ) ) {
400 $settings->update_frontend_banner_from_remote( $user_data['extra_visits'] );
401 }
402
403 return $this->response( $user_data );
404 }
405
406 /**
407 * Return image samples.
408 *
409 * @param WP_REST_Request $request Rest request.
410 *
411 * @return WP_REST_Response Image urls.
412 */
413 public function get_sample_rate( WP_REST_Request $request ) {
414
415 add_filter( 'optml_dont_replace_url', '__return_true' );
416 $image_sample = get_transient( 'optimole_sample_image' );
417 if ( $image_sample === false || $request->get_param( 'force' ) === 'yes' ) {
418 $image_sample = $this->fetch_sample_image();
419 set_transient( 'optimole_sample_image', $image_sample );
420 }
421 $image = [ 'id' => $image_sample['id'] ];
422
423 $image['original'] = $image_sample['url'];
424
425 remove_filter( 'optml_dont_replace_url', '__return_true' );
426
427 $image['optimized'] = apply_filters(
428 'optml_replace_image',
429 $image['original'],
430 [
431 'width' => $image_sample['width'],
432 'height' => $image_sample['height'],
433 'quality' => $request->get_param( 'quality' ),
434 ]
435 );
436
437 $optimized = wp_remote_get(
438 $image['optimized'],
439 [
440 'timeout' => 10,
441 'headers' => [
442 'Accept' => 'text/html,application/xhtml+xml,image/webp,image/apng ',
443 ],
444 ]
445 );
446
447 $original = wp_remote_get( $image['original'] );
448
449 $image['optimized_size'] = (int) wp_remote_retrieve_header( $optimized, 'content-length' );
450 $image['original_size'] = (int) wp_remote_retrieve_header( $original, 'content-length' );
451
452 return $this->response( $image );
453 }
454
455 /**
456 * Crawl & upload initial load.
457 *
458 * @return WP_REST_Response If there are more posts left to receive.
459 */
460 public function upload_onboard_images( WP_REST_Request $request ) {
461 $offset = absint( $request->get_param( 'offset' ) );
462
463 // Arguments for get_posts function
464 $args = [
465 'post_type' => 'attachment',
466 'post_mime_type' => 'image',
467 'post_status' => 'inherit',
468 'posts_per_page' => 100,
469 'offset' => $offset,
470 'fields' => 'ids',
471 'no_found_rows' => true,
472 'update_post_meta_cache' => false,
473 'update_post_term_cache' => false,
474 'orderby' => [
475 'parent' => 'DESC',
476 ],
477 ];
478
479 // Initialize an array to store the image URLs
480 $image_urls = [];
481
482 add_filter( 'optml_dont_replace_url', '__return_true' );
483
484 // If site has a logo, get the logo url if offset is 0, ie first request
485 if ( $offset === 0 ) {
486 $custom_logo_id = get_theme_mod( 'custom_logo' );
487
488 if ( $custom_logo_id ) {
489 $image_urls[] = wp_get_attachment_url( $custom_logo_id );
490 }
491 }
492
493 $query = new \WP_Query( $args );
494
495 if ( $query->have_posts() ) {
496 $image_ids = $query->get_posts();
497 $image_urls = array_map( 'wp_get_attachment_url', $image_ids );
498 }
499 remove_filter( 'optml_dont_replace_url', '__return_true' );
500
501 if ( count( $image_urls ) === 0 ) {
502 return $this->response( true );
503 }
504
505 $api = new Optml_Api();
506 $api->call_onboard_api( $image_urls );
507
508 // Check if image_url array has at least 100 items, if not, we have reached the end of the images
509 return $this->response( count( $image_urls ) < 100 ? true : false );
510 }
511
512 /**
513 * Return sample image data.
514 *
515 * @return array Image data.
516 */
517 private function fetch_sample_image() {
518 $accepted_mimes = [ 'image/jpeg' ];
519 $args = [
520 'post_type' => 'attachment',
521 'post_status' => 'any',
522 'number' => '5',
523 'no_found_rows' => true,
524 'fields' => 'ids',
525 'post_mime_type' => $accepted_mimes,
526 'post_parent__not_in' => [ 0 ],
527 ];
528 $image_result = new WP_Query( $args );
529 if ( empty( $image_result->posts ) ) {
530 $rand_id = rand( 1, 3 );
531 $original_image_url = OPTML_URL . 'assets/img/' . $rand_id . '.jpg';
532
533 return [
534 'url' => $original_image_url,
535 'width' => '700',
536 'height' => '465',
537 'id' => - 1,
538 ];
539 }
540 $attachment_id = $image_result->posts[ array_rand( $image_result->posts, 1 ) ];
541
542 $original_image_url = wp_get_attachment_image_url( $attachment_id, 'full' );
543
544 $metadata = wp_get_attachment_metadata( $attachment_id );
545
546 $width = 'auto';
547 $height = 'auto';
548 $size = 'full';
549 if ( isset( $metadata['sizes'] ) && isset( $metadata['sizes'][ $size ] ) ) {
550 $width = $metadata['sizes'][ $size ]['width'];
551 $height = $metadata['sizes'][ $size ]['height'];
552 }
553
554 return [
555 'url' => $original_image_url,
556 'id' => $attachment_id,
557 'width' => $width,
558 'height' => $height,
559 ];
560 }
561
562 /**
563 * Disconnect from optimole service.
564 *
565 * @SuppressWarnings(PHPMD.UnusedFormalParameter)
566 * @param WP_REST_Request $request disconnect rest request.
567 */
568 public function disconnect( WP_REST_Request $request ) {
569 $settings = new Optml_Settings();
570 $settings->reset();
571 wp_send_json_success( 'Disconnected' );
572 }
573
574 /**
575 * Get optimized images from API.
576 *
577 * @param WP_REST_Request $request rest request.
578 *
579 * @return WP_REST_Response
580 */
581 public function poll_optimized_images( WP_REST_Request $request ) {
582 $api_key = $request->get_param( 'api_key' );
583 $request = new Optml_Api();
584 $images = $request->get_optimized_images( $api_key );
585 if ( ! isset( $images['list'] ) || empty( $images['list'] ) ) {
586 return $this->response( [] );
587 }
588
589 $final_images = array_splice( $images['list'], 0, 10 );
590
591 foreach ( $final_images as $index => $value ) {
592 $final_images[ $index ]['url'] = Optml_Media_Offload::instance()->get_media_optimized_url(
593 $value['url'],
594 $value['key'],
595 140,
596 140,
597 [
598 'type' => Optml_Resize::RESIZE_FILL,
599 'enlarge' => false,
600 'gravity' => Optml_Resize::GRAVITY_CENTER,
601 ]
602 );
603 unset( $final_images[ $index ]['key'] );
604 }
605
606 return $this->response( $final_images );
607 }
608
609 /**
610 * Get watermarks from API.
611 *
612 * @param WP_REST_Request $request rest request.
613 *
614 * @return WP_REST_Response
615 */
616 public function poll_watermarks( WP_REST_Request $request ) {
617 $api_key = $request->get_param( 'api_key' );
618 $request = new Optml_Api();
619 $watermarks = $request->get_watermarks( $api_key );
620 if ( ! isset( $watermarks['watermarks'] ) || empty( $watermarks['watermarks'] ) ) {
621 return $this->response( [] );
622 }
623 $final_images = array_splice( $watermarks['watermarks'], 0, 10 );
624
625 return $this->response( $final_images );
626 }
627
628 /**
629 * Add watermark.
630 *
631 * @param WP_REST_Request $request rest request.
632 *
633 * @return WP_REST_Response
634 */
635 public function add_watermark( WP_REST_Request $request ) {
636 $file = $request->get_file_params();
637 $request = new Optml_Api();
638 $response = $request->add_watermark( $file );
639 if ( $response === false ) {
640 return $this->response( __( 'Error uploading image. Please try again.', 'optimole-wp' ), 'error' );
641 }
642
643 return $this->response( __( 'Watermark image uploaded succesfully ! ', 'optimole-wp' ) );
644 }
645
646 /**
647 * Remove watermark.
648 *
649 * @param WP_REST_Request $request rest request.
650 *
651 * @return WP_REST_Response
652 */
653 public function remove_watermark( WP_REST_Request $request ) {
654 $post_id = $request->get_param( 'postID' );
655 $api_key = $request->get_param( 'api_key' );
656 $request = new Optml_Api();
657
658 return $this->response( $request->remove_watermark( $post_id, $api_key ) );
659 }
660
661 /**
662 * Get conflicts from API.
663 *
664 * @param WP_REST_Request $request rest request.
665 *
666 * @return WP_REST_Response
667 */
668 public function poll_conflicts( WP_REST_Request $request ) {
669 $conflicts_to_register = apply_filters( 'optml_register_conflicts', [] );
670 $manager = new Optml_Conflict_Manager( $conflicts_to_register );
671
672 return $this->response(
673 [
674 'count' => $manager->get_conflict_count(),
675 'conflicts' => $manager->get_conflict_list(),
676 ]
677 );
678 }
679
680 /**
681 * Dismiss conflict.
682 *
683 * @param WP_REST_Request $request rest request.
684 *
685 * @return WP_REST_Response
686 */
687 public function dismiss_conflict( WP_REST_Request $request ) {
688 $conflict_id = $request->get_param( 'conflictID' );
689 $conflicts_to_register = apply_filters( 'optml_register_conflicts', [] );
690 $manager = new Optml_Conflict_Manager( $conflicts_to_register );
691 $manager->dismiss_conflict( $conflict_id );
692
693 return $this->response(
694 [
695 'count' => $manager->get_conflict_count(),
696 'conflicts' => $manager->get_conflict_list(),
697 ]
698 );
699 }
700
701 /**
702 * Request stats update for app.
703 *
704 * @param WP_REST_Request $request rest request.
705 *
706 * @return WP_REST_Response
707 */
708 public function request_update( WP_REST_Request $request ) {
709 do_action( 'optml_daily_sync' );
710 $settings = new Optml_Settings();
711 $service_data = $settings->get( 'service_data' );
712 if ( empty( $service_data ) ) {
713 return $this->response( '', 'disconnected' );
714 }
715 return $this->response( $service_data );
716 }
717
718 /**
719 * Update options method.
720 *
721 * @param WP_REST_Request $request option update rest request.
722 *
723 * @return WP_REST_Response
724 */
725 public function update_option( WP_REST_Request $request ) {
726 $new_settings = $request->get_param( 'settings' );
727
728 if ( empty( $new_settings ) ) {
729 wp_send_json_error( 'No option key set.' );
730 }
731
732 $settings = new Optml_Settings();
733 $sanitized = $settings->parse_settings( $new_settings );
734
735 return $this->response( $sanitized );
736 }
737
738 /**
739 * Update options method.
740 *
741 * @param WP_REST_Request $request option update rest request.
742 *
743 * @return WP_REST_Response
744 */
745 public function check_redirects( WP_REST_Request $request ) {
746 if ( empty( $request->get_param( 'images' ) ) ) {
747 return $this->response( __( 'No images available on the current page.' ), 'noImagesFound' );
748 }
749 // 'ok' if no issues found, 'log' is there are issues we need to notify, 'deactivated' if the user's account is disabled
750 $status = 'ok';
751 $result = '';
752 foreach ( $request->get_param( 'images' ) as $domain => $value ) {
753 $args = [
754 'method' => 'GET',
755 'redirection' => 0,
756 ];
757 $processed_images = 0;
758 if ( isset( $value['src'] ) ) {
759 $processed_images = count( $value['src'] );
760 }
761 if ( isset( $value['ignoredUrls'] ) && $value['ignoredUrls'] > $processed_images ) {
762 $result .= '<li>❌ ' . sprintf( __( 'The images from: %1$s are not optimized by Optimole. If you would like to do so, you can follow this: %2$sWhy Optimole does not optimize all the images from my site?%3$s.', 'optimole-wp' ), $domain, '<a target="_blank" href="https://docs.optimole.com/article/1290-how-to-optimize-images-using-optimole-from-my-domain">', '</a>' ) . '</li>';
763 $status = 'log';
764 continue;
765 }
766
767 if ( $processed_images > 0 ) {
768 $response = wp_remote_get( $value['src'][ rand( 0, $processed_images - 1 ) ], $args );
769 if ( ! is_wp_error( $response ) && is_array( $response ) ) {
770 $headers = $response['headers']; // array of http header lines
771 $status_code = $response['response']['code'];
772 if ( $status_code === 301 ) {
773 $status = 'deactivated';
774 $result = '<li>❌ ' . sprintf( __( 'Your account is currently disabled due to exceeding quota and Optimole is no longer able to optimize the images. In order to fix this you will need to %1$supgrade%2$s.', 'optimole-wp' ), '<a target="_blank" href="https://optimole.com/pricing">', '</a>' ) . '</li>';
775 break;
776 }
777 if ( $status_code === 302 ) {
778 if ( isset( $headers['x-redirect-o'] ) ) {
779 $optimole_code = (int) $headers['x-redirect-o'];
780 if ( $optimole_code === 1 ) {
781 $status = 'log';
782 $result .= '<li>❌ ' . sprintf( __( 'The domain: %1$s is not allowed to optimize images using your Optimole account. You can add this to the allowed list %2$shere%3$s.', 'optimole-wp' ), '<b>' . $domain . '</b>', '<a target="_blank" href="https://dashboard.optimole.com/whitelist">', '</a>' ) . '</li>';
783 }
784 if ( $optimole_code === 4 ) {
785 $status = 'log';
786 $result .= '<li>❌ ' . sprintf( __( 'We are not able to download the images from %1$s. Please check %2$sthis%3$s document for a more advanced guide on how to solve this. ', 'optimole-wp' ), '<b>' . $domain . '</b>', '<a target="_blank" href="https://docs.optimole.com/article/1291-why-optimole-is-not-able-to-download-the-images-from-my-site">', '</a>' ) . '<br />' . '</li>';
787 }
788 }
789 }
790 }
791 }
792 }
793 if ( $result === '' ) {
794 $result = __( 'No issues detected, everything is running smoothly.', 'optimole-wp' );
795 }
796
797 return $this->response( '<ul>' . $result . '</ul>', $status );
798 }
799
800 /**
801 * Get total number of images.
802 *
803 * @param WP_REST_Request $request rest request object.
804 *
805 * @return WP_REST_Response
806 */
807 public function number_of_images_and_pages( WP_REST_Request $request ) {
808 $action = 'offload_images';
809 $refresh = false;
810 $images = [];
811
812 if ( ! empty( $request->get_param( 'action' ) ) ) {
813 $action = $request->get_param( 'action' );
814 }
815
816 if ( ! empty( $request->get_param( 'refresh' ) ) ) {
817 $refresh = $request->get_param( 'refresh' );
818 }
819
820 if ( ! empty( $request->get_param( 'images' ) ) ) {
821 $images = $request->get_param( 'images' );
822 }
823
824 return $this->response( Optml_Media_Offload::get_image_count( $action, $refresh, $images ) );
825 }
826
827 /**
828 * Get conflicts list.
829 *
830 * @param WP_REST_Request $request rest request object.
831 *
832 * @return WP_REST_Response
833 */
834 public function get_offload_conflicts( WP_REST_Request $request ) {
835 $request = new Optml_Api();
836 $decoded_list = $request->get_offload_conflicts();
837 $active_conflicts = [];
838 if ( isset( $decoded_list['plugins'] ) ) {
839 foreach ( $decoded_list['plugins'] as $slug ) {
840 if ( is_plugin_active( $slug ) ) {
841 $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $slug );
842 if ( ! empty( $plugin_data['Name'] ) ) {
843 $active_conflicts[] = $plugin_data['Name'];
844 }
845 }
846 }
847 }
848
849 return $this->response( $active_conflicts );
850 }
851
852 /**
853 * Insert images request.
854 *
855 * @param WP_REST_Request $request insert images rest request.
856 *
857 * @return WP_REST_Response
858 */
859 public function insert_images( WP_REST_Request $request ) {
860 $images = $request->get_param( 'images' );
861
862 if ( ! is_array( $images ) || empty( $images ) ) {
863 return $this->response( [ 'error' => 'No images found' ] );
864 }
865
866 $insert = Optml_Main::instance()->dam->insert_attachments( $images );
867
868 return $this->response( $insert );
869 }
870 }
871