PluginProbe
ezCache / 1.2.1
ezCache v1.2.1
2.6.5 2.6.4 2.6.2 2.6.3 2.6.1 2.6.0 2.5.6 2.5.5 2.5.4 2.5.3 2.5.2 2.5.1 2.5 2.2.1 2.2.2 trunk 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.3 1.3.1 1.3.10 1.3.11 All 49 releases
ezcache / includes / Admin.php

Admin.php in ezCache 1.2.1, at includes/Admin.php

660 lines 32.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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
427 $supports = false;
428 if ( ! is_wp_error( $response ) ) {
429 $response = $response['http_response']->get_response_object();
430 $supports = $response->protocol_version == 2;
431 }
432
433 set_transient( 'ezcache_https_2_support', [ 'has_support' => $supports ], DAY_IN_SECONDS );
434 }
435
436 return isset( $supports['has_support'] ) ? $supports['has_support'] : false;
437 }
438
439 /**
440 * Get the trnaslations required for the javascript frontend
441 *
442 * @return array
443 */
444 protected function getJstraslations() {
445 return [
446 'ezcache' => __( 'ezCache', 'ezcache' ),
447 'enabled' => __( 'Enabled', 'ezcache' ),
448 'disabled' => __( 'Disabled', 'ezcache' ),
449 'run_speed_test' => __( 'Run a Speed Test', 'ezcache' ),
450 'save_settings' => __( 'Save Settings', 'ezcache' ),
451 'settings_saved' => __( 'Settings updated.', 'ezcache' ),
452 'error_saving_settings' => __( 'Could not save settings.', 'ezcache' ),
453 'clear_cache' => __( 'Clear Cache', 'ezcache' ),
454 'cache_cleared' => __( 'Cache has been cleared.', 'ezcache' ),
455 'settings' => __( 'Settings', 'ezcache' ),
456 'advanced_settings' => __( 'Advanced Settings', 'ezcache' ),
457 'stats' => __( 'Statistics', 'ezcache' ),
458 'license' => __( 'License', 'ezcache' ),
459 'recommended' => __( 'Recommended', 'ezcache' ),
460 'basic_settings' => __( 'Basic Settings', 'ezcache' ),
461 'no_cache_known_users' => __( 'Don\'t cache pages for known users', 'ezcache' ),
462 'no_cache_known_users_description' => __( 'This disables cache for logged in users or visitors who left comments on posts.', 'ezcache' ),
463 'cache_expiry' => __( 'Cache Expiry', 'ezcache' ),
464 'cache_lifetime' => __( 'Cache Timeout', 'ezcache' ),
465 'cache_lifetime_description' => __( 'How long to keep the cached data, the recommended and effective starting point is one day.', 'ezcache' ),
466 'cache_expiry_interval' => __( 'Check for stale cache every', 'ezcache' ),
467 'cache_expiry_interval_description' => __( 'Automatically check for stale cache files and delete them at a set interval.', 'ezcache' ),
468 'interval' => __( 'Interval', 'ezcache' ),
469 'every' => __( 'Every', 'ezcache' ),
470 'seconds' => __( 'Seconds', 'ezcache' ),
471 'cache_schedule_type_time' => __( 'At Time', 'ezcache' ),
472 'cache_schedule_interval' => __( 'Interval', 'ezcache' ),
473 'weekly' => __( 'Weekly', 'ezcache' ),
474 'daily' => __( 'Daily', 'ezcache' ),
475 'twicedaily' => __( 'Twice Daily', 'ezcache' ),
476 'hourly' => __( 'Hourly', 'ezcache' ),
477 'at' => __( 'At', 'ezcache' ),
478 'cache_bypass' => __( 'Cache Bypass', 'ezcache' ),
479 'no_cache_query_params' => __( 'Don\'t cache pages where the URLs contain parameters in the query string', 'ezcache' ),
480 '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' ),
481 'separate_mobile_cache' => __( 'Separate cache for mobile devices', 'ezcache' ),
482 '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' ),
483 'cache_clear_on_post_edit' => __( 'Clear cache when a post or page is published or updated', 'ezcache' ),
484 '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' ),
485 'bypass_cache_title' => __( 'Disable caching for the following pages', 'ezcache' ),
486 'bypass_cache_single' => __( 'Single Posts', 'ezcache' ),
487 'bypass_cache_pages' => __( 'Pages', 'ezcache' ),
488 'bypass_cache_frontpage' => __( 'Front Page', 'ezcache' ),
489 'bypass_cache_home' => __( 'Home', 'ezcache' ),
490 'bypass_cache_archives' => __( 'Archives', 'ezcache' ),
491 'bypass_cache_tag' => __( 'Tags', 'ezcache' ),
492 'bypass_cache_category' => __( 'Categories', 'ezcache' ),
493 'bypass_cache_feed' => __( 'Feeds', 'ezcache' ),
494 'bypass_cache_search' => __( 'Search Results', 'ezcache' ),
495 'bypass_cache_author' => __( 'Author Pages', 'ezcache' ),
496 'rejected_uri' => __( 'Links (URLs) which will never get cached', 'ezcache' ),
497 'rejected_uri_description' => __( 'Do not serve cached content if the URL matches any link in the following list', 'ezcache' ),
498 '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' ),
499 'rejected_user_agent' => __( 'User Agents which will never receive cached data', 'ezcache' ),
500 'rejected_user_agent_description' => __( 'Do not serve cached content to the following useragents', 'ezcache' ),
501 'n_minutes' => __( '%s Minutes', 'ezcache' ),
502 'n_hours' => __( '%s Hours', 'ezcache' ),
503 'n_days' => __( '%s Days', 'ezcache' ),
504 'never_expire' => __( 'Never Expire', 'ezcache' ),
505 'cache_disabled' => __( 'WP_CACHE is disabled in your wp-config.php, caching will not work.', 'ezcache' ),
506 'adv_cache_not_exists' => __( 'advanced-cache.php is missing from your wp-content folder, caching will not work.', 'ezcache' ),
507 'plugin_badly_installed' => __( 'Plugin is not installed properly, please reinstall, caching will not work.', 'ezcache' ),
508 'desktop' => _x( 'Desktop', 'statistics block title', 'ezcache' ),
509 'mobile' => _x( 'Mobile', 'statistics block title', 'ezcache' ),
510 'expired' => _x( 'Expire Cache', 'statistics block title', 'ezcache' ),
511 'javascript' => _x( 'JavaScript Files', 'statistics block title', 'ezcache' ),
512 'css' => _x( 'CSS Files', 'statistics block title', 'ezcache' ),
513 'webp_images' => _x( 'WebP Images', 'statistics block title', 'ezcache' ),
514 'cache_usage' => __( 'ezCache Cache Usage', 'ezcache' ),
515 'webp_stats_description' => __( 'Images optimized with WebP.', 'ezcache' ),
516 'cache_bypass_settings' => _x( 'Cache Bypass', 'settings block title', 'ezcache' ),
517 'cache_settings' => _x( 'Caching', 'settings block title', 'ezcache' ),
518 'file_optimizations_settings' => _x( 'File Optimizations', 'settings block title', 'ezcache' ),
519 'cache_expiry_settings' => _x( 'Cache Expiration', 'settings block title', 'ezcache' ),
520 'optimize_google_fonts' => __( 'Optimize Google fonts', 'ezcache' ),
521 'optimize_google_fonts_description' => __( 'Combine multiple Google Fonts declerations into one.', 'ezcache' ),
522 'minify_html' => __( 'Minify HTML', 'ezcache' ),
523 'minify_html_description' => __( 'Minify the cached HTML to make cached files smaller.', 'ezcache' ),
524 'minify_inline_js' => __( 'Minify Inline JavaScript', 'ezcache' ),
525 'minify_inline_js_description' => __( 'Include JavaScript embedded in the HTML in the minification process.', 'ezcache' ),
526 'minify_inline_css' => __( 'Minify Inline CSS', 'ezcache' ),
527 'minify_inline_css_description' => __( 'Include CSS embedded in the HTML in the minification process.', 'ezcache' ),
528 'minify_js' => __( 'Minify JavaScript', 'ezcache' ),
529 'minify_js_description' => __( 'Minify JavaScript files to reduce their size.', 'ezcache' ),
530 'combine_head_js' => __( 'Combine JavaScript in Head', 'ezcache' ),
531 'combine_head_js_description' => __( 'Combine multiple JavaScript files found in the head section of the HTML into one file.', 'ezcache' ),
532 'combine_body_js' => __( 'Combine JavaScript in Body', 'ezcache' ),
533 'combine_body_js_description' => __( 'Combine multiple JavaScript files found in the body section of the HTML into one file.', 'ezcache' ),
534 'minify_css' => __( 'Minify CSS', 'ezcache' ),
535 'minify_css_description' => __( 'Minify CSS files to reduce their size.', 'ezcache' ),
536 'combine_css' => __( 'Combine CSS', 'ezcache' ),
537 'combine_css_description' => __( 'Combine multiple CSS files into one to reduce HTTP requests.', 'ezcache' ),
538 'not_recommended_https2' => __( 'Your server supports HTTP/2 which benefits from having this option kept disabled', 'ezcache' ),
539 'enable_webp_support' => __( 'Optimize Images With WebP', 'ezcache' ),
540 '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' ),
541 'requries_premium_license' => __( 'Requires a premium license', 'ezcache' ),
542
543 'documentation' => __( 'Documentation', 'ezcache' ),
544 'knowledgebase' => __( 'Knowledgebase', 'ezcache' ),
545 'upress_ad' => __( 'uPress Premium WordPress Hosting', 'ezcache' ),
546 'upress_domain' => __( 'www.upress.io', 'ezcache' ),
547 'upress_ad_link' => __( 'https://www.upress.io/?utm_source=wordpress&utm_medium=cpc&utm_campaign=ezcache', 'ezcache' ),
548 'speed_test_url' => __( 'https://speedom.net/?url=%s&location=US-NY&utm_source=wordpress&utm_medium=cpc&utm_campaign=ezcache', 'ezcache' ),
549
550 'rejected_user_agent_placeholder' => _x( 'Googlebot', 'user agent example', 'ezcache' ),
551 'rejected_uri_placeholder' => _x( '/products/*', 'rejected uri example', 'ezcache' ),
552
553 'css_stats_description' => __( 'Optimized and cached CSS files.', 'ezcache' ),
554 'javascript_stats_description' => __( 'Optimized and cached JavaScript files.', 'ezcache' ),
555 'expired_stats_description' => __( 'Cache data that has expired and waiting to be cleaned up.', 'ezcache' ),
556 'mobile_stats_description' => __( 'Cache data for pages viewed from mobile devices.', 'ezcache' ),
557 'desktop_stats_description' => __( 'Cache data for pages viewed from desktop computers.', 'ezcache' ),
558
559 'license_key' => __( 'License Key', 'ezcache' ),
560 'license_key_description' => __( 'ezCache pro license will allow you to use the WebP image optimization without limits.', 'ezcache' ),
561 'deactivate_license' => __( 'Deactivate License', 'ezcache' ),
562 'activate_license' => __( 'Activate License', 'ezcache' ),
563 'license_valid' => __( 'License is valid', 'ezcache' ),
564 'license_invalid' => __( 'License is invalid', 'ezcache' ),
565 'license_expires_at' => __( 'License expires at %s', 'ezcache' ),
566 'unknown' => __( 'Unknown', 'ezcache' ),
567
568 'license_status' => __( 'Status', 'ezcache' ),
569 'license_details' => __( 'License Details', 'ezcache' ),
570 'license_type' => __( 'License Type', 'ezcache' ),
571 'trial_license' => _x( 'Trial', 'license type', 'ezcache' ),
572 'regular_license' => _x( 'Pro', 'license type', 'ezcache' ),
573 'expires_in' => __( 'Expires In', 'ezcache' ),
574 'expires_at' => __( 'Expires At', 'ezcache' ),
575 'uses_left' => __( 'Convertions Left', 'ezcache' ),
576 'trial_not_started' => __( '%s days after first usage', 'ezcache' ),
577 'purchase_license' => __( 'Get a Pro License', 'ezcache' ),
578 'license_expired' => __( 'Expired', 'ezcache' ),
579 'no_expiry_while_upress_client' => __( 'Will not expire while hosted on uPress', 'ezcache' ),
580 ];
581 }
582
583 /**
584 * Show cache status admin notices when needed
585 */
586 function maybe_show_advanced_cache_notice() {
587 $webp_queue = get_site_option( 'ezcache_convert_images_to_webp_reprocess_queue' );
588 if ( ! $webp_queue ) {
589 $webp_queue = [];
590 }
591 $count_pending = array_reduce( $webp_queue, function ( $count, $images ) {
592 return $count + count( $images );
593 }, 0 );
594
595 if ( $count_pending > 0 ) {
596 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>';
597 }
598
599 if ( isset( $_SESSION['EZCACHE_REPAIRED'] ) ) {
600 unset( $_SESSION['EZCACHE_REPAIRED'] );
601 echo '<div class="notice notice-success is-dismissible"><p>' . esc_html__( 'ezCache installation repaired.', 'ezcache' ) . '</p></div>';
602
603 return;
604 }
605
606 $status = $this->plugin->ezcache->get_status();
607
608 $messages = [];
609 if ( ! $status['cache_enabled'] ) {
610 $messages[] = __( 'WP_CACHE is disabled in your wp-config.php', 'ezcache' );
611 }
612 if ( ! $status['adv_cache_exists'] ) {
613 $messages[] = __( 'advanced-cache.php is missing from your wp-content folder', 'ezcache' );
614 }
615 if ( $status['adv_cache_exists'] && ! $status['correct_cache_exists'] ) {
616 $messages[] = __( 'Invalid advanced-cache.php file detected', 'ezcache' );
617 }
618
619 if ( ! count( $messages ) ) {
620 return;
621 }
622
623 $referer = rawurlencode( wp_unslash( remove_query_arg( 'fl_builder', $_SERVER['REQUEST_URI'] ) ) );
624
625 echo '<div class="notice notice-error"><p>';
626 esc_html_e( 'ezCache detected the following configuration problems:', 'ezcache' );
627 echo '<br>';
628 echo implode( ', ', $messages );
629 echo '<br>';
630 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>';
631 echo '</p></div>';
632 }
633
634 function admin_clear_cache() {
635 if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'wpb-clear-cache' ) ) {
636 wp_nonce_ays( 'wpb-clear-cache' );
637 }
638
639 $this->plugin->ezcache->clear_cache();
640
641 wp_redirect( wp_get_referer() );
642 exit;
643 }
644
645 /**
646 * Repaire the plugin installation when POST variable is set
647 */
648 function admin_repair_installation() {
649 if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'wpb-repair-install' ) ) {
650 wp_nonce_ays( 'wpb-repair-install' );
651 }
652
653 $this->plugin->activation_hook();
654
655 $_SESSION['EZCACHE_REPAIRED'] = true;
656 wp_redirect( wp_get_referer() );
657 exit;
658 }
659 }
660