| 1 |
<?php |
| 2 |
|
| 3 |
namespace Upress\EzCache; |
| 4 |
|
| 5 |
use WP_Admin_Bar; |
| 6 |
use wpdb; |
| 7 |
|
| 8 |
class Admin { |
| 9 |
/** @var Plugin */ |
| 10 |
private $plugin; |
| 11 |
protected static $svg = '<svg viewBox="0 0 480 480" version="1.1" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" xmlns:serif="http://www.serif.com/" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2"> |
| 12 |
<g id="Camada-1" serif:id="Camada 1" fill-rule="nonzero"> |
| 13 |
<path d="M206.088 138.266l-90.584 127.353h115.3l-67.078 160.647 201.096-213.077H254.006l53.292-74.923h-101.21z" fill="#fc0"/> |
| 14 |
<path d="M205.088 138.266l-90.585 127.352h115.3l-67.078 160.647L285.68 239.266H180.327l75.364-101h-50.603z" fill="url(#_Linear1)"/> |
| 15 |
</g> |
| 16 |
<defs> |
| 17 |
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(171.176 0 0 -171.176 114.504 282.266)"> |
| 18 |
<stop offset="0" stop-color="#deb203" stop-opacity="1"/> |
| 19 |
<stop offset="1" stop-color="#fc0" stop-opacity="1"/> |
| 20 |
</linearGradient> |
| 21 |
</defs> |
| 22 |
</svg> '; |
| 23 |
|
| 24 |
function __construct( $plugin ) { |
| 25 |
$this->plugin = $plugin; |
| 26 |
|
| 27 |
add_action( 'admin_init', [ $this, 'start_session' ] ); |
| 28 |
add_action( 'admin_init', [ $this, 'register_settings' ] ); |
| 29 |
add_action( 'admin_menu', [ $this, 'register_menu' ] ); |
| 30 |
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); |
| 31 |
add_action( 'plugin_action_links_' . plugin_basename( $this->plugin->plugin_file ), [ |
| 32 |
$this, |
| 33 |
'plugin_action_links' |
| 34 |
] ); |
| 35 |
add_action( 'admin_notices', [ $this, 'maybe_show_advanced_cache_notice' ] ); |
| 36 |
|
| 37 |
add_action( 'admin_bar_menu', [ $this, 'add_admin_bar_button' ], 999 ); |
| 38 |
add_action( 'admin_post_wpb_clear_cache', [ $this, 'admin_clear_cache' ] ); |
| 39 |
add_action( 'admin_post_nopriv_wpb_clear_cache', [ $this, 'admin_clear_cache' ] ); |
| 40 |
add_action( 'admin_post_wpb_repair_install', [ $this, 'admin_repair_installation' ] ); |
| 41 |
add_action( 'delete_attachment', [ $this, 'delete_webp_image' ] ); |
| 42 |
|
| 43 |
add_action( 'init', [ $this, 'register_post_meta' ] ); |
| 44 |
add_action( 'add_meta_boxes', [ $this, 'post_cache_metabox' ] ); |
| 45 |
add_action( 'save_post', [ $this, 'save_post_cache_metabox' ] ); |
| 46 |
} |
| 47 |
|
| 48 |
/** |
| 49 |
* Delete the webp versions when the image is deleted |
| 50 |
* |
| 51 |
* @param int $attachment_id |
| 52 |
*/ |
| 53 |
function delete_webp_image( $attachment_id ) { |
| 54 |
/** @var wpdb $wpdb */ |
| 55 |
global $wpdb; |
| 56 |
|
| 57 |
$upload_dir = wp_upload_dir()['basedir']; |
| 58 |
|
| 59 |
$meta = wp_get_attachment_metadata( $attachment_id ); |
| 60 |
$meta['sizes'][] = [ 'file' => $meta['file'] ]; |
| 61 |
|
| 62 |
$hashes = []; |
| 63 |
foreach ( $meta['sizes'] as $size ) { |
| 64 |
$image_path = trailingslashit( $upload_dir ) . $meta['file']; |
| 65 |
$ext = pathinfo( $image_path, PATHINFO_EXTENSION ); |
| 66 |
$image_webp_path = preg_replace( '/^(.+)\.' . preg_quote( $ext, '/' ) . '$/u', '$1.webp', $image_path ); |
| 67 |
|
| 68 |
$hashes[] = sha1( $image_path ); |
| 69 |
|
| 70 |
if ( file_exists( $image_webp_path ) ) { |
| 71 |
unlink( $image_webp_path ); |
| 72 |
} |
| 73 |
} |
| 74 |
|
| 75 |
$wpdb->query( |
| 76 |
$wpdb->prepare( |
| 77 |
"DELETE FROM `{$wpdb->prefix}ezcache_webp_images` WHERE `uid` IN (" . substr( str_repeat( "%d, ", count( $hashes ) ), 0, - 2 ) . ")", |
| 78 |
$hashes |
| 79 |
) |
| 80 |
); |
| 81 |
|
| 82 |
$wpdb->query( "OPTIMIZE TABLE `{$wpdb->prefix}ezcache_webp_images`" ); |
| 83 |
} |
| 84 |
|
| 85 |
/** |
| 86 |
* Register the post meta fields |
| 87 |
*/ |
| 88 |
function register_post_meta() { |
| 89 |
register_post_meta( 'post', '_ezcache_do_not_cache_post', [ |
| 90 |
'show_in_rest' => true, |
| 91 |
'single' => true, |
| 92 |
'type' => 'bool', |
| 93 |
'auth_callback' => function () { |
| 94 |
return current_user_can( 'edit_posts' ); |
| 95 |
} |
| 96 |
] ); |
| 97 |
} |
| 98 |
|
| 99 |
/** |
| 100 |
* Register the meta box |
| 101 |
*/ |
| 102 |
function post_cache_metabox() { |
| 103 |
global $post_type; |
| 104 |
|
| 105 |
if ( 'attachement' == $post_type ) { |
| 106 |
return; |
| 107 |
} |
| 108 |
|
| 109 |
add_meta_box( |
| 110 |
'ezcache_metabox', |
| 111 |
__( 'Caching', 'ezcache' ), |
| 112 |
[ $this, 'post_cache_metabox_output' ], |
| 113 |
null, |
| 114 |
'side' |
| 115 |
); |
| 116 |
} |
| 117 |
|
| 118 |
/** |
| 119 |
* Render the post meta box |
| 120 |
* |
| 121 |
* @param $post |
| 122 |
*/ |
| 123 |
function post_cache_metabox_output( $post ) { |
| 124 |
global $post_type_object; |
| 125 |
|
| 126 |
$value = get_post_meta( $post->ID, '_ezcache_do_not_cache_post', true ); |
| 127 |
wp_nonce_field( 'ezcache_metabox', '_eznonce' ); |
| 128 |
?> |
| 129 |
<div class="components-panel__row"> |
| 130 |
<div class="components-base-control"> |
| 131 |
<input type="checkbox" |
| 132 |
id="ezcache_no_cache" |
| 133 |
name="ezcache_no_cache" |
| 134 |
class="components-checkbox-control__input" |
| 135 |
<?php checked( $value ); ?> |
| 136 |
> |
| 137 |
<label class="components-checkbox-control__label" for="ezcache_no_cache"> |
| 138 |
<?php echo 'page' == $post_type_object->capability_type ? esc_html__( 'Do not cache this page', 'ezcache' ) : esc_html__( 'Do not cache this post', 'ezcache' ); ?> |
| 139 |
</label> |
| 140 |
</div> |
| 141 |
</div> |
| 142 |
<?php |
| 143 |
} |
| 144 |
|
| 145 |
/** |
| 146 |
* Save the meta box settings |
| 147 |
* |
| 148 |
* @param $post_id |
| 149 |
*/ |
| 150 |
function save_post_cache_metabox( $post_id ) { |
| 151 |
if ( ! isset( $_POST['_eznonce'] ) || ! wp_verify_nonce( $_POST['_eznonce'], 'ezcache_metabox' ) ) { |
| 152 |
return; |
| 153 |
} |
| 154 |
|
| 155 |
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { |
| 156 |
return; |
| 157 |
} |
| 158 |
|
| 159 |
if ( ! current_user_can( 'edit_post', $post_id ) ) { |
| 160 |
return; |
| 161 |
} |
| 162 |
|
| 163 |
if ( isset( $_POST['ezcache_no_cache'] ) ) { |
| 164 |
update_post_meta( $post_id, '_ezcache_do_not_cache_post', true ); |
| 165 |
Cache::instance()->clear_cache_single( $post_id ); |
| 166 |
} else { |
| 167 |
delete_post_meta( $post_id, '_ezcache_do_not_cache_post' ); |
| 168 |
} |
| 169 |
} |
| 170 |
|
| 171 |
/** |
| 172 |
* Add settings link to the plugin action links |
| 173 |
* |
| 174 |
* @param array $links |
| 175 |
* |
| 176 |
* @return array |
| 177 |
*/ |
| 178 |
function plugin_action_links( $links ) { |
| 179 |
$links[] = sprintf( |
| 180 |
'<a href="%s">%s</a>', |
| 181 |
admin_url( 'admin.php?page=ezcache' ), |
| 182 |
__( 'Settings' ) |
| 183 |
); |
| 184 |
|
| 185 |
return $links; |
| 186 |
} |
| 187 |
|
| 188 |
/** |
| 189 |
* Add the menu to the admin bar |
| 190 |
* |
| 191 |
* @param WP_Admin_Bar $wp_admin_bar |
| 192 |
*/ |
| 193 |
function add_admin_bar_button( $wp_admin_bar ) { |
| 194 |
if ( ! current_user_can( 'manage_options' ) ) { |
| 195 |
return; |
| 196 |
} |
| 197 |
|
| 198 |
$referer = rawurlencode( wp_unslash( remove_query_arg( 'fl_builder', $_SERVER['REQUEST_URI'] ) ) ); |
| 199 |
$svg = preg_replace( '/<svg(\s+?)(?:(?:style=[\'"]([\s\S]+?);?[\'"]([\s\S]*?))|([\s\S]*?))>/i', '<svg class="ab-icon" style="height:1em;width:auto;color:#a0a5aa;color:rgba(240,245,250,.6);$2" $3$4>', self::$svg ); |
| 200 |
|
| 201 |
$wp_admin_bar->add_menu( [ |
| 202 |
'id' => 'ezcache', |
| 203 |
'title' => $svg . __( 'ezCache', 'ezcache' ), |
| 204 |
'href' => admin_url( 'admin.php?page=ezcache' ), |
| 205 |
] ); |
| 206 |
|
| 207 |
$wp_admin_bar->add_menu( [ |
| 208 |
'id' => 'ezcache-settings', |
| 209 |
'parent' => 'ezcache', |
| 210 |
'title' => __( 'Settings', 'ezcache' ), |
| 211 |
'href' => admin_url( 'admin.php?page=ezcache' ), |
| 212 |
] ); |
| 213 |
|
| 214 |
$wp_admin_bar->add_menu( [ |
| 215 |
'id' => 'ezcache-clear-cache', |
| 216 |
'parent' => 'ezcache', |
| 217 |
'title' => __( 'Clear Cache', 'ezcache' ), |
| 218 |
'href' => wp_nonce_url( admin_url( 'admin-post.php?action=wpb_clear_cache&_wp_http_referer=' . $referer ), 'wpb-clear-cache' ), |
| 219 |
] ); |
| 220 |
} |
| 221 |
|
| 222 |
/** |
| 223 |
* Make sure we have a session |
| 224 |
*/ |
| 225 |
function start_session() { |
| 226 |
if ( session_status() == PHP_SESSION_NONE ) { |
| 227 |
session_start(); |
| 228 |
} |
| 229 |
} |
| 230 |
|
| 231 |
/** |
| 232 |
* Register settings for the plugin |
| 233 |
*/ |
| 234 |
function register_settings() { |
| 235 |
register_setting( $this->plugin->plugin_settings_key . '_group', $this->plugin->plugin_settings_key ); |
| 236 |
} |
| 237 |
|
| 238 |
/** |
| 239 |
* Add the menu under the 'Settings' sidebar item |
| 240 |
*/ |
| 241 |
function register_menu() { |
| 242 |
global $submenu; |
| 243 |
|
| 244 |
add_menu_page( |
| 245 |
__( 'ezCache' ), |
| 246 |
__( 'ezCache' ), |
| 247 |
'manage_options', |
| 248 |
'ezcache', |
| 249 |
[ $this, 'settings_page' ], |
| 250 |
'data:image/svg+xml;base64,' . base64_encode( self::$svg ) |
| 251 |
); |
| 252 |
|
| 253 |
$urls = [ |
| 254 |
__( 'Statistics', 'ezcache' ) => '/', |
| 255 |
__( 'Settings', 'ezcache' ) => '/settings', |
| 256 |
__( 'Advanced Settings', 'ezcache' ) => '/advanced', |
| 257 |
__( 'License', 'ezcache' ) => '/license', |
| 258 |
]; |
| 259 |
|
| 260 |
if ( ! isset( $submenu['ezcache'] ) ) { |
| 261 |
$submenu['ezcache'] = []; |
| 262 |
} |
| 263 |
|
| 264 |
foreach ( $urls as $title => $url ) { |
| 265 |
$submenu['ezcache'][] = [ $title, 'manage_options', admin_url( 'admin.php?page=ezcache' ) . '#' . $url ]; |
| 266 |
} |
| 267 |
} |
| 268 |
|
| 269 |
/** |
| 270 |
* Render the settings page |
| 271 |
*/ |
| 272 |
function settings_page() { |
| 273 |
$trans = $this->getJstraslations(); |
| 274 |
?> |
| 275 |
<div class="wrap"><h1 aria-hidden="true"><!-- WordPress notices trap --></h1></div> |
| 276 |
<div id="ezcache-options" class="wrap ezcache-options"> |
| 277 |
<!--suppress HtmlUnknownTag --> |
| 278 |
<ezc-options> |
| 279 |
<div class="ezcache-options--preload" aria-hidden="true"> |
| 280 |
<header class="ezcache-header"> |
| 281 |
<h1> |
| 282 |
<svg viewBox="0 0 360 68" version="1.1" xmlns="http://www.w3.org/2000/svg" |
| 283 |
xml:space="preserve" fill-rule="evenodd" |
| 284 |
clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" class="logo"> |
| 285 |
<g id="Camada-1" fill-rule="nonzero"> |
| 286 |
<path d="M51.154 53.752H13.691V37.239h22.056l9.144-12.855h-31.2V13.378H52.72L62.235 0H0v67.338h45.91l5.244-13.586z" |
| 287 |
fill="#1e1e1e"></path> |
| 288 |
<path d="M72.596 24.521h21.219L53.38 67.338h58.228V54.797H80.976l39.09-41.42H80.389l-7.794 11.144z" |
| 289 |
fill="#1e1e1e"></path> |
| 290 |
<path d="M57.073 13.378L40.101 37.239h21.603l-12.568 30.1 37.678-39.923H66.051l9.985-14.038H57.073z" |
| 291 |
fill="#fc0"></path> |
| 292 |
<path d="M57.074 13.378L40.102 37.239h21.602L49.136 67.338l23.038-35.036H52.435l14.12-18.924h-9.481z" |
| 293 |
fill="url(#_Linear1)"></path> |
| 294 |
<path d="M200.202 47.707h-19.221l9.611-22.993 9.61 22.993zm8.279 19.631h10.645l-23.212-53.965h-10.645l-23.213 53.965h10.572l4.435-10.163h27.056l4.362 10.163z" |
| 295 |
fill="gray"></path> |
| 296 |
<path d="M313.541 67.338V13.373h-9.684V36.29h-25.43V13.373h-9.758v53.965h9.758v-22.03h25.43v22.03h9.684z" |
| 297 |
fill="gray"></path> |
| 298 |
<path d="M360 57.728h-29.053V44.865h16.255l3.911-9.092h-20.166V22.835h24.983l4.07-9.461h-38.736v53.964H360v-9.61z" |
| 299 |
fill="gray"></path> |
| 300 |
<path d="M143.812 13.373h15.746v9.314h-15.746c-12.493 0-17.89 9.315-17.815 17.964.073 8.575 5.026 17.52 17.815 17.52h15.659l-3.943 9.167H143.812c-19.22 0-27.352-13.233-27.426-26.687-.073-13.528 8.723-27.278 27.426-27.278z" |
| 301 |
fill="gray"></path> |
| 302 |
<path d="M245.201 13.373h15.746v9.314H245.201c-12.493 0-17.89 9.315-17.816 17.964.074 8.575 5.027 17.52 17.816 17.52h15.746v9.167H245.201c-19.221 0-27.352-13.233-27.426-26.687-.074-13.528 8.723-27.278 27.426-27.278" |
| 303 |
fill="gray"></path> |
| 304 |
</g> |
| 305 |
<defs> |
| 306 |
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" |
| 307 |
gradientUnits="userSpaceOnUse" |
| 308 |
gradientTransform="matrix(32.072 0 0 -32.072 40.101 40.358)"> |
| 309 |
<stop offset="0" stop-color="#deb203" stop-opacity="1"></stop> |
| 310 |
<stop offset="1" stop-color="#fc0" stop-opacity="1"></stop> |
| 311 |
</linearGradient> |
| 312 |
</defs> |
| 313 |
</svg> |
| 314 |
</h1> |
| 315 |
</header> |
| 316 |
<div class="row"> |
| 317 |
<div class="col-12 order-first col-sm-4 col-md-3 col-xl-2"> |
| 318 |
<nav class="ezcache-nav"> |
| 319 |
<a href="#" class="nav-item"> |
| 320 |
<?php echo str_repeat( 'â– ', mb_strlen( $trans['stats'] ) ); ?> |
| 321 |
</a> |
| 322 |
<a href="#" class="nav-item"> |
| 323 |
<?php echo str_repeat( 'â– ', mb_strlen( $trans['settings'] ) ); ?> |
| 324 |
</a> |
| 325 |
<a href="#" class="nav-item"> |
| 326 |
<?php echo str_repeat( 'â– ', mb_strlen( $trans['advanced_settings'] ) ); ?> |
| 327 |
</a> |
| 328 |
<a href="#" class="nav-item"> |
| 329 |
<?php echo str_repeat( 'â– ', mb_strlen( $trans['license'] ) ); ?> |
| 330 |
</a> |
| 331 |
</nav> |
| 332 |
</div> |
| 333 |
<div class="col-12 col-sm-4 order-sm-last col-md-3 col-xl-2 mb-4"> |
| 334 |
<div class="ezcache-nav mt-1"> |
| 335 |
<button type="button" class="wpb-button" disabled> |
| 336 |
<svg viewBox="0 0 24 24"> |
| 337 |
<path d="M19,8L15,12H18A6,6 0 0,1 12,18C11,18 10.03,17.75 9.2,17.3L7.74,18.76C8.97,19.54 10.43,20 12,20A8,8 0 0,0 20,12H23M6,12A6,6 0 0,1 12,6C13,6 13.97,6.25 14.8,6.7L16.26,5.24C15.03,4.46 13.57,4 12,4A8,8 0 0,0 4,12H1L5,16L9,12"></path> |
| 338 |
</svg> |
| 339 |
<?php echo str_repeat( 'â– ', mb_strlen( $trans['clear_cache'] ) ); ?> |
| 340 |
</button> |
| 341 |
<a href="#" target="_blank" class="mt-2 wpb-button wpb-button-outlined disabled"> |
| 342 |
<svg viewBox="0 0 24 24"> |
| 343 |
<path d="M12,16A3,3 0 0,1 9,13C9,11.88 9.61,10.9 10.5,10.39L20.21,4.77L14.68,14.35C14.18,15.33 13.17,16 12,16M12,3C13.81,3 15.5,3.5 16.97,4.32L14.87,5.53C14,5.19 13,5 12,5A8,8 0 0,0 4,13C4,15.21 4.89,17.21 6.34,18.65H6.35C6.74,19.04 6.74,19.67 6.35,20.06C5.96,20.45 5.32,20.45 4.93,20.07V20.07C3.12,18.26 2,15.76 2,13A10,10 0 0,1 12,3M22,13C22,15.76 20.88,18.26 19.07,20.07V20.07C18.68,20.45 18.05,20.45 17.66,20.06C17.27,19.67 17.27,19.04 17.66,18.65V18.65C19.11,17.2 20,15.21 20,13C20,12 19.81,11 19.46,10.1L20.67,8C21.5,9.5 22,11.18 22,13Z"></path> |
| 344 |
</svg> |
| 345 |
<?php echo str_repeat( 'â– ', mb_strlen( $trans['run_speed_test'] ) ); ?> |
| 346 |
</a> |
| 347 |
</div> |
| 348 |
<div class="side-links"> |
| 349 |
<a href="#" target="_blank" class="side-links-item disabled"> |
| 350 |
<?php echo str_repeat( 'â– ', mb_strlen( $trans['documentation'] ) ); ?> |
| 351 |
</a> |
| 352 |
<a href="#" target="_blank" class="side-links-item disabled"> |
| 353 |
<?php echo str_repeat( 'â– ', mb_strlen( $trans['knowledgebase'] ) ); ?> |
| 354 |
</a> |
| 355 |
</div> |
| 356 |
</div> |
| 357 |
<div class="col-12 col-sm-4 order-sm-first col-md-6 col-xl-8"> |
| 358 |
<section class="ezcache-main"> |
| 359 |
<div> |
| 360 |
<header class="ezcache-screen-header"> |
| 361 |
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> |
| 362 |
</svg> |
| 363 |
<?php echo str_repeat( 'â– ', mb_strlen( $trans['stats'] ) ); ?> |
| 364 |
</header> |
| 365 |
<div class="row"> |
| 366 |
</div> |
| 367 |
</div> |
| 368 |
</section> |
| 369 |
</div> |
| 370 |
</div> |
| 371 |
</div> |
| 372 |
<noscript> |
| 373 |
<p class="text-center"> |
| 374 |
<strong><?php esc_html_e( 'This application requires JavaScript to run', 'ezcache' ); ?></strong> |
| 375 |
</p> |
| 376 |
</noscript> |
| 377 |
</ezc-options> |
| 378 |
</div> |
| 379 |
<?php |
| 380 |
} |
| 381 |
|
| 382 |
/** |
| 383 |
* Queue up the options page scripts |
| 384 |
*/ |
| 385 |
public function enqueue_scripts() { |
| 386 |
$screen = get_current_screen(); |
| 387 |
|
| 388 |
if ( 'toplevel_page_ezcache' != $screen->id ) { |
| 389 |
return; |
| 390 |
} |
| 391 |
|
| 392 |
$ver = defined( 'WP_DEBUG' ) && WP_DEBUG ? time() : $this->plugin->plugin_version; |
| 393 |
|
| 394 |
wp_enqueue_script( 'ezcache-options', $this->plugin->plugin_url . '/assets/dist/js/options.js', [], $ver, true ); |
| 395 |
wp_enqueue_style( 'ezcache-options', $this->plugin->plugin_url . '/assets/dist/css/options.css', [], $ver ); |
| 396 |
|
| 397 |
wp_localize_script( 'ezcache-options', 'ezcache', [ |
| 398 |
'assets_url' => esc_url_raw( EZCACHE_URL . '/assets' ), |
| 399 |
'ajax_url' => esc_url_raw( admin_url( 'admin-ajax.php' ) ), |
| 400 |
'rest_url' => esc_url_raw( rest_url() ), |
| 401 |
'ajax_nonce' => wp_create_nonce( 'ezcache-options' ), |
| 402 |
'rest_nonce' => wp_create_nonce( 'wp_rest' ), |
| 403 |
'is_rtl' => is_rtl(), |
| 404 |
'site_url' => esc_url_raw( untrailingslashit( site_url() ) ), |
| 405 |
'trans' => $this->getJstraslations(), |
| 406 |
'is_https_2' => $this->check_https_2_support(), |
| 407 |
] ); |
| 408 |
} |
| 409 |
|
| 410 |
/** |
| 411 |
* Check if current website supports HTTPS/2 |
| 412 |
* |
| 413 |
* @return bool |
| 414 |
*/ |
| 415 |
protected function check_https_2_support() { |
| 416 |
if ( ! is_ssl() ) { |
| 417 |
return false; |
| 418 |
} |
| 419 |
|
| 420 |
$supports = get_transient( 'ezcache_https_2_support' ); |
| 421 |
|
| 422 |
if ( ! $supports ) { |
| 423 |
$response = wp_safe_remote_head( home_url(), [ |
| 424 |
'httpversion' => '2.0' |
| 425 |
] ); |
| 426 |
$response = $response['http_response']->get_response_object(); |
| 427 |
$supports = $response->protocol_version == 2; |
| 428 |
|
| 429 |
set_transient( 'ezcache_https_2_support', [ 'has_support' => $supports ], DAY_IN_SECONDS ); |
| 430 |
} |
| 431 |
|
| 432 |
return isset( $supports['has_support'] ) ? $supports['has_support'] : false; |
| 433 |
} |
| 434 |
|
| 435 |
/** |
| 436 |
* Get the trnaslations required for the javascript frontend |
| 437 |
* |
| 438 |
* @return array |
| 439 |
*/ |
| 440 |
protected function getJstraslations() { |
| 441 |
return [ |
| 442 |
'ezcache' => __( 'ezCache', 'ezcache' ), |
| 443 |
'enabled' => __( 'Enabled', 'ezcache' ), |
| 444 |
'disabled' => __( 'Disabled', 'ezcache' ), |
| 445 |
'run_speed_test' => __( 'Run a Speed Test', 'ezcache' ), |
| 446 |
'save_settings' => __( 'Save Settings', 'ezcache' ), |
| 447 |
'settings_saved' => __( 'Settings updated.', 'ezcache' ), |
| 448 |
'error_saving_settings' => __( 'Could not save settings.', 'ezcache' ), |
| 449 |
'clear_cache' => __( 'Clear Cache', 'ezcache' ), |
| 450 |
'cache_cleared' => __( 'Cache has been cleared.', 'ezcache' ), |
| 451 |
'settings' => __( 'Settings', 'ezcache' ), |
| 452 |
'advanced_settings' => __( 'Advanced Settings', 'ezcache' ), |
| 453 |
'stats' => __( 'Statistics', 'ezcache' ), |
| 454 |
'license' => __( 'License', 'ezcache' ), |
| 455 |
'recommended' => __( 'Recommended', 'ezcache' ), |
| 456 |
'basic_settings' => __( 'Basic Settings', 'ezcache' ), |
| 457 |
'no_cache_known_users' => __( 'Don\'t cache pages for known users', 'ezcache' ), |
| 458 |
'no_cache_known_users_description' => __( 'This disables cache for logged in users or visitors who left comments on posts.', 'ezcache' ), |
| 459 |
'cache_expiry' => __( 'Cache Expiry', 'ezcache' ), |
| 460 |
'cache_lifetime' => __( 'Cache Timeout', 'ezcache' ), |
| 461 |
'cache_lifetime_description' => __( 'How long to keep the cached data, the recommended and effective starting point is one day.', 'ezcache' ), |
| 462 |
'cache_expiry_interval' => __( 'Check for stale cache every', 'ezcache' ), |
| 463 |
'cache_expiry_interval_description' => __( 'Automatically check for stale cache files and delete them at a set interval.', 'ezcache' ), |
| 464 |
'interval' => __( 'Interval', 'ezcache' ), |
| 465 |
'every' => __( 'Every', 'ezcache' ), |
| 466 |
'seconds' => __( 'Seconds', 'ezcache' ), |
| 467 |
'cache_schedule_type_time' => __( 'At Time', 'ezcache' ), |
| 468 |
'cache_schedule_interval' => __( 'Interval', 'ezcache' ), |
| 469 |
'weekly' => __( 'Weekly', 'ezcache' ), |
| 470 |
'daily' => __( 'Daily', 'ezcache' ), |
| 471 |
'twicedaily' => __( 'Twice Daily', 'ezcache' ), |
| 472 |
'hourly' => __( 'Hourly', 'ezcache' ), |
| 473 |
'at' => __( 'At', 'ezcache' ), |
| 474 |
'cache_bypass' => __( 'Cache Bypass', 'ezcache' ), |
| 475 |
'no_cache_query_params' => __( 'Don\'t cache pages where the URLs contain parameters in the query string', 'ezcache' ), |
| 476 |
'no_cache_query_params_description' => __( 'Don\'t save cache when the URL contains query string parameters, such as ?page_id=15 at the end of the URL.', 'ezcache' ), |
| 477 |
'separate_mobile_cache' => __( 'Separate cache for mobile devices', 'ezcache' ), |
| 478 |
'separate_mobile_cache_description' => __( 'Save separate cache files for mobile browsers and a separate file for desktop browsers, you should only enable this option if your theme is not responsive and you use a theme or a plugin that produces a separate mobile version of the website.', 'ezcache' ), |
| 479 |
'cache_clear_on_post_edit' => __( 'Clear cache when a post or page is published or updated', 'ezcache' ), |
| 480 |
'cache_clear_on_post_edit_description' => __( 'Make sure your visitors read the latest posts by clearing the cache when you update or publish a post.', 'ezcache' ), |
| 481 |
'bypass_cache_title' => __( 'Disable caching for the following pages', 'ezcache' ), |
| 482 |
'bypass_cache_single' => __( 'Single Posts', 'ezcache' ), |
| 483 |
'bypass_cache_pages' => __( 'Pages', 'ezcache' ), |
| 484 |
'bypass_cache_frontpage' => __( 'Front Page', 'ezcache' ), |
| 485 |
'bypass_cache_home' => __( 'Home', 'ezcache' ), |
| 486 |
'bypass_cache_archives' => __( 'Archives', 'ezcache' ), |
| 487 |
'bypass_cache_tag' => __( 'Tags', 'ezcache' ), |
| 488 |
'bypass_cache_category' => __( 'Categories', 'ezcache' ), |
| 489 |
'bypass_cache_feed' => __( 'Feeds', 'ezcache' ), |
| 490 |
'bypass_cache_search' => __( 'Search Results', 'ezcache' ), |
| 491 |
'bypass_cache_author' => __( 'Author Pages', 'ezcache' ), |
| 492 |
'rejected_uri' => __( 'Links (URLs) which will never get cached', 'ezcache' ), |
| 493 |
'rejected_uri_description' => __( 'Do not serve cached content if the URL matches any link in the following list', 'ezcache' ), |
| 494 |
'rejected_uri_wildcard' => __( 'The domain part of the URL will be stripped automatically. Use * wildcard character to match multiple characters at this position (eg. /product/*).', 'ezcache' ), |
| 495 |
'rejected_user_agent' => __( 'User Agents which will never receive cached data', 'ezcache' ), |
| 496 |
'rejected_user_agent_description' => __( 'Do not serve cached content to the following useragents', 'ezcache' ), |
| 497 |
'n_minutes' => __( '%s Minutes', 'ezcache' ), |
| 498 |
'n_hours' => __( '%s Hours', 'ezcache' ), |
| 499 |
'n_days' => __( '%s Days', 'ezcache' ), |
| 500 |
'never_expire' => __( 'Never Expire', 'ezcache' ), |
| 501 |
'cache_disabled' => __( 'WP_CACHE is disabled in your wp-config.php, caching will not work.', 'ezcache' ), |
| 502 |
'adv_cache_not_exists' => __( 'advanced-cache.php is missing from your wp-content folder, caching will not work.', 'ezcache' ), |
| 503 |
'plugin_badly_installed' => __( 'Plugin is not installed properly, please reinstall, caching will not work.', 'ezcache' ), |
| 504 |
'desktop' => _x( 'Desktop', 'statistics block title', 'ezcache' ), |
| 505 |
'mobile' => _x( 'Mobile', 'statistics block title', 'ezcache' ), |
| 506 |
'expired' => _x( 'Expire Cache', 'statistics block title', 'ezcache' ), |
| 507 |
'javascript' => _x( 'JavaScript Files', 'statistics block title', 'ezcache' ), |
| 508 |
'css' => _x( 'CSS Files', 'statistics block title', 'ezcache' ), |
| 509 |
'webp_images' => _x( 'WebP Images', 'statistics block title', 'ezcache' ), |
| 510 |
'cache_usage' => __( 'ezCache Cache Usage', 'ezcache' ), |
| 511 |
'webp_stats_description' => __( 'Images optimized with WebP.', 'ezcache' ), |
| 512 |
'cache_bypass_settings' => _x( 'Cache Bypass', 'settings block title', 'ezcache' ), |
| 513 |
'cache_settings' => _x( 'Caching', 'settings block title', 'ezcache' ), |
| 514 |
'file_optimizations_settings' => _x( 'File Optimizations', 'settings block title', 'ezcache' ), |
| 515 |
'cache_expiry_settings' => _x( 'Cache Expiration', 'settings block title', 'ezcache' ), |
| 516 |
'optimize_google_fonts' => __( 'Optimize Google fonts', 'ezcache' ), |
| 517 |
'optimize_google_fonts_description' => __( 'Combine multiple Google Fonts declerations into one.', 'ezcache' ), |
| 518 |
'minify_html' => __( 'Minify HTML', 'ezcache' ), |
| 519 |
'minify_html_description' => __( 'Minify the cached HTML to make cached files smaller.', 'ezcache' ), |
| 520 |
'minify_inline_js' => __( 'Minify Inline JavaScript', 'ezcache' ), |
| 521 |
'minify_inline_js_description' => __( 'Include JavaScript embedded in the HTML in the minification process.', 'ezcache' ), |
| 522 |
'minify_inline_css' => __( 'Minify Inline CSS', 'ezcache' ), |
| 523 |
'minify_inline_css_description' => __( 'Include CSS embedded in the HTML in the minification process.', 'ezcache' ), |
| 524 |
'minify_js' => __( 'Minify JavaScript', 'ezcache' ), |
| 525 |
'minify_js_description' => __( 'Minify JavaScript files to reduce their size.', 'ezcache' ), |
| 526 |
'combine_head_js' => __( 'Combine JavaScript in Head', 'ezcache' ), |
| 527 |
'combine_head_js_description' => __( 'Combine multiple JavaScript files found in the head section of the HTML into one file.', 'ezcache' ), |
| 528 |
'combine_body_js' => __( 'Combine JavaScript in Body', 'ezcache' ), |
| 529 |
'combine_body_js_description' => __( 'Combine multiple JavaScript files found in the body section of the HTML into one file.', 'ezcache' ), |
| 530 |
'minify_css' => __( 'Minify CSS', 'ezcache' ), |
| 531 |
'minify_css_description' => __( 'Minify CSS files to reduce their size.', 'ezcache' ), |
| 532 |
'combine_css' => __( 'Combine CSS', 'ezcache' ), |
| 533 |
'combine_css_description' => __( 'Combine multiple CSS files into one to reduce HTTP requests.', 'ezcache' ), |
| 534 |
'not_recommended_https2' => __( 'Your server supports HTTP/2 which benefits from having this option kept disabled', 'ezcache' ), |
| 535 |
'enable_webp_support' => __( 'Optimize Images With WebP', 'ezcache' ), |
| 536 |
'enable_webp_support_description' => __( 'WebP is a modern image format that provides superior lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs, and 25-34% smaller than comparable JPEG images.', 'ezcache' ), |
| 537 |
'requries_premium_license' => __( 'Requires a premium license', 'ezcache' ), |
| 538 |
|
| 539 |
'documentation' => __( 'Documentation', 'ezcache' ), |
| 540 |
'knowledgebase' => __( 'Knowledgebase', 'ezcache' ), |
| 541 |
'upress_ad' => __( 'uPress Premium WordPress Hosting', 'ezcache' ), |
| 542 |
'upress_domain' => __( 'www.upress.io', 'ezcache' ), |
| 543 |
'upress_ad_link' => __( 'https://www.upress.io/?utm_source=wordpress&utm_medium=cpc&utm_campaign=ezcache', 'ezcache' ), |
| 544 |
'speed_test_url' => __( 'https://speedom.net/?url=%s&location=US-NY&utm_source=wordpress&utm_medium=cpc&utm_campaign=ezcache', 'ezcache' ), |
| 545 |
|
| 546 |
'rejected_user_agent_placeholder' => _x( 'Googlebot', 'user agent example', 'ezcache' ), |
| 547 |
'rejected_uri_placeholder' => _x( '/products/*', 'rejected uri example', 'ezcache' ), |
| 548 |
|
| 549 |
'css_stats_description' => __( 'Optimized and cached CSS files.', 'ezcache' ), |
| 550 |
'javascript_stats_description' => __( 'Optimized and cached JavaScript files.', 'ezcache' ), |
| 551 |
'expired_stats_description' => __( 'Cache data that has expired and waiting to be cleaned up.', 'ezcache' ), |
| 552 |
'mobile_stats_description' => __( 'Cache data for pages viewed from mobile devices.', 'ezcache' ), |
| 553 |
'desktop_stats_description' => __( 'Cache data for pages viewed from desktop computers.', 'ezcache' ), |
| 554 |
|
| 555 |
'license_key' => __( 'License Key', 'ezcache' ), |
| 556 |
'license_key_description' => __( 'ezCache pro license will allow you to use the WebP image optimization without limits.', 'ezcache' ), |
| 557 |
'deactivate_license' => __( 'Deactivate License', 'ezcache' ), |
| 558 |
'activate_license' => __( 'Activate License', 'ezcache' ), |
| 559 |
'license_valid' => __( 'License is valid', 'ezcache' ), |
| 560 |
'license_invalid' => __( 'License is invalid', 'ezcache' ), |
| 561 |
'license_expires_at' => __( 'License expires at %s', 'ezcache' ), |
| 562 |
'unknown' => __( 'Unknown', 'ezcache' ), |
| 563 |
|
| 564 |
'license_status' => __( 'Status', 'ezcache' ), |
| 565 |
'license_details' => __( 'License Details', 'ezcache' ), |
| 566 |
'license_type' => __( 'License Type', 'ezcache' ), |
| 567 |
'trial_license' => _x( 'Trial', 'license type', 'ezcache' ), |
| 568 |
'regular_license' => _x( 'Pro', 'license type', 'ezcache' ), |
| 569 |
'expires_in' => __( 'Expires In', 'ezcache' ), |
| 570 |
'expires_at' => __( 'Expires At', 'ezcache' ), |
| 571 |
'uses_left' => __( 'Convertions Left', 'ezcache' ), |
| 572 |
'trial_not_started' => __( '%s days after first usage', 'ezcache' ), |
| 573 |
'purchase_license' => __( 'Get a Pro License', 'ezcache' ), |
| 574 |
'license_expired' => __( 'Expired', 'ezcache' ), |
| 575 |
'no_expiry_while_upress_client' => __( 'Will not expire while hosted on uPress', 'ezcache' ), |
| 576 |
]; |
| 577 |
} |
| 578 |
|
| 579 |
/** |
| 580 |
* Show cache status admin notices when needed |
| 581 |
*/ |
| 582 |
function maybe_show_advanced_cache_notice() { |
| 583 |
$webp_queue = get_site_option( 'ezcache_convert_images_to_webp_reprocess_queue' ); |
| 584 |
if ( ! $webp_queue ) { |
| 585 |
$webp_queue = []; |
| 586 |
} |
| 587 |
$count_pending = array_reduce( $webp_queue, function ( $count, $images ) { |
| 588 |
return $count + count( $images ); |
| 589 |
}, 0 ); |
| 590 |
|
| 591 |
if ( $count_pending > 0 ) { |
| 592 |
echo '<div class="notice notice-info"><p><strong>' . esc_html__( 'ezCache', 'ezcache' ) . ':</strong> ' . sprintf( esc_html__( 'WebP Processing is currently running, %d images remaining.', 'ezcache' ), $count_pending ) . '</p></div>'; |
| 593 |
} |
| 594 |
|
| 595 |
if ( isset( $_SESSION['EZCACHE_REPAIRED'] ) ) { |
| 596 |
unset( $_SESSION['EZCACHE_REPAIRED'] ); |
| 597 |
echo '<div class="notice notice-success is-dismissible"><p>' . esc_html__( 'ezCache installation repaired.', 'ezcache' ) . '</p></div>'; |
| 598 |
|
| 599 |
return; |
| 600 |
} |
| 601 |
|
| 602 |
$status = $this->plugin->ezcache->get_status(); |
| 603 |
|
| 604 |
$messages = []; |
| 605 |
if ( ! $status['cache_enabled'] ) { |
| 606 |
$messages[] = __( 'WP_CACHE is disabled in your wp-config.php', 'ezcache' ); |
| 607 |
} |
| 608 |
if ( ! $status['adv_cache_exists'] ) { |
| 609 |
$messages[] = __( 'advanced-cache.php is missing from your wp-content folder', 'ezcache' ); |
| 610 |
} |
| 611 |
if ( $status['adv_cache_exists'] && ! $status['correct_cache_exists'] ) { |
| 612 |
$messages[] = __( 'Invalid advanced-cache.php file detected', 'ezcache' ); |
| 613 |
} |
| 614 |
|
| 615 |
if ( ! count( $messages ) ) { |
| 616 |
return; |
| 617 |
} |
| 618 |
|
| 619 |
$referer = rawurlencode( wp_unslash( remove_query_arg( 'fl_builder', $_SERVER['REQUEST_URI'] ) ) ); |
| 620 |
|
| 621 |
echo '<div class="notice notice-error"><p>'; |
| 622 |
esc_html_e( 'ezCache detected the following configuration problems:', 'ezcache' ); |
| 623 |
echo '<br>'; |
| 624 |
echo implode( ', ', $messages ); |
| 625 |
echo '<br>'; |
| 626 |
echo '<a class="button button-sm button-secondary" href="' . wp_nonce_url( admin_url( 'admin-post.php?action=wpb_repair_install&_wp_http_referer=' . $referer ), 'wpb-repair-install' ) . '">' . esc_html__( 'Repair ezCache Installation', 'ezcache' ) . '</a>'; |
| 627 |
echo '</p></div>'; |
| 628 |
} |
| 629 |
|
| 630 |
function admin_clear_cache() { |
| 631 |
if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'wpb-clear-cache' ) ) { |
| 632 |
wp_nonce_ays( 'wpb-clear-cache' ); |
| 633 |
} |
| 634 |
|
| 635 |
$this->plugin->ezcache->clear_cache(); |
| 636 |
|
| 637 |
wp_redirect( wp_get_referer() ); |
| 638 |
exit; |
| 639 |
} |
| 640 |
|
| 641 |
/** |
| 642 |
* Repaire the plugin installation when POST variable is set |
| 643 |
*/ |
| 644 |
function admin_repair_installation() { |
| 645 |
if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'wpb-repair-install' ) ) { |
| 646 |
wp_nonce_ays( 'wpb-repair-install' ); |
| 647 |
} |
| 648 |
|
| 649 |
$this->plugin->activation_hook(); |
| 650 |
|
| 651 |
$_SESSION['EZCACHE_REPAIRED'] = true; |
| 652 |
wp_redirect( wp_get_referer() ); |
| 653 |
exit; |
| 654 |
} |
| 655 |
} |
| 656 |
|