764 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			764 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace ShortPixel;
 | |
| 
 | |
| 
 | |
| use ComposePress\Core\Abstracts\Plugin;
 | |
| use ShortPixel\CriticalCSS\Admin\UI;
 | |
| use ShortPixel\CriticalCSS\API;
 | |
| use ShortPixel\CriticalCSS\API\Background\Process as BackgroundProcess;
 | |
| use ShortPixel\CriticalCSS\Background\ProcessAbstract;
 | |
| use ShortPixel\CriticalCSS\Cache\Manager as CacheManager;
 | |
| use ShortPixel\CriticalCSS\Data\Manager as DataManager;
 | |
| use ShortPixel\CriticalCSS\FileLog;
 | |
| use ShortPixel\CriticalCSS\Frontend;
 | |
| use ShortPixel\CriticalCSS\Installer;
 | |
| use ShortPixel\CriticalCSS\Integration\Manager as IntegrationManager;
 | |
| use ShortPixel\CriticalCSS\Log;
 | |
| use ShortPixel\CriticalCSS\Queue\ListTableAbstract;
 | |
| use ShortPixel\CriticalCSS\Queue\Log\Table as LogTable;
 | |
| use ShortPixel\CriticalCSS\Request;
 | |
| use ShortPixel\CriticalCSS\Settings\ApiKeyTools;
 | |
| use ShortPixel\CriticalCSS\Settings\Manager as SettingsManager;
 | |
| use ShortPixel\CriticalCSS\Template\Log as TemplateLog;
 | |
| use ShortPixel\CriticalCSS\Web\Check\Background\Process;
 | |
| use ShortPixel\CriticalCSS\Web\Check\Background\Process as WebCheckProcess;
 | |
| use ShortPixel\CriticalCSS\Queue\Web\Check\Table as CheckTable;
 | |
| 
 | |
| /**
 | |
|  * Class CriticalCSS
 | |
|  *
 | |
|  * @package ShortPixel
 | |
|  * @property CacheManager                 $cache_manager
 | |
|  * @property Request                      $request
 | |
|  * @property DataManager                  $data_manager
 | |
|  * @property IntegrationManager           $integration_manager
 | |
|  * @property SettingsManager              $settings_manager
 | |
|  * @property BackgroundProcess            $api_queue
 | |
|  * @property \ShortPixel\CriticalCSS\Queue\API\Table $api_data
 | |
|  * @property WebCheckProcess              $web_check_queue
 | |
|  * @property \ShortPixel\CriticalCSS\Queue\Web\Check $web_check_data
 | |
|  * @property Frontend                     $frontend
 | |
|  * @property UI                           $admin_ui
 | |
|  * @property Installer                    $installer
 | |
|  * @property Log                          $log
 | |
|  * @property LogTable                     $log_data
 | |
|  * @property \ShortPixel\CriticalCSS\Template\Log $template_log
 | |
|  */
 | |
