File "class-cdn-controller.php"
Full Path: /home/digimqhe/flashdigi.uk/wp-smushit/core/cdn/class-cdn-controller.php
File size: 5.05 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace Smush\Core\CDN;
use Smush\Core\Controller;
use Smush\Core\Cron_Controller;
use Smush\Core\Helper;
use Smush\Core\Settings;
use WP_Error;
use WP_Smush;
class CDN_Controller extends Controller {
const CDN_TRANSFORM_PRIORITY = 10;
/**
* @var CDN_Helper
*/
private $cdn_helper;
/**
* @var Settings|null
*/
private $settings;
/**
* Static instance
*
* @var self
*/
private static $instance;
public function __construct() {
$this->cdn_helper = CDN_Helper::get_instance();
$this->settings = Settings::get_instance();
$this->register_filter( 'wp_smush_content_transforms', array(
$this,
'register_cdn_transform',
), self::CDN_TRANSFORM_PRIORITY );
$this->register_action( 'wp_ajax_get_cdn_stats', array( $this, 'ajax_update_stats' ) );
$this->register_action( 'wp_ajax_smush_toggle_cdn', array( $this, 'ajax_toggle_cdn' ) );
$this->register_filter( 'wp_resource_hints', array( $this, 'dns_prefetch' ), 99, 2 );
if ( $this->cdn_helper->is_cdn_active() ) {
$this->register_action( Cron_Controller::CRON_HOOK, array( $this, 'cron_update_stats' ) );
}
}
/**
* Static instance getter
*/
public static function get_instance() {
if ( empty( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
public function ajax_update_stats() {
$status = $this->cdn_helper->get_cdn_status_setting();
$smush = WP_Smush::get_instance();
if ( isset( $status->cdn_enabling ) && $status->cdn_enabling ) {
$new_status = $this->process_cdn_status_response( $smush->api()->enable() );
if ( is_wp_error( $new_status ) ) {
$code = is_numeric( $new_status->get_error_code() ) ? $new_status->get_error_code() : null;
wp_send_json_error( array(
'message' => $new_status->get_error_message(),
), $code );
} else {
$this->settings->set_setting( 'wp-smush-cdn_status', $new_status );
wp_send_json_success( $new_status );
}
} else {
wp_send_json_success( $status );
}
}
public function cron_update_stats() {
$status = $this->cdn_helper->get_cdn_status_setting();
$smush = WP_Smush::get_instance();
$cdn_enabling = isset( $status->cdn_enabling ) && $status->cdn_enabling;
$raw_api_response = $cdn_enabling ? $smush->api()->enable() : $smush->api()->check();
$new_status = $this->process_cdn_status_response( $raw_api_response );
if ( $new_status && ! is_wp_error( $new_status ) ) {
$this->settings->set_setting( 'wp-smush-cdn_status', $new_status );
}
}
public function process_cdn_status_response( $status ) {
if ( is_wp_error( $status ) ) {
return $status;
}
$status = json_decode( $status['body'] );
// Too many requests.
if ( is_null( $status ) ) {
return new WP_Error( 'too_many_requests', __( 'Too many requests, please try again in a moment.', 'wp-smushit' ) );
}
// Some other error from API.
if ( ! $status->success ) {
return new WP_Error( $status->data->error_code, $status->data->message );
}
return $status->data;
}
public function toggle_cdn( $enable ) {
$this->settings->set( 'cdn', $enable );
if ( $enable ) {
$smush = WP_Smush::get_instance();
$status = $this->cdn_helper->get_cdn_status_setting();
if ( ! $status ) {
$check_response = $this->process_cdn_status_response( $smush->api()->check() );
if ( is_wp_error( $check_response ) ) {
return $check_response;
}
$this->settings->set_setting( 'wp-smush-cdn_status', $check_response );
} elseif ( empty( $status->endpoint_url ) ) {
$enable_response = $this->process_cdn_status_response( $smush->api()->enable( true ) );
if ( is_wp_error( $enable_response ) ) {
return $enable_response;
}
$this->settings->set_setting( 'wp-smush-cdn_status', $enable_response );
}
} else {
// Remove CDN settings if disabling.
$this->settings->delete_setting( 'wp-smush-cdn_status' );
}
do_action( 'wp_smush_cdn_status_changed' );
return true;
}
public function ajax_toggle_cdn() {
check_ajax_referer( 'save_wp_smush_options' );
if ( ! Helper::is_user_allowed() ) {
wp_send_json_error( array(
'message' => __( 'User can not modify options', 'wp-smushit' ),
), 403 );
}
$enable = filter_input( INPUT_POST, 'param', FILTER_VALIDATE_BOOLEAN );
$toggled = $this->toggle_cdn( $enable );
if ( is_wp_error( $toggled ) ) {
wp_send_json_error( array(
'message' => $toggled->get_error_message(),
) );
}
wp_send_json_success();
}
public function register_cdn_transform( $transforms ) {
$transforms['cdn'] = new CDN_Transform();
return $transforms;
}
/**
* Add CDN url to header for better speed.
*
* @param array $urls URLs to print for resource hints.
* @param string $relation_type The relation type the URLs are printed.
*
* @return array
* @since 3.0
*
*/
public function dns_prefetch( $urls, $relation_type ) {
// Add only if CDN active.
if ( 'dns-prefetch' === $relation_type && $this->cdn_helper->is_cdn_active() && ! empty( $this->cdn_helper->get_cdn_base_url() ) ) {
$urls[] = $this->cdn_helper->get_cdn_base_url();
}
return $urls;
}
}