Files
wrapartamenty.pl/wp-content/plugins/wp-optimize-premium/cache/class-wp-optimize-cloudflare.php
Roman Pyrih d6241cfa7a first commit
2024-12-19 15:27:13 +01:00

190 lines
5.8 KiB
PHP

<?php
if (!defined('WPO_PLUGIN_MAIN_PATH')) die('No direct access allowed');
/**
* Class WP_Optimize_Cloudflare
*/
class WP_Optimize_Cloudflare {
public $cloudflare_api;
protected $config;
private $cache_purged = false;
public function __construct($config) {
$this->config = $config;
$api_email = isset($this->config['cloudflare_api_email']) ? $this->config['cloudflare_api_email'] : '';
$api_key = isset($this->config['cloudflare_api_key']) ? $this->config['cloudflare_api_key'] : '';
$api_token = isset($this->config['cloudflare_api_token']) ? $this->config['cloudflare_api_token'] : '';
$this->cloudflare_api = new WP_Optimize_Cloudflare_API($api_email, $api_key, $api_token);
// Filters and actions required for Cloudflare support.
add_filter('wpo_save_cache_settings_validation', array($this, 'validate_cloudflare_settings'));
add_action('wpo_page_cache_advanced_settings', array($this, 'cloudflare_settings'));
add_action('wpo_delete_cache_by_url', array($this, 'purge_cloudflare_single_url'), 10, 2);
add_action('wpo_cache_flush', array($this, 'purge_cloudflare_cache'), 10, 2);
}
/**
* Include Cloudflare settings template.
*
* @param array $cache_options
*/
public function cloudflare_settings($cache_options) {
$cloudflare_plugin_credentials = $this->get_cloudflare_plugin_credentials();
$cloudflare_api_email = isset($cache_options['cloudflare_api_email']) ? $cache_options['cloudflare_api_email'] : $cloudflare_plugin_credentials['email'];
$cloudflare_api_key = isset($cache_options['cloudflare_api_key']) ? $cache_options['cloudflare_api_key'] : $cloudflare_plugin_credentials['key'];
$cloudflare_api_token = isset($cache_options['cloudflare_api_token']) ? $cache_options['cloudflare_api_token'] : $cloudflare_plugin_credentials['token'];
$extract = array(
'show_cloudflare_settings' => apply_filters('show_cloudflare_settings', isset($_SERVER['HTTP_CF_RAY'])),
'display' => $cache_options['enable_page_caching'],
'purge_cloudflare_cache' => isset($cache_options['purge_cloudflare_cache']) ? $cache_options['purge_cloudflare_cache'] : false,
'cloudflare_api_email' => $cloudflare_api_email,
'cloudflare_api_key' => $cloudflare_api_key,
'cloudflare_api_token' => $cloudflare_api_token,
);
WP_Optimize()->include_template('cache/page-cache-cloudflare.php', false, $extract);
}
/**
* Validate Cloudflare settings by running test request to Cloudflare API.
*
* @param array $settings
*
* @return array
*/
public function validate_cloudflare_settings($settings) {
$result = array(
'result' => true,
'js_trigger' => 'validate_cloudflare_settings',
);
$cloudflare_enabled = isset($settings['purge_cloudflare_cache']) ? $settings['purge_cloudflare_cache'] : false;
if ($cloudflare_enabled) {
$cloudflare = new WP_Optimize_Cloudflare_API($settings['cloudflare_api_email'], $settings['cloudflare_api_key'], $settings['cloudflare_api_token']);
$test_zones = $cloudflare->get_zones(1, 1);
if (is_wp_error($test_zones)) {
$result['result'] = false;
$result['cloudflare_error'] = __('It was not possible to Connect to Cloudflare with the provided credentials.', 'wp-optimize');
}
}
delete_transient('wpo_cloudflare_zone_id');
return $result;
}
/**
* Check if Cloudflare plugin is active.
*
* @return Boolean
*/
public function is_cloudflare_plugin_active() {
$db_info = WP_Optimize()->get_db_info();
$cloudflare_plugin_status = $db_info->get_plugin_status('cloudflare');
return $cloudflare_plugin_status['installed'] && $cloudflare_plugin_status['active'];
}
/**
* Get Cloudflare plugin credentials from WordPress options.
*
* @return array
*/
public function get_cloudflare_plugin_credentials() {
$email = get_option('cloudflare_api_email', '');
$key = get_option('cloudflare_api_key', '');
$token = '';
// if in Cloudflare plugin settings stored Auth token then we return just token.
if ('' != trim($key) && !WP_Optimize_Cloudflare_API::is_auth_key($key)) {
$token = $key;
$email = '';
$key = '';
}
return array(
'email' => $email,
'key' => $key,
'token' => $token,
);
}
/**
* Purge single page from Cloudflare cache.
*
* @param string $url
* @param bool $recursive when $recursive is true we purge cache completely.
*/
public function purge_cloudflare_single_url($url, $recursive) {
if (!$this->is_purge_cloudflare_cache_enabled() || $this->cache_purged) return;
if ($recursive) {
$this->purge_cloudflare_cache();
return;
}
$zone_id = $this->get_site_cloudflare_zone_id();
if ($zone_id) {
$this->cloudflare_api->purge_urls($zone_id, array($url));
}
}
/**
* Purge Cloudflare cache.
*/
public function purge_cloudflare_cache() {
if (!$this->is_purge_cloudflare_cache_enabled() || $this->cache_purged) return;
// if transient is set then we don't call purge request again.
if (true == get_transient('wpo_cloudflare_cache_purged')) return;
$zone_id = $this->get_site_cloudflare_zone_id();
if ($zone_id) {
$this->cloudflare_api->purge_cache($zone_id);
}
// set cache_purged flag to avoid duplicated purging requests.
$this->cache_purged = true;
// set transient for 10 seconds to avoid redundant requests to api.
set_transient('wpo_cloudflare_cache_purged', true, 10);
}
/**
* Get Cloudflare zone id for current site.
*
* @return string
*/
private function get_site_cloudflare_zone_id() {
$zone_id = get_transient('wpo_cloudflare_zone_id');
if ($zone_id) return $zone_id;
$zone_id = $this->cloudflare_api->get_zone_id_by_site_url(site_url());
set_transient('wpo_cloudflare_zone_id', $zone_id, 3600);
return $zone_id;
}
/**
* Check if purge Cloudflare option enabled.
*
* @return bool
*/
private function is_purge_cloudflare_cache_enabled() {
return isset($this->config['purge_cloudflare_cache']) ? $this->config['purge_cloudflare_cache'] : false;
}
}