| class CriticalCSS extends Plugin {
 | |
| 	/**
 | |
| 	 *
 | |
| 	 */
 | |
| 	const VERSION = '0.7.7';
 | |
| 
 | |
| 	/**
 | |
| 	 *
 | |
| 	 */
 | |
| 	const LANG_DOMAIN = 'shortpixel_critical_css';
 | |
| 
 | |
| 	/**
 | |
| 	 *
 | |
| 	 */
 | |
| 	const OPTIONNAME = 'shortpixel_critical_css';
 | |
| 
 | |
| 	/**
 | |
| 	 *
 | |
| 	 */
 | |
| 	const TRANSIENT_PREFIX = 'shortpixel_critical_css';
 | |
| 
 | |
| 	/**
 | |
| 	 *
 | |
| 	 */
 | |
| 	const PLUGIN_SLUG = 'shortpixel-critical-css';
 | |
| 
 | |
| 	/**
 | |
| 	 * @var bool
 | |
| 	 */
 | |
| 	protected $nocache = false;
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Web\Check\Background\Process
 | |
| 	 */
 | |
| 	protected $web_check_queue;
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\API\Background\Process
 | |
| 	 */
 | |
| 	protected $api_queue;
 | |
| 
 | |
|     /**
 | |
|      * @var \ShortPixel\CriticalCSS\Queue\API\Table
 | |
|      */
 | |
|     protected $api_data;
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Queue\Web\Check\Table
 | |
| 	 */
 | |
| 	protected $web_check_data;
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Integration\Manager
 | |
| 	 */
 | |
| 	protected $integration_manager;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $template;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Admin\UI
 | |
| 	 */
 | |
| 	protected $admin_ui;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Data\Manager
 | |
| 	 */
 | |
| 	protected $data_manager;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Cache\Manager
 | |
| 	 */
 | |
| 	protected $cache_manager;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Request
 | |
| 	 */
 | |
| 	protected $request;
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Settings\Manager
 | |
| 	 */
 | |
| 	protected $settings_manager;
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Frontend
 | |
| 	 */
 | |
| 	protected $frontend;
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Installer
 | |
| 	 */
 | |
| 	private $installer;
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Log
 | |
| 	 */
 | |
| 	private $log;
 | |
|     /**
 | |
|      * @var \ShortPixel\CriticalCSS\Queue\Log\Table
 | |
|      */
 | |
|     private $log_data;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var \ShortPixel\CriticalCSS\Template\Log
 | |
| 	 */
 | |
| 	private $template_log;
 | |
| 
 | |
| 	/**
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $beta_api_key = '6p7RX3VpPHtIR6rRmxfs'; //default beta key
 | |
| 
 | |
| 	/**
 | |
| 	 * CriticalCSS constructor.
 | |
| 	 *
 | |
| 	 * @param \ShortPixel\CriticalCSS\Settings\Manager                                                           $settings_manager
 | |
| 	 * @param \ShortPixel\CriticalCSS\Admin\UI                                                                   $admin_ui
 | |
| 	 * @param \ShortPixel\CriticalCSS\Data\Manager                                                               $data_manager
 | |
| 	 * @param \ShortPixel\CriticalCSS\Cache\Manager                                                              $cache_manager
 | |
| 	 * @param \ShortPixel\CriticalCSS\Request                                                                    $request
 | |
| 	 * @param \ShortPixel\CriticalCSS\Integration\Manager                                                 $integration_manager
 | |
| 	 * @param \ShortPixel\CriticalCSS\API\Background\Process|\ShortPixel\CriticalCSS\Web\Check\Background\Process $api_queue
 | |
|      * @param \ShortPixel\CriticalCSS\Queue\API\Table                                                            $api_data
 | |
| 	 * @param \ShortPixel\CriticalCSS\Frontend                                                                   $frontend
 | |
| 	 * @param \ShortPixel\CriticalCSS\Web\Check\Background\Process                                               $web_check_queue
 | |
| 	 * @param \ShortPixel\CriticalCSS\Installer                                                                  $installer
 | |
| 	 * @param \ShortPixel\CriticalCSS\Log                                                                        $log
 | |
|      * @param \ShortPixel\CriticalCSS\Queue\Log\Table                                                            $log_table
 | |
| 	 * @param \ShortPixel\CriticalCSS\Template\Log                                                               $template_log
 | |
| 	 */
 | |
| 	public function __construct(
 | |
| 		SettingsManager $settings_manager,
 | |
| 		UI $admin_ui,
 | |
| 		DataManager $data_manager,
 | |
| 		CacheManager $cache_manager,
 | |
| 		CriticalCSS\Request $request,
 | |
| 		IntegrationManager $integration_manager,
 | |
| 		BackgroundProcess $api_queue,
 | |
|         \ShortPixel\CriticalCSS\Queue\API\Table $api_data,
 | |
| 		Frontend $frontend,
 | |
| 		WebCheckProcess $web_check_queue,
 | |
| 		\ShortPixel\CriticalCSS\Queue\Web\Check\Table $web_check_data,
 | |
| 		Installer $installer,
 | |
| 		Log $log,
 | |
|         LogTable $log_data,
 | |
| 		TemplateLog $template_log
 | |
| 	) {
 | |
| 		$this->settings_manager    = $settings_manager;
 | |
| 		$this->admin_ui            = $admin_ui;
 | |
| 		$this->data_manager        = $data_manager;
 | |
| 		$this->cache_manager       = $cache_manager;
 | |
| 		$this->request             = $request;
 | |
| 		$this->integration_manager = $integration_manager;
 | |
| 		$this->api_queue           = $api_queue;
 | |
| 		$this->api_data            = $api_data;
 | |
| 		$this->web_check_queue     = $web_check_queue;
 | |
| 		$this->web_check_data      = $web_check_data;
 | |
| 		$this->frontend            = $frontend;
 | |
| 		$this->installer           = $installer;
 | |
| 		$this->log                 = $log;
 | |
|         $this->log_data            = $log_data;
 | |
| 		$this->template_log        = $template_log;
 | |
| 		parent::__construct();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return \ShortPixel\CriticalCSS\Installer
 | |
| 	 */
 | |
| 	public function get_installer() {
 | |
| 		return $this->installer;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return \ShortPixel\CriticalCSS\Admin\UI
 | |
| 	 */
 | |
| 	public function get_admin_ui() {
 | |
| 		return $this->admin_ui;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return \ShortPixel\CriticalCSS\Frontend
 | |
| 	 */
 | |
| 	public function get_frontend() {
 | |
| 		return $this->frontend;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return \ShortPixel\CriticalCSS\Settings\Manager
 | |
| 	 */
 | |
| 	public function get_settings_manager() {
 | |
| 		return $this->settings_manager;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return \ShortPixel\CriticalCSS\Web\Check\Background\Process
 | |
| 	 */
 | |
| 	public function get_web_check_queue() {
 | |
| 		return $this->web_check_queue;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return \ShortPixel\CriticalCSS\Data\Manager
 | |
| 	 */
 | |
| 	public function get_data_manager() {
 | |
| 		return $this->data_manager;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return CriticalCSS\Cache\Manager
 | |
| 	 */
 | |
| 	public function get_cache_manager() {
 | |
| 		return $this->cache_manager;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 *
 | |
| 	 */
 | |
| 	public function activate() {
 | |
| 		$this->installer->activate();
 | |
| 	}
 | |
| 
 | |
|     public function first_install() {
 | |
|         if(false === $this->settings_manager->get_setting('init_settings')) {
 | |
|             $settings = $this->settings_manager->get_settings();
 | |
|             $settings['init_settings'] = true;
 | |
|             $this->settings_manager->update_settings($settings);
 | |
|             wp_redirect( admin_url( 'options-general.php?page=' .  self::LANG_DOMAIN) );
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 	/**
 | |
| 	 *
 | |
| 	 */
 | |
| 	public function deactivate() {
 | |
| 		$this->installer->deactivate();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param array $object
 | |
| 	 *
 | |
| 	 * @return false|mixed|string|\\WP_Error
 | |
| 	 */
 | |
| 	public
 | |
| 	function get_permalink(
 | |
| 		array $object
 | |
| 	) {
 | |
| 		if ( ! empty( $object['blog_id'] ) ) {
 | |
| 			switch_to_blog( $object['blog_id'] );
 | |
| 		}
 | |
| 		$enable_integration = false;
 | |
| 		if ( $this->integration_manager->is_enabled() ) {
 | |
| 			$this->integration_manager->disable_integrations();
 | |
| 			$enable_integration = true;
 | |
| 		}
 | |
| 		if ( ! empty( $object['object_id'] ) ) {
 | |
| 			$object['object_id'] = absint( $object['object_id'] );
 | |
| 		}
 | |
| 		switch ( $object['type'] ) {
 | |
| 			case 'post':
 | |
| 				$url = get_permalink( $object['object_id'] );
 | |
| 				break;
 | |
| 			case 'term':
 | |
| 				$url = get_term_link( $object['object_id'] );
 | |
| 				break;
 | |
| 			case 'author':
 | |
| 				$url = get_author_posts_url( $object['object_id'] );
 | |
| 				break;
 | |
| 			default:
 | |
| 				//case 'url' is default behaviour
 | |
| 				$url = preg_replace('%nocache/$%', '', $object['url'], 1);
 | |
| 		}
 | |
| 		if ( $enable_integration ) {
 | |
| 			$this->integration_manager->enable_integrations();
 | |
| 		}
 | |
| 		if ( $url instanceof \WP_Error ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$url_parts = parse_url( $url );
 | |
| 		if ( empty( $url_parts['path'] ) ) {
 | |
| 			$url_parts['path'] = '/';
 | |
| 		}
 | |
|         if(!preg_match('/\/nocache\/?$/', $url_parts['path'])) {
 | |
|             $url_parts['path'] = trailingslashit( $url_parts['path'] ) . 'nocache/';
 | |
|         }
 | |
| 		if ( class_exists( 'http\Url' ) ) {
 | |
| 			/**
 | |
| 			 * @noinspection PhpUndefinedClassInspection
 | |
| 			 */
 | |
| 			$url = new \http\Url( $url_parts );
 | |
| 			$url = $url->toString();
 | |
| 		} else {
 | |
| 			$url = http_build_url( $url_parts );
 | |
| 		}
 | |
| 		if ( ! empty( $object['blog_id'] ) ) {
 | |
| 			restore_current_blog( $object['blog_id'] );
 | |
| 		}
 | |
| 
 | |
| 		return apply_filters( 'shortpixel_critical_css_get_permalink', $url );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return \ShortPixel\CriticalCSS\API\Background\Process
 | |
| 	 */
 | |
| 	public
 | |
| 	function get_api_queue() {
 | |
| 		return $this->api_queue;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return \ShortPixel\CriticalCSS\Request
 | |
| 	 */
 | |
| 	public
 | |
| 	function get_request() {
 | |
| 		return $this->request;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return \ShortPixel\CriticalCSS\Integration\Manager
 | |
| 	 */
 | |
| 	public
 | |
| 	function get_integration_manager() {
 | |
| 		return $this->integration_manager;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function uninstall() {
 | |
| 		// noop
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function get_option_name() {
 | |
| 		return static::OPTIONNAME;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function get_lang_domain() {
 | |
| 		return static::LANG_DOMAIN;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function get_transient_prefix() {
 | |
| 		return static::TRANSIENT_PREFIX;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return \ShortPixel\CriticalCSS\Log
 | |
| 	 */
 | |
| 	public function get_log() {
 | |
| 		return $this->log;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return \ShortPixel\CriticalCSS\Template\Log
 | |
| 	 */
 | |
| 	public function get_template_log() {
 | |
| 		return $this->template_log;
 | |
| 	}
 | |
| 
 | |
|     /**
 | |
|      * @param array $rec
 | |
|      * @return mixed|void
 | |
|      */
 | |
|     public function get_item(array $rec)
 | |
|     {
 | |
|         if ($rec === null || ($item = (object)unserialize($rec['data'])) === null) {
 | |
|             return false;
 | |
|         }
 | |
|         //var_dump($item);//exit();
 | |
|         $item->url = $rec['url'];
 | |
|         $item->type = $rec['type'];
 | |
|         $item->object_id = $rec['object_id'];
 | |
|         $item->template = $rec['template'];
 | |
|         $item->post_type = $rec['post_type'];
 | |
|         return $item;
 | |
|     }
 | |
| 
 | |
|     protected function setup_components() {
 | |
| 		$components = $this->get_components();
 | |
| 		$this->set_component_parents( $components );
 | |
| 		foreach ( $components as $component ) {
 | |
| 			$component->init();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
|     public function retrieve_cached_css($request = false) {
 | |
| 
 | |
|         // In order to do the equiv. of get_current_page_type() for a URL, see: https://wordpress.stackexchange.com/questions/252998/detect-page-type-by-url-archive-single-page-author
 | |
|         // and get_post_type( url_to_postid( $url ) ) for the post that doesn't seem to be covered by the above solution
 | |
|         // This function will also be used in the admin to provide the CSS and also check if the CSS is not expired ( case in which EXPIRED will be displayed as Status)
 | |
|         if($request) {
 | |
|             $post_type = 'post' === $request['type'] ? get_post_type($request['object_id']) : false;
 | |
|             $is_archive = false;// != $post_type ?
 | |
|             $call_type = "ADMIN";
 | |
|         } else {
 | |
|             $request  = $this->request->get_current_page_type();
 | |
|             $post_type = get_post_type();
 | |
|             $is_archive = false !== $post_type && is_post_type_archive();
 | |
|             $call_type = "FRONT";
 | |
|         }
 | |
| 
 | |
|         (SPCCSS_DEBUG & FileLog::DEBUG_AREA_INIT) && FileLog::instance()->log("CCSS $call_type request", $request);
 | |
|         (SPCCSS_DEBUG & FileLog::DEBUG_AREA_INIT) && FileLog::instance()->log("CCSS $call_type post_type", $post_type);
 | |
| 
 | |
|         $manual   = true;
 | |
|         if ( 'post' === $request['type'] ) {
 | |
|             $manual = apply_filters( 'shortpixel_critical_css_manual_post_css', true );
 | |
|         }
 | |
|         if ( 'term' === $request['type'] ) {
 | |
|             $manual = apply_filters( 'shortpixel_critical_css_manual_term_css', true );
 | |
|         }
 | |
|         $manual_cache = null;
 | |
|         //$fallback_css = trim( $this->settings_manager->get_setting( 'fallback_css' ) );
 | |
|         $fallback_css = wp_get_custom_css_post('fallback_critical_css');
 | |
|         $fallback_css = $fallback_css ? trim( wp_get_custom_css_post('fallback_critical_css')->post_content ) : '';
 | |
| 
 | |
|         if ( $manual ) {
 | |
|             $manual_cache = trim(  $this->data_manager->get_manual_css() ?: '' );
 | |
|         }
 | |
| 
 | |
|         $cache = trim( $this->data_manager->get_cache($call_type === 'ADMIN' ? $request : []) ?: '' );
 | |
|         if ( 'on' === $this->settings_manager->get_setting( 'prioritize_manual_css' ) ) {
 | |
|             $cache = $manual_cache;
 | |
|             if ( empty( $cache ) ) {
 | |
|                 if ( false !== $post_type && 'on' === $this->settings_manager->get_setting( 'single_post_type_css_' . $post_type ) ) {
 | |
|                     if ( $is_archive ) {
 | |
|                         $cache = $this->settings_manager->get_setting( 'single_post_type_css_' . $post_type . '_archive_css' );
 | |
|                     }
 | |
|                     if ( empty( $cache ) ) {
 | |
|                         $cache = $this->settings_manager->get_setting( 'single_post_type_css_' . $post_type . '_css' );
 | |
|                     }
 | |
|                 }
 | |
|                 if ( 'term' === $request['type'] && 'on' === $this->settings_manager->get_setting( 'single_taxonomy_css_' . $post_type ) ) {
 | |
|                     $cache = $this->settings_manager->get_setting( 'single_taxonomy_css_' . get_queried_object()->taxonomy . '_css' );
 | |
|                 }
 | |
|             }
 | |
|             if ( empty( $cache ) ) {
 | |
|                 $manual   = false;
 | |
|                 $cache    = $fallback_css;
 | |
|             }
 | |
|         } else {
 | |
|             $manual = false;
 | |
|         }
 | |
| 
 | |
|         if ( empty( $cache ) ) {
 | |
|             $manual   = true;
 | |
|             $cache    = $manual_cache;
 | |
|         }
 | |
|         if ( empty( $cache ) ) {
 | |
|             $manual   = false;
 | |
|             $cache    = $fallback_css;
 | |
|         }
 | |
| 
 | |
|         (SPCCSS_DEBUG & FileLog::DEBUG_AREA_INIT) && FileLog::instance()->log("CCSS $call_type get cache:", $cache);
 | |
| 
 | |
|         $cache = apply_filters( 'shortpixel_critical_css_print_styles_cache', $cache );
 | |
| 
 | |
|         return (object)['cache' => $cache, 'manual' => $manual];
 | |
|     }
 | |
| 
 | |
|     /* AJAX calls */
 | |
| 
 | |
| 	public function web_queue_run(int $queueId) {
 | |
| 		$this->run($this->web_check_data, $this->web_check_queue, $queueId);
 | |
| 	}
 | |
| 
 | |
|     public function api_run(int $queueId) {
 | |
|        $this->run($this->api_data, $this->api_queue, $queueId);
 | |
|     }
 | |
| 
 | |
| 	/**
 | |
| 	 * run the call for a specific API or Web Check Queue item (manually triggered from the API Queue list)
 | |
| 	 *
 | |
| 	 * @param ListTableAbstract $dataSource
 | |
| 	 * @param ProcessAbstract $queue
 | |
| 	 * @param int $queueId
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	protected function run($dataSource, $queue, $queueId) {
 | |
| 		$rec = $dataSource->get_item($queueId);
 | |
| 		//var_dump($rec);
 | |
| 		header('Content-Type: application/json; charset=utf-8');
 | |
| 
 | |
| 		if($rec === null) {
 | |
| 			exit(json_encode(["status" => API::STATUS_DONE]));
 | |
| 		}
 | |
| 		$item = $this->get_item($rec);
 | |
| 		if($item === false) {
 | |
| 			exit(json_encode(["status" => API::STATUS_DONE]));
 | |
| 		}
 | |
| 		//TODO MOVE TO API_QUEUE FROM HERE and use $this->api_queue->lock_process();
 | |
| 		$response = $queue->task((array)$item, true);
 | |
| 		if(is_object($response)) {
 | |
| 			$response = (array)$response;
 | |
| 		}
 | |
| 
 | |
| 		if(!empty($response['status']) &&
 | |
| 		   in_array($response['status'], [
 | |
| 			   API::STATUS_DONE,
 | |
| 			   CheckTable::STATUS_DONE,
 | |
| 			   CheckTable::STATUS_EXISTS] ) ) {
 | |
| 			$queue->delete(intval($rec['id']));
 | |
| 		} elseif(!empty($response['status']) && !empty($response['status'])) {
 | |
| 			$queue->update(intval($rec['id']), [$response]);
 | |
| 		}
 | |
| 
 | |
| 		echo json_encode($response);
 | |
| 		exit();
 | |
| 	}
 | |
| 
 | |
| 	public function web_queue_remove(int $queueId)
 | |
| 	{
 | |
| 		$this->queue_remove($this->web_check_queue, $queueId);
 | |
| 	}
 | |
| 
 | |
| 	public function api_queue_remove(int $queueId)
 | |
| 	{
 | |
| 		$this->queue_remove($this->api_queue, $queueId);
 | |
| 	}
 | |
| 
 | |
| 	protected function queue_remove($queue, int $queueId)
 | |
| 	{
 | |
| 		header('Content-Type: application/json; charset=utf-8');
 | |
| 		$queue->delete($queueId);
 | |
| 		echo json_encode( [ 'status' => API::STATUS_REMOVED ] );
 | |
| 		exit;
 | |
| 
 | |
| 	}
 | |
|     /**
 | |
|      * run the API call for a specific API Queue item (manually triggered from the API Queue list)
 | |
|      */
 | |
|     public function get_ccss() {
 | |
|         $rec = $this->log_data->get_item(intval($_POST['log_id']));
 | |
|         //var_dump($rec);
 | |
|         $item = $this->get_item($rec);
 | |
|         if($item === false) {
 | |
|             exit(json_encode(["status" => API::STATUS_DONE]));
 | |
|         }
 | |
|         $css = $this->retrieve_cached_css((array)$item);
 | |
|         $css->url = $this->get_permalink((array)$item);
 | |
| 
 | |
|         header('Content-Type: application/json; charset=utf-8');
 | |
|         echo json_encode($css);
 | |
|         exit();
 | |
|     }
 | |
| 
 | |
| 	public function use_spio_key()
 | |
| 	{
 | |
| 		$key = ApiKeyTools::getSPIOApiKey();
 | |
| 		//no validation here
 | |
| 		ApiKeyTools::updateApiKey($key);
 | |
| 		$ret = [
 | |
| 			'status' => 'ok'
 | |
| 		];
 | |
| 		header('Content-Type: application/json; charset=utf-8');
 | |
| 		echo json_encode($ret);
 | |
| 		exit();
 | |
| 	}
 | |
| 
 | |
| 	public function get_apikey()
 | |
| 	{
 | |
| 		$apiKey = ApiKeyTools::getApiKey();
 | |
| 		$ret = [
 | |
| 			'status' => 'ok',
 | |
| 			'key' => $apiKey,
 | |
| 		];
 | |
| 		header('Content-Type: application/json; charset=utf-8');
 | |
| 		echo json_encode($ret);
 | |
| 		exit();
 | |
| 	}
 | |
| 
 | |
| 	public function update_apikey() {
 | |
| 		$key = trim( $_POST['key'] );
 | |
| 		if ( $key != '' ) {
 | |
| 			$validateRes = ApiKeyTools::validateAPIKey( $key );
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		if ( $key == '' || $validateRes['status'] ) {
 | |
| 			ApiKeyTools::updateApiKey( $key );
 | |
| 			$ret = [
 | |
| 				'status' => 'ok',
 | |
| 				'key'    => $key,
 | |
| 			];
 | |
| 		} else {
 | |
| 			$ret = [
 | |
| 				'status' => 'error',
 | |
| 				'error'  => $validateRes['error'],
 | |
| 				'key'    => $key,
 | |
| 			];
 | |
| 		}
 | |
| 
 | |
| 		header( 'Content-Type: application/json; charset=utf-8' );
 | |
| 		echo json_encode( $ret );
 | |
| 		exit();
 | |
| 	}
 | |
|   
 | |
| 	public function dismiss_notification() {
 | |
| 		$causer = !empty($_POST['causer'])?$_POST['causer']:null;
 | |
| 		if(!empty($causer) && in_array($causer, [
 | |
| 			//white list of possible notifications to dismiss to avoid spam in db
 | |
| 				'ccss_cron_disabled_notice',
 | |
| 				'ccss_spio_apikey_found'
 | |
| 			])) {
 | |
| 			$settings = $this->settings_manager->get_settings();
 | |
| 			$settings[$causer . '_dismissed'] = true;
 | |
| 			$this->settings_manager->update_settings($settings);
 | |
| 		}
 | |
| 		echo json_encode(['status' => 'ok']);
 | |
| 		exit;
 | |
| 	}
 | |
| 
 | |
| 	function get_cache_mode_posttypes()
 | |
| 	{
 | |
| 		$ret = [];
 | |
| 		$postTypes = get_post_types([], 'objects');
 | |
| 
 | |
| 		foreach($postTypes as $postType) {
 | |
| 			if($postType->public && !$postType->exclude_from_search) {
 | |
| 				$ret[$postType->name] = $postType->label;
 | |
| 			}
 | |
| 		}
 | |
| 		return $ret;
 | |
| 	}
 | |
| 
 | |
| 	function get_cache_mode_templates()
 | |
| 	{
 | |
| 		$ret = [];
 | |
| 
 | |
| 		//block theme such as twenty twenty-two, get templates list from the system
 | |
| 		if(function_exists('wp_is_block_theme') && wp_is_block_theme()) {
 | |
| 			$postTemplates = get_block_templates();
 | |
| 			foreach($postTemplates as $postTemplate) {
 | |
| 				$ret[ $postTemplate->slug ] = $postTemplate->title;
 | |
| 			}
 | |
| 		} else {
 | |
| 			//classic theme such as twenty twenty-one use template files list instead
 | |
| 			$postTemplates = wp_get_theme()->offsetGet('Template Files');
 | |
| 
 | |
| 			if(!empty($postTemplates)) {
 | |
| 				foreach($postTemplates as $key => $value) {
 | |
| 					//use short path as label and path format of request template for key
 | |
| 
 | |
| 					$ret[ str_replace( trailingslashit( WP_CONTENT_DIR ), '', $value ) ] = $key;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		return $ret;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Actions on switching theme (i.e. cleaning templates options)
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function switch_theme()
 | |
| 	{
 | |
| 		//cleanup templates selection
 | |
| 		$settings = $this->settings_manager->get_settings();
 | |
|         if($settings['cache_mode']['templates']) {
 | |
|             $settings['template_values'] = $this->get_cache_mode_templates();
 | |
|         }
 | |
| 		//unset($settings['cache_mode']['templates']);
 | |
| 		//$settings['template_values'] = [];
 | |
| 		$this->settings_manager->update_settings($settings);
 | |
| 		//purge cache
 | |
| 		$this->get_cache_manager()->purge_page_cache();
 | |
|   }
 | |
| 
 | |
| 	public function force_web_check() {
 | |
| 		$this->get_cache_manager()->purge_page_cache();
 | |
| 		$this->get_cache_manager()->reset_post_meta_cache();
 | |
| 		header('Content-Type: application/json; charset=utf-8');
 | |
| 		echo json_encode(['status' => 'ok']);
 | |
| 		exit;
 | |
| 	}
 | |
| 	/**
 | |
| 	 * proxy contact form call to shortpixel.com
 | |
| 	 */
 | |
| 	public function contact() {
 | |
| 
 | |
| 		$body = [
 | |
| 			'source' => sanitize_text_field( !empty($_POST['source'])?$_POST['source']:'' ),
 | |
| 			'quriobot_answers' => sanitize_text_field( !empty($_POST['quriobot_answers'])?$_POST['quriobot_answers']:'' ),
 | |
| 			'name' => sanitize_text_field( !empty($_POST['name'])?$_POST['name']:'' ),
 | |
| 			'email' => sanitize_text_field( !empty($_POST['email'])?$_POST['email']:'' ),
 | |
| 			'message' => '[CriticalCSS plugin contact form] ' . sanitize_textarea_field( !empty($_POST['message'])?$_POST['message']:'' ),
 | |
| 			'submit' => 'Send',
 | |
| 		];
 | |
| 		$options = [
 | |
| 			'body' => $body,
 | |
| 			'headers' => [
 | |
| 				'Content-Type' => 'application/x-www-form-urlencoded',
 | |
| 			],
 | |
| 		];
 | |
| 
 | |
| 		$response = wp_remote_post( 'https://shortpixel.com/contact', $options );
 | |
| 		if($response instanceof \WP_Error) {
 | |
| 			$ret = [
 | |
| 				'status' => 'error',
 | |
| 			];
 | |
| 		} else {
 | |
| 			$ret = [
 | |
| 				'status' => 'ok',
 | |
| 				'response' => $response['body'],
 | |
| 			];
 | |
| 		}
 | |
| 
 | |
| 		header('Content-Type: application/json; charset=utf-8');
 | |
| 		echo json_encode($ret);
 | |
| 		exit();
 | |
| 	}
 | |
| }
 |