PluginProbe
BerqWP – All-In-One Optimization for Core Web Vitals, Cache, CDN, Images, CSS & JavaScript / 4.0.30
BerqWP – All-In-One Optimization for Core Web Vitals, Cache, CDN, Images, CSS & JavaScript v4.0.30
4.1.16 4.1.15 4.1.14 4.1.13 4.1.12 4.1.11 4.1.10 4.0.30 4.0.29 4.0.28 4.0.27 4.0.26 4.0.24 4.0.25 4.0.23 4.0.22 4.0.21 4.0.19 4.0.18 4.0.17 4.0.16 1.9.3 1.9.4 1.9.5 1.9.6 All 170 releases
searchpro / admin / tabs / dashboard.php

dashboard.php in BerqWP – All-In-One Optimization for Core Web Vitals, Cache, CDN, Images, CSS & JavaScript 4.0.30, at admin/tabs/dashboard.php

321 lines 17.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if (!defined('ABSPATH')) exit;
3
4 use BerqWP\BerqWP;
5
6 $post_types = get_option('berqwp_optimize_post_types');
7 $args = array(
8 'post_type' => $post_types,
9 'posts_per_page' => -1,
10 'fields' => 'ids',
11 'post_status' => 'publish'
12 );
13 $query = new WP_Query($args);
14 $pages_to_exclude = get_option('berq_exclude_urls', []);
15 $total_pages = (int) $query->found_posts - count($pages_to_exclude);
16 $optimized_pages = bwp_cached_pages_count();
17
18 if (get_option('show_on_front') !== 'page') {
19 $total_pages++;
20 }
21
22 if (empty($total_pages) || $total_pages <= 0) {
23 $cached_percentage = 0;
24 } else {
25 $cached_percentage = round(($optimized_pages / $total_pages) * 100, 2);
26
27 }
28 if ($cached_percentage > 100) {
29 $cached_percentage = 100;
30 }
31
32 if ($cached_percentage < 0) {
33 $cached_percentage = 0;
34 }
35
36 ?>
37 <div id="dashboard" <?php bwp_is_tab('dashboard'); ?>>
38 <h2 class="berq-tab-title">Dashboard</h2>
39
40 <?php if (bwp_show_docs() && $berqwp_can_use_cloud) { ?>
41 <div class="berq-info-box guide">
42 <div class="berq-box-content">
43 <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-book-marked-icon lucide-book-marked"><path d="M10 2v8l3-3 3 3V2"/><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20"/></svg></div>
44 <p><?php esc_html_e('Guide:', 'searchpro'); ?> <a href="https://berqwp.com/help-center/get-started-with-berqwp/" target="_blank"><?php esc_html_e('Get Started With BerqWP', 'searchpro'); ?></a></p>
45 </div>
46
47 </div>
48 <?php } ?>
49
50 <?php
51 if ($configs['optimization_method'] == 'cloud' && !bwp_is_home_cached()) {
52 bwp_dash_notification("We're currently building the cache for this website's homepage, which may take up to 5 minutes. Thank you for your patience, good things are worth the wait.", 'warning');
53 }
54 ?>
55
56 <div class="berq-info-box">
57 <h3 class="berq-box-title"><?php esc_html_e('Optimization Mode', 'searchpro'); ?></h3>
58 <div class="berq-box-content">
59 <p><?php esc_html_e("Optimization modes are optimization presets that allow you to balance your website between the best optimization score and website functionality stability.", 'searchpro'); ?>
60
61 <?php if (bwp_show_docs()) { ?>
62 <a href="https://berqwp.com/help-center/berqwp-optimization-modes/" target="_blank"><?php esc_html_e("Learn more", 'searchpro'); ?></a>
63 <?php } ?>
64 </p>
65
66 <div class="berqwp-optimization-modes-container">
67 <div class="berqwp-inline-radio-select">
68 <label>
69 <input type="radio" name="berq_opt_mode" value="1" <?php echo get_option('berq_opt_mode') == '1' ? 'checked' : ''; ?>>
70 <div>
71 <?php esc_html_e('Standard', 'searchpro'); ?>
72 <p>Standard optimizations like image optimization, page cache, URL prefectch.</p>
73 </div>
74 </label>
75 <label>
76 <input type="radio" name="berq_opt_mode" value="2" <?php echo get_option('berq_opt_mode') == '2' ? 'checked' : ''; ?>>
77 <div>
78 <?php esc_html_e('Smart', 'searchpro'); ?>
79 <p>Highly stable mode for many cases with JavaScipt & CSS aynchronouse loading</p>
80 </div>
81 </label>
82 <label>
83 <input type="radio" name="berq_opt_mode" value="3" <?php echo get_option('berq_opt_mode') == '3' ? 'checked' : ''; ?>>
84 <div>
85 <?php esc_html_e('Blaze', 'searchpro'); ?>
86 <p>Design first optimization with proritized CSS loading and delayed JavaScript</p>
87 </div>
88 </label>
89 <label class="berqwp-best-performance">
90 <input type="radio" name="berq_opt_mode" value="4" <?php echo get_option('berq_opt_mode') == '4' ? 'checked' : ''; ?>>
91 <div>
92 <?php esc_html_e('Turbo', 'searchpro'); ?>
93 <p>Delivers best performance possible by using minimal requests on initial page load</p>
94 </div>
95 </label>
96 </div>
97
98 </div>
99 <!--<div class="optimzation-slider">
100 <input id="berq_opt_mode" name="berq_opt_mode" type="text" value="<?php echo esc_attr( get_option('berq_opt_mode') ); ?>" style="display:none" />
101 </div>-->
102
103 </div>
104 </div>
105
106 <div class="berq-triple-boxes">
107 <div class="berq-info-box" style="position: relative;">
108 <a class="berq-stat-refresh" href="#" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px" fill="#29ac20"><path d="M229.08-205.08v-52H310l-13.08-13.84q-42.3-39.62-68.61-92.62-26.31-53-26.31-115.69 0-93.69 55.23-165.96 55.23-72.27 140.77-98.96v54.23q-63.39 25.3-103.69 81.73Q254-551.77 254-479.23q0 49.92 20.27 92.65 20.27 42.73 54.81 73.27l15.38 15.39v-74.54h52v167.38H229.08ZM562-215.85v-54.23q63.39-25.3 103.69-81.73Q706-408.23 706-480.77q0-49.92-20.27-92.65-20.27-42.73-54.81-73.27l-15.38-15.39v74.54h-52v-167.38h167.38v52H650l13.08 13.84q43.46 38.47 69.19 92.04Q758-543.46 758-480.77q0 93.69-55.23 165.96-55.23 72.27-140.77 98.96Z"></path></svg></a>
109 <h3 class="berq-box-title"><?php esc_html_e('Pages in Queue', 'searchpro'); ?></h3>
110 <div class="berq-box-content">
111 <p><?php esc_html_e("Pages pending in cloud", 'searchpro'); ?></p>
112 <div class="berq-stats-count">
113 <?php
114 if ($berqwp_can_use_cloud) {
115 $berqwp = new BerqWP(get_option('berqwp_license_key'), null, optifer_cache);
116 $queue_count = $berqwp->queue_count($configs['site_id']);
117 echo $queue_count;
118 } else {
119 echo "0";
120 }
121 ?>
122 </div>
123 </div>
124 </div>
125 <div class="berq-info-box" style="position: relative;">
126 <a class="berq-stat-refresh" href="#" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px" fill="#29ac20"><path d="M229.08-205.08v-52H310l-13.08-13.84q-42.3-39.62-68.61-92.62-26.31-53-26.31-115.69 0-93.69 55.23-165.96 55.23-72.27 140.77-98.96v54.23q-63.39 25.3-103.69 81.73Q254-551.77 254-479.23q0 49.92 20.27 92.65 20.27 42.73 54.81 73.27l15.38 15.39v-74.54h52v167.38H229.08ZM562-215.85v-54.23q63.39-25.3 103.69-81.73Q706-408.23 706-480.77q0-49.92-20.27-92.65-20.27-42.73-54.81-73.27l-15.38-15.39v74.54h-52v-167.38h167.38v52H650l13.08 13.84q43.46 38.47 69.19 92.04Q758-543.46 758-480.77q0 93.69-55.23 165.96-55.23 72.27-140.77 98.96Z"></path></svg></a>
127 <h3 class="berq-box-title"><?php esc_html_e('Cached Pages', 'searchpro'); ?></h3>
128 <div class="berq-box-content">
129 <p><?php esc_html_e("Optimized pages", 'searchpro'); ?></p>
130 <div class="berq-stats-count"><?php echo $optimized_pages; ?></div>
131 </div>
132 </div>
133 <?php if ($berqwp_can_use_cloud) { ?>
134 <div class="berq-info-box" style="position:relative;">
135 <a title="Refresh license key" href="<?php echo esc_attr(wp_nonce_url(admin_url('admin-post.php?action=bwp_refresh_license'), 'bwp_refresh_license_action')); ?>" class="berq-stat-refresh">
136 <svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px" fill="#29ac20"><path d="M229.08-205.08v-52H310l-13.08-13.84q-42.3-39.62-68.61-92.62-26.31-53-26.31-115.69 0-93.69 55.23-165.96 55.23-72.27 140.77-98.96v54.23q-63.39 25.3-103.69 81.73Q254-551.77 254-479.23q0 49.92 20.27 92.65 20.27 42.73 54.81 73.27l15.38 15.39v-74.54h52v167.38H229.08ZM562-215.85v-54.23q63.39-25.3 103.69-81.73Q706-408.23 706-480.77q0-49.92-20.27-92.65-20.27-42.73-54.81-73.27l-15.38-15.39v74.54h-52v-167.38h167.38v52H650l13.08 13.84q43.46 38.47 69.19 92.04Q758-543.46 758-480.77q0 93.69-55.23 165.96-55.23 72.27-140.77 98.96Z"/></svg>
137 </a>
138 <h3 class="berq-box-title"><?php esc_html_e('My Account', 'searchpro'); ?></h3>
139 <div class="berq-box-content">
140
141 <?php if (!empty($this->key_response->product_ref) && $this->key_response->product_ref !== 'AppSumo Deal') { ?>
142 <p>
143 <?php esc_html_e('License:', 'searchpro'); ?>
144 <?php echo esc_html( $this->key_response->product_ref ); ?>
145 </p>
146 <?php } ?>
147
148 <p><?php esc_html_e('Status:', 'searchpro'); ?>
149 <?php echo esc_html( $this->key_response->status ); ?>
150 </p>
151
152 <?php if (!empty($this->key_response->product_ref) && !empty($this->key_response->date_expiry) && $this->key_response->product_ref !== 'AppSumo Deal' && $this->key_response->product_ref !== 'Free Account') { ?>
153 <p><?php esc_html_e('Renewal:', 'searchpro'); ?>
154 <?php echo esc_html( $this->key_response->date_expiry ); ?>
155 </p>
156 <?php } ?>
157
158 </div>
159 </div>
160 <?php } ?>
161 </div>
162
163 <div class="berq-info-box">
164 <h3 class="berq-box-title"><?php esc_html_e('Recently Optimized Pages (Max. 200)', 'searchpro'); ?></h3>
165 <div class="berq-box-content">
166 <div class="berq-recently-optimized-toolbar">
167 <input type="text" id="berq-recent-search" placeholder="<?php esc_attr_e('Search URL…', 'searchpro'); ?>" class="berq-recent-search-input" />
168 </div>
169 <table class="berq-image-settings berq-recent-table">
170 <colgroup><col style="width:75%"><col style="width:25%"></colgroup>
171 <thead>
172 <tr>
173 <th><?php esc_html_e('Page URL', 'searchpro'); ?></th>
174 <th><?php esc_html_e('Cached At', 'searchpro'); ?></th>
175 </tr>
176 </thead>
177 <tbody id="berq-recent-tbody">
178 <tr><td colspan="2"><?php esc_html_e('Loading…', 'searchpro'); ?></td></tr>
179 </tbody>
180 </table>
181 <div class="berq-recent-pagination">
182 <button type="button" class="berq-btn" id="berq-recent-prev" disabled><?php esc_html_e('← Prev', 'searchpro'); ?></button>
183 <span id="berq-recent-page-info"></span>
184 <button type="button" class="berq-btn" id="berq-recent-next"><?php esc_html_e('Next →', 'searchpro'); ?></button>
185 </div>
186 </div>
187 </div>
188
189 <div class="berq-info-box">
190 <h3 class="berq-box-title"><?php esc_html_e('Sandbox', 'searchpro'); ?></h3>
191 <div class="berq-box-content berq-setting-toggle">
192 <div class="berq-option-content">
193 <p><?php printf( /* translators: %s: Plugin name */ esc_html__("The Sandbox feature allows you to test %s's optimizations without impacting real visitors. Note that pages will load slower when sandbox mode is enabled.", 'searchpro'), esc_html($plugin_name) ); ?>
194
195 <?php if (bwp_show_docs()) { ?>
196 <a href="https://berqwp.com/help-center/sandbox-mode-and-how-to-use-it/" target="_blank"><?php esc_html_e("Learn more", 'searchpro'); ?></a>
197 <?php } ?>
198
199 </p>
200
201 </div>
202
203 <?php berqwp_render_toggle('berqwp_enable_sandbox', get_option('berqwp_enable_sandbox')); ?>
204
205 </div>
206 </div>
207
208 <div class="berq-info-box">
209 <h3 class="berq-box-title <?php echo !$berqwp_can_use_cloud ? 'cloud-exclusive' : ''; ?>"><?php esc_html_e("Monitor Core Web Vitals", 'searchpro'); ?></h3>
210 <div class="berq-box-content berq-setting-toggle">
211 <div class="berq-option-content">
212 <p><?php esc_html_e("Anonymously track and monitor Core Web Vitals metrics in real time using our Web Vitals Analytics. It may cause a little drop in PageSpeed score.", 'searchpro'); ?></p>
213
214 </div>
215 <?php berqwp_render_toggle('berqwp_enable_cwv', get_option('berqwp_enable_cwv')); ?>
216 </div>
217 </div>
218
219 <button type="submit" class="berqwp-save"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"
220 xmlns="http://www.w3.org/2000/svg">
221 <path d="M4.16663 10.8333L7.49996 14.1667L15.8333 5.83334" stroke="white" stroke-width="2"
222 stroke-linecap="round" stroke-linejoin="round" />
223 </svg>
224 <?php esc_html_e('Save changes', 'searchpro'); ?></button>
225 </div>
226
227 <style>
228 .berq-recently-optimized-toolbar { margin-bottom: 14px; }
229 .berq-recent-search-input {
230 width: 100%; max-width: 360px;
231 padding: 5px 12px !important;
232 border: 1px solid #e2eaf5 !important;
233 border-radius: 6px !important;
234 font-size: 13px !important;
235 color: #353535 !important;
236 outline: none !important;
237 background: #fff;
238 transition: border-color 0.2s, box-shadow 0.2s;
239 box-shadow: 0 1px 3px rgba(83,113,167,0.06);
240 }
241 .berq-recent-search-input:focus { border-color: #1f71ff; box-shadow: 0 0 0 3px rgba(31,113,255,0.1); }
242 .berq-recent-search-input.berq-recent-searching {
243 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='10' fill='none' stroke='%23c5d3ea' stroke-width='3'/%3E%3Cpath d='M12 2a10 10 0 0 1 10 10' fill='none' stroke='%231f71ff' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='0.7s' repeatCount='indefinite'/%3E%3C/path%3E%3C/svg%3E");
244 background-repeat: no-repeat;
245 background-position: right 10px center;
246 padding-right: 30px;
247 }
248 .berq-recent-table { border-collapse: collapse; width: 100%; table-layout: fixed; }
249 .berq-recent-table th, .berq-recent-table td { padding: 8px 10px; font-size: 13px; color: #465774; border-bottom: 1px solid #e8eef8; word-break: break-all; }
250 .berq-recent-table th { font-weight: 600; color: #0d2958; background: #f7faff; }
251 .berq-recent-table td a { color: #1f71ff; text-decoration: none; }
252 .berq-recent-table td a:hover { text-decoration: underline; }
253 .berq-recent-pagination { display: flex; align-items: center; gap: 10px; margin-top: 14px; }
254 #berq-recent-page-info { font-size: 13px; color: #465774; flex: 1; text-align: center; }
255 button.berq-btn {
256 background: #fff; border-radius: 6px; padding: 8px 16px;
257 color: #384a69; font-size: 13px; font-weight: 500;
258 border: 1px solid #dbe9fe; box-shadow: 0 0 7px -6px #000;
259 cursor: pointer; transition: background 0.15s, border-color 0.15s, color 0.15s;
260 line-height: normal;
261 }
262 button.berq-btn:hover:not(:disabled) { background: #3d44d9; border-color: #3d44d9; color: #fff; }
263 button.berq-btn:disabled { opacity: 0.4; cursor: not-allowed; }
264 </style>
265
266 <script>
267 (function($) {
268 var recentPage = 0, recentLength = 10, recentSearch = '', recentTotal = 0;
269
270 function loadRecentPages() {
271 var $input = $('#berq-recent-search');
272 $input.addClass('berq-recent-searching');
273 $('#berq-recent-tbody').css('opacity', '0.45');
274
275 let berq_nounce = '<?php echo esc_html(wp_create_nonce('wp_rest')); ?>';
276 $.post(ajaxurl, {
277 action: 'berqwp_recently_optimized_pages',
278 nonce: berq_nounce,
279 start: recentPage * recentLength,
280 length: recentLength,
281 search: recentSearch,
282 }, function(res) {
283 $input.removeClass('berq-recent-searching');
284 $('#berq-recent-tbody').css('opacity', '');
285 if (!res || !res.success) return;
286 recentTotal = res.data.total;
287 var rows = '';
288 if (!res.data.data || res.data.data.length === 0) {
289 rows = '<tr><td colspan="2" style="color:#6071a4;"><?php echo esc_js(__('No cached pages logged yet.', 'searchpro')); ?></td></tr>';
290 } else {
291 $.each(res.data.data, function(_, e) {
292 rows += '<tr><td><a href="' + e.url + '" target="_blank" rel="noopener">' + e.url + '</a></td><td>' + e.cached_at + '</td></tr>';
293 });
294 }
295 $('#berq-recent-tbody').html(rows);
296 var from = recentTotal === 0 ? 0 : recentPage * recentLength + 1;
297 var to = Math.min((recentPage + 1) * recentLength, recentTotal);
298 $('#berq-recent-page-info').text(from + '' + to + ' / ' + recentTotal);
299 $('#berq-recent-prev').prop('disabled', recentPage === 0);
300 $('#berq-recent-next').prop('disabled', to >= recentTotal);
301 });
302 }
303
304 var searchTimer;
305 $('#berq-recent-search').on('input', function() {
306 clearTimeout(searchTimer);
307 var val = $(this).val();
308 searchTimer = setTimeout(function() {
309 recentSearch = val;
310 recentPage = 0;
311 loadRecentPages();
312 }, 350);
313 });
314
315 $('#berq-recent-prev').on('click', function() { recentPage--; loadRecentPages(); });
316 $('#berq-recent-next').on('click', function() { recentPage++; loadRecentPages(); });
317
318 loadRecentPages();
319 })(jQuery);
320 </script>
321