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();
|
|
}
|
|
}
|