PluginProbe ʕ •ᴥ•ʔ
Advanced Google reCAPTCHA / 5.40
Advanced Google reCAPTCHA v5.40
5.40 5.39 trunk 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 1.20 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28 1.29 1.30 1.31 1.32 1.33 1.34 1.35
advanced-google-recaptcha / libs / admin.php
advanced-google-recaptcha / libs Last commit date
admin.php 4 months ago ajax.php 4 months ago functions.php 1 month ago setup.php 3 months ago stats.php 4 months ago utility.php 4 months ago
admin.php
553 lines
1 <?php
2
3 /**
4 * WP Captcha
5 * https://getwpcaptcha.com/
6 * (c) WebFactory Ltd, 2022 - 2026, www.webfactoryltd.com
7 */
8
9 class WPCaptcha_Admin extends WPCaptcha
10 {
11
12 /**
13 * Enqueue Admin Scripts
14 *
15 * @since 5.0
16 *
17 * @return null
18 */
19 static function admin_enqueue_scripts($hook)
20 {
21 if ('settings_page_wpcaptcha' == $hook) {
22 wp_enqueue_style('wpcaptcha-admin', WPCAPTCHA_PLUGIN_URL . 'css/wpcaptcha.css', array(), self::$version);
23 wp_enqueue_style('wpcaptcha-dataTables', WPCAPTCHA_PLUGIN_URL . 'css/jquery.dataTables.min.css', array(), self::$version);
24 wp_enqueue_style('wpcaptcha-sweetalert', WPCAPTCHA_PLUGIN_URL . 'css/sweetalert2.min.css', array(), self::$version);
25 wp_enqueue_style('wpcaptcha-tooltipster', WPCAPTCHA_PLUGIN_URL . 'css/tooltipster.bundle.min.css', array(), self::$version);
26 wp_enqueue_style('wp-color-picker');
27 wp_enqueue_style('wp-jquery-ui-dialog');
28
29 wp_enqueue_script('jquery-ui-tabs');
30 wp_enqueue_script('jquery-ui-core');
31 wp_enqueue_script('jquery-ui-position');
32 wp_enqueue_script('jquery-effects-core');
33 wp_enqueue_script('jquery-effects-blind');
34 wp_enqueue_script('jquery-ui-dialog');
35
36 wp_enqueue_script('wpcaptcha-tooltipster', WPCAPTCHA_PLUGIN_URL . 'js/tooltipster.bundle.min.js', array('jquery'), self::$version, true);
37 wp_enqueue_script('wpcaptcha-dataTables', WPCAPTCHA_PLUGIN_URL . 'js/jquery.dataTables.min.js', array(), self::$version, true);
38 wp_enqueue_script('wpcaptcha-chart', WPCAPTCHA_PLUGIN_URL . 'js/chart.min.js', array(), self::$version, true);
39 wp_enqueue_script('wpcaptcha-moment', WPCAPTCHA_PLUGIN_URL . 'js/moment.min.js', array(), self::$version, true);
40 wp_enqueue_script('wpcaptcha-sweetalert', WPCAPTCHA_PLUGIN_URL . 'js/sweetalert2.min.js', array(), self::$version, true);
41
42 wp_enqueue_script('wp-color-picker');
43 wp_enqueue_media();
44
45 $captcha = WPCaptcha_Functions::math_captcha_generate();
46
47 $js_localize = array(
48 'undocumented_error' => __('An undocumented error has occurred. Please refresh the page and try again.', 'advanced-google-recaptcha'),
49 'documented_error' => __('An error has occurred.', 'advanced-google-recaptcha'),
50 'plugin_name' => __('WP Captcha', 'advanced-google-recaptcha'),
51 'plugin_url' => WPCAPTCHA_PLUGIN_URL,
52 'icon_url' => WPCAPTCHA_PLUGIN_URL . 'images/wp-captcha-loader.gif',
53 'settings_url' => admin_url('options-general.php?page=wpcaptcha'),
54 'version' => self::$version,
55 'site' => get_home_url(),
56 'url' => WPCAPTCHA_PLUGIN_URL,
57 'cancel_button' => __('Cancel', 'advanced-google-recaptcha'),
58 'ok_button' => __('OK', 'advanced-google-recaptcha'),
59 'run_tool_nonce' => wp_create_nonce('wpcaptcha_run_tool'),
60 'stats_unavailable' => 'Stats will be available once enough data is collected.',
61 'stats_locks' => WPCaptcha_Stats::get_stats('locks'),
62 'stats_fails' => WPCaptcha_Stats::get_stats('fails'),
63 'wp301_install_url' => add_query_arg(array('action' => 'wpcaptcha_install_wp301', '_wpnonce' => wp_create_nonce('install_wp301'), 'rnd' => wp_rand()), admin_url('admin.php')),
64 'captcha_admin_test' => $captcha['img'],
65 'captcha_admin_test_token' => wp_hash($captcha['value']),
66 );
67
68 $js_localize['chart_colors'] = array('#4285f4', '#ff5429', '#ff7d5c', '#ffac97');
69
70 wp_enqueue_script('wpcaptcha-admin', WPCAPTCHA_PLUGIN_URL . 'js/wpcaptcha.js', array('jquery'), self::$version, true);
71 wp_localize_script('wpcaptcha-admin', 'wpcaptcha_vars', $js_localize);
72
73 // fix for aggressive plugins that include their CSS or JS on all pages
74 wp_dequeue_style('uiStyleSheet');
75 wp_dequeue_style('wpcufpnAdmin');
76 wp_dequeue_style('unifStyleSheet');
77 wp_dequeue_style('wpcufpn_codemirror');
78 wp_dequeue_style('wpcufpn_codemirrorTheme');
79 wp_dequeue_style('collapse-admin-css');
80 wp_dequeue_style('jquery-ui-css');
81 wp_dequeue_style('tribe-common-admin');
82 wp_dequeue_style('file-manager__jquery-ui-css');
83 wp_dequeue_style('file-manager__jquery-ui-css-theme');
84 wp_dequeue_style('wpmegmaps-jqueryui');
85 wp_dequeue_style('wp-botwatch-css');
86 wp_dequeue_style('njt-filebird-admin');
87 wp_dequeue_style('ihc_jquery-ui.min.css');
88 wp_dequeue_style('badgeos-juqery-autocomplete-css');
89 wp_dequeue_style('mainwp');
90 wp_dequeue_style('mainwp-responsive-layouts');
91 wp_dequeue_style('jquery-ui-style');
92 wp_dequeue_style('additional_style');
93 wp_dequeue_style('wobd-jqueryui-style');
94 wp_dequeue_style('wpdp-style3');
95 wp_dequeue_style('jquery_smoothness_ui');
96 wp_dequeue_style('uap_main_admin_style');
97 wp_dequeue_style('uap_font_awesome');
98 wp_dequeue_style('uap_jquery-ui.min.css');
99 wp_dequeue_style('wqm-select2-style');
100
101 wp_deregister_script('wqm-select2-script');
102
103 WPCaptcha_Utility::dismiss_pointer_ajax();
104 }
105
106 $pointers = get_option(WPCAPTCHA_POINTERS_KEY);
107
108 if ('settings_page_wpcaptcha' != $hook) {
109 if ($pointers) {
110 $pointers['run_tool_nonce'] = wp_create_nonce('wpcaptcha_run_tool');
111 wp_enqueue_script('wp-pointer');
112 wp_enqueue_style('wp-pointer');
113 wp_localize_script('wp-pointer', 'wpcaptcha_pointers', $pointers);
114 }
115
116 if ($pointers) {
117 wp_enqueue_script('wpcaptcha-pointers', WPCAPTCHA_PLUGIN_URL . 'js/wpcaptcha-pointers.js', array('jquery'), self::$version, true);
118 }
119 }
120 } // admin_enqueue_scripts
121
122 static function admin_notices()
123 {
124 $notices = get_option(WPCAPTCHA_NOTICES_KEY);
125
126 if (is_array($notices)) {
127 foreach ($notices as $id => $notice) {
128 WPCaptcha_Utility::wp_kses_wf('<div class="notice-' . $notice['type'] . ' notice is-dismissible"><p>' . $notice['text'] . '<button type="button" class="notice-dismiss"><span class="screen-reader-text">Dismiss this notice.</span></button></p></div>');
129 if ($notice['once'] == true) {
130 unset($notices[$id]);
131 update_option(WPCAPTCHA_NOTICES_KEY, $notices);
132 }
133 }
134 }
135 } // notices
136
137 static function add_notice($id = false, $text = '', $type = 'warning', $show_once = false)
138 {
139 if ($id) {
140 $notices = get_option(WPCAPTCHA_NOTICES_KEY, array());
141 $notices[$id] = array('text' => $text, 'type' => $type, 'once' => $show_once);
142 update_option(WPCAPTCHA_NOTICES_KEY, $notices);
143 }
144 }
145
146 /**
147 * Admin menu entry
148 *
149 * @since 5.0
150 *
151 * @return null
152 */
153 static function admin_menu()
154 {
155 add_options_page(
156 __('Advanced Google reCAPTCHA', 'advanced-google-recaptcha'),
157 __('Advanced Google reCAPTCHA', 'advanced-google-recaptcha'),
158 'manage_options',
159 'wpcaptcha',
160 array(__CLASS__, 'main_page')
161 );
162 } // admin_menu
163
164 /**
165 * Add settings link to plugins page
166 *
167 * @since 5.0
168 *
169 * @return null
170 */
171 static function plugin_action_links($links)
172 {
173 $settings_link = '<a href="' . admin_url('options-general.php?page=wpcaptcha') . '" title="WP Captcha Settings">' . __('Settings', 'advanced-google-recaptcha') . '</a>';
174 $pro_link = '<a href="' . admin_url('options-general.php?page=wpcaptcha#open-pro-dialog') . '" title="Get more protection with WP Captcha PRO"><b>' . __('Get EXTRA protection', 'advanced-google-recaptcha') . '</b></a>';
175
176 array_unshift($links, $settings_link);
177 array_unshift($links, $pro_link);
178
179 return $links;
180 } // plugin_action_links
181
182 /**
183 * Add links to plugin's description in plugins table
184 *
185 * @since 5.0
186 *
187 * @return null
188 */
189 static function plugin_meta_links($links, $file)
190 {
191 if ($file !== 'advanced-google-recaptcha/advanced-google-recaptcha.php') {
192 return $links;
193 }
194
195 $support_link = '<a href="https://getwpcaptcha.com/support/" title="' . __('Get help', 'advanced-google-recaptcha') . '">' . __('Support', 'advanced-google-recaptcha') . '</a>';
196 $links[] = $support_link;
197
198 return $links;
199 } // plugin_meta_links
200
201 /**
202 * Admin footer text
203 *
204 * @since 5.0
205 *
206 * @return null
207 */
208 static function admin_footer_text($text)
209 {
210 if (!self::is_plugin_page()) {
211 return $text;
212 }
213
214 $text = '<i class="wpcaptcha-footer">WP Captcha v' . self::$version . ' <a href="' . self::generate_web_link('admin_footer') . '" title="Visit WP Captcha page for more info" target="_blank">WebFactory Ltd</a>. Please <a target="_blank" href="https://wordpress.org/support/plugin/advanced-google-recaptcha/reviews/#new-post" title="Rate the plugin">rate the plugin <span>�
215
216
217
218
219 </span></a> to help us spread the word. Thank you 🙌 from the WebFactory team!</i>';
220
221 return $text;
222 } // admin_footer_text
223
224 /**
225 * Helper function for generating UTM tagged links
226 *
227 * @param string $placement Optional. UTM content param.
228 * @param string $page Optional. Page to link to.
229 * @param array $params Optional. Extra URL params.
230 * @param string $anchor Optional. URL anchor part.
231 *
232 * @return string
233 */
234 static function generate_web_link($placement = '', $page = '/', $params = array(), $anchor = '')
235 {
236 $base_url = 'https://getwpcaptcha.com';
237
238 if ('/' != $page) {
239 $page = '/' . trim($page, '/') . '/';
240 }
241 if ($page == '//') {
242 $page = '/';
243 }
244
245 $parts = array_merge(array('utm_source' => 'advanced-google-recaptcha', 'utm_medium' => 'plugin', 'utm_content' => $placement, 'utm_campaign' => 'wpcaptcha-v' . self::$version), $params);
246
247 if (!empty($anchor)) {
248 $anchor = '#' . trim($anchor, '#');
249 }
250
251 $out = $base_url . $page . '?' . http_build_query($parts, '', '&amp;') . $anchor;
252
253 return $out;
254 } // generate_web_link
255
256 /**
257 * Test if we're on plugin's page
258 *
259 * @since 5.0
260 *
261 * @return null
262 */
263 static function is_plugin_page()
264 {
265 $current_screen = get_current_screen();
266
267 if ($current_screen->id == 'settings_page_wpcaptcha') {
268 return true;
269 } else {
270 return false;
271 }
272 } // is_plugin_page
273
274 /**
275 * Settings Page HTML
276 *
277 * @since 5.0
278 *
279 * @return null
280 */
281 static function main_page()
282 {
283 if (!current_user_can('manage_options')) {
284 wp_die('You do not have sufficient permissions to access this page.');
285 }
286
287 $options = WPCaptcha_Setup::get_options();
288
289 // auto remove welcome pointer when options are opened
290 $pointers = get_option(WPCAPTCHA_POINTERS_KEY);
291 if (isset($pointers['welcome'])) {
292 unset($pointers['welcome']);
293 update_option(WPCAPTCHA_POINTERS_KEY, $pointers);
294 }
295
296 echo '<div class="wrap">';
297 echo '<div class="wpcaptcha-header">
298 <div class="wp-captcha-logo">
299 <img src="' . esc_url(WPCAPTCHA_PLUGIN_URL) . '/images/wp-captcha-logo.png" alt="WP Captcha" height="60" title="WP Captcha">
300 </div>';
301
302 echo '<a data-tab="firewall" data-tab2="general" title="Click to open Firewall Settings" class="tooltip change_tab wpcaptcha-header-status wpcaptcha-header-status-' . ($options['firewall_block_bots'] == 1 ? 'enabled' : 'disabled') . '" style="width: 142px;">';
303 echo '<span class="dashicons dashicons-yes"></span>';
304 echo '<div class="option">Firewall</span></div>';
305 if ($options['firewall_block_bots'] == 'disabled') {
306 echo '<div class="status">Disabled</div>';
307 } else {
308 echo '<div class="status">Enabled</div>';
309 }
310 echo '</a>';
311
312 echo '<a data-tab="login_form" data-tab2="login_basic" title="Click to open Login Protection settings" class="tooltip change_tab wpcaptcha-header-status wpcaptcha-header-status-' . ($options['login_protection'] == 1 ? 'enabled' : 'disabled') . '">';
313 echo '<span class="dashicons dashicons-yes"></span>';
314 echo '<div class="option">Login Protection</span></div>';
315 if ($options['login_protection'] == 'disabled') {
316 echo '<div class="status">Disabled</div>';
317 } else {
318 echo '<div class="status">Enabled</div>';
319 }
320 echo '</a>';
321
322 echo '<a data-tab="captcha" data-tab2="captcha" title="Click to open Captcha settings" class="tooltip change_tab wpcaptcha-header-status wpcaptcha-header-status-' . ($options['captcha'] == 'disabled' ? 'disabled' : 'enabled') . '" style="width: 142px;">';
323 echo '<span class="dashicons dashicons-yes"></span>';
324 echo '<div class="option">Captcha</span></div>';
325 if ($options['captcha'] == 'disabled') {
326 echo '<div class="status">Disabled</div>';
327 } else {
328 echo '<div class="status">Enabled</div>';
329 }
330 echo '</a>';
331
332 echo '</div>';
333
334 echo '<h1></h1>';
335
336 echo '<form method="post" action="options.php" enctype="multipart/form-data" id="wpcaptcha_form">';
337 settings_fields(WPCAPTCHA_OPTIONS_KEY);
338
339 $tabs = array();
340
341 $tabs[] = array('id' => 'wpcaptcha_captcha', 'icon' => 'wpcaptcha-icon wpcaptcha-make-group', 'class' => '', 'label' => __('Captcha', 'advanced-google-recaptcha'), 'callback' => array('WPCaptcha_Tab_Captcha', 'display'));
342 $tabs[] = array('id' => 'wpcaptcha_activity', 'icon' => 'wpcaptcha-icon wpcaptcha-log', 'class' => '', 'label' => __('Activity', 'advanced-google-recaptcha'), 'callback' => array('WPCaptcha_Tab_Activity', 'display'));
343 $tabs[] = array('id' => 'wpcaptcha_login_form', 'icon' => 'wpcaptcha-icon wpcaptcha-enter', 'class' => '', 'label' => __('Login Protection', 'advanced-google-recaptcha'), 'callback' => array('WPCaptcha_Tab_Login_Form', 'display'));
344 $tabs[] = array('id' => 'wpcaptcha_firewall', 'icon' => 'wpcaptcha-icon wpcaptcha-check', 'class' => '', 'label' => __('Firewall', 'advanced-google-recaptcha'), 'callback' => array('WPCaptcha_Tab_Firewall', 'display'));
345 $tabs[] = array('id' => 'wpcaptcha_geoip', 'icon' => 'wpcaptcha-icon wpcaptcha-globe', 'class' => '', 'label' => __('Country Blocking', 'advanced-google-recaptcha'), 'callback' => array('WPCaptcha_Tab_GeoIP', 'display'));
346 $tabs[] = array('id' => 'wpcaptcha_design', 'icon' => 'wpcaptcha-icon wpcaptcha-settings', 'class' => '', 'label' => __('Design', 'advanced-google-recaptcha'), 'callback' => array('WPCaptcha_Tab_Design', 'display'));
347 $tabs[] = array('id' => 'wpcaptcha_temp_access', 'icon' => 'wpcaptcha-icon wpcaptcha-hour-glass', 'class' => '', 'label' => __('Temp Access', 'advanced-google-recaptcha'), 'callback' => array('WPCaptcha_Tab_Temporary_Access', 'display'));
348 $tabs[] = array('id' => 'wpcaptcha_pro', 'class' => 'open-upsell nav-tab-pro', 'icon' => '<span class="dashicons dashicons-star-filled"></span>', 'label' => __('PRO', 'advanced-google-recaptcha'), 'callback' => '');
349
350 $tabs = apply_filters('wpcaptcha_tabs', $tabs);
351 echo '<div id="wpcaptcha_tabs_wrapper" class="ui-tabs">';
352
353 echo '<div id="wpcaptcha_tabs" class="ui-tabs" style="display: none;">';
354 echo '<ul class="wpcaptcha-main-tab">';
355 foreach ($tabs as $tab) {
356 echo '<li><a ' . (!empty($tab['callback']) ? 'href="#' . esc_attr($tab['id']) . '"' : '') . 'class="' . esc_attr($tab['class']) . '">';
357 if (strpos($tab['icon'], 'dashicon')) {
358 WPCaptcha_Utility::wp_kses_wf($tab['icon']);
359 } else {
360 echo '<span class="icon"><i class="' . esc_attr($tab['icon']) . '"></i></span>';
361 }
362 echo '<span class="label">' . esc_attr($tab['label']) . '</span></a></li>';
363 }
364 echo '</ul>';
365
366 foreach ($tabs as $tab) {
367 if (is_callable($tab['callback'])) {
368 echo '<div style="display: none;" id="' . esc_attr($tab['id']) . '">';
369 call_user_func($tab['callback']);
370 echo '</div>';
371 }
372 } // foreach
373
374 echo '</div>';
375 echo '</div>';
376
377 echo '<div id="wpcaptcha_tabs_sidebar" style="display:none;">';
378 echo '<div class="sidebar-box pro-ad-box">
379 <p class="text-center"><a href="#" data-pro-feature="sidebar-box-logo" class="open-pro-dialog">
380 <img src="' . esc_url(WPCAPTCHA_PLUGIN_URL . '/images/wp-captcha-logo.png') . '" alt="WP Captcha PRO" title="WP Captcha PRO"></a><br><b>PRO version is here! Grab the launch discount.</b></p>
381 <ul class="plain-list">
382 <li>7 Types of Captcha + GDPR Compatibility</li>
383 <li>Login Page Customization - Visual &amp; URL</li>
384 <li>Advanced Login Page Protection</li>
385 <li>Email Based Two Factor Authentication (2FA)</li>
386 <li>Advanced Firewall + Cloud Blacklists</li>
387 <li>Country Blocking (whitelist &amp; blacklist)</li>
388 <li>Temporary Access Links</li>
389 <li>Recovery URL - You Can Never Get Locked Out</li>
390 <li>Licenses &amp; Sites Manager (remote SaaS dashboard)</li>
391 <li>White-label Mode</li>
392 <li>Complete Codeless Plugin Rebranding</li>
393 <li>Email support from plugin developers</li>
394 </ul>
395
396 <p class="text-center"><a href="#" class="open-pro-dialog button button-buy" data-pro-feature="sidebar-box">Get PRO Now</a></p>
397 </div>';
398
399 if (!defined('EPS_REDIRECT_VERSION') && !defined('WF301_PLUGIN_FILE')) {
400 echo '<div class="sidebar-box pro-ad-box box-301">
401 <h3 class="textcenter"><b>Problems with redirects?<br>Moving content around or changing posts\' URL?<br>Old URLs giving you problems?<br><br><u>Improve your SEO &amp; manage all redirects in one place!</u></b></h3>
402
403 <p class="text-center"><a href="#" class="install-wp301">
404 <img src="' . esc_url(WPCAPTCHA_PLUGIN_URL . '/images/wp-301-logo.png') . '" alt="WP 301 Redirects" title="WP 301 Redirects"></a></p>
405
406 <p class="text-center"><a href="#" class="button button-buy install-wp301">Install and activate the <u>free</u> WP 301 Redirects plugin</a></p>
407
408 <p><a href="https://wordpress.org/plugins/eps-301-redirects/" target="_blank">WP 301 Redirects</a> is a free WP plugin maintained by the same team as this WP Captcha plugin. It has <b>+300,000 users, 5-star rating</b>, and is hosted on the official WP repository.</p>
409 </div>';
410 }
411
412 echo '<div class="sidebar-box" style="margin-top: 35px;">
413 <p>Please <a href="https://wordpress.org/support/plugin/advanced-google-recaptcha/reviews/#new-post" target="_blank">rate the plugin �
414
415
416
417
418 </a> to <b>keep it up-to-date &amp; maintained</b>. It only takes a second to rate. Thank you! 👋</p>
419 </div>';
420 echo '</div>';
421 echo '</form>';
422
423 echo ' <div id="wpcaptcha-pro-dialog" style="display: none;" title="WP Captcha PRO is here!"><span class="ui-helper-hidden-accessible"><input type="text"/></span>
424
425 <div class="center logo"><a href="https://getwpcaptcha.com/?ref=wpcaptcha-free-pricing-table" target="_blank"><img src="' . esc_url(WPCAPTCHA_PLUGIN_URL . '/images/wp-captcha-logo.png') . '" alt="WP Captcha PRO" title="WP Captcha PRO"></a><br>
426
427 <span>Grab the limited PRO <b>Launch Discount</b></span>
428 </div>
429
430 <table id="wpcaptcha-pro-table">
431 <tr>
432 <td class="center">Personal License</td>
433 <td class="center">Team License</td>
434 <td class="center">Agency License</td>
435 </tr>
436
437 <tr class="prices">
438 <td class="center"><span><del>$59</del> $49</span> <b>/year</b></td>
439 <td class="center"><span><del>$119</del> $99</span> <b>/year</b></td>
440 <td class="center"><span><del>$149</del> $119</span> <b>/year</b></td>
441 </tr>
442
443 <tr>
444 <td><span class="dashicons dashicons-yes"></span><b>1 Site License</b> ($49 per site)</td>
445 <td><span class="dashicons dashicons-yes"></span><b>5 Sites License</b> ($20 per site)</td>
446 <td><span class="dashicons dashicons-yes"></span><b>100 Sites License</b> ($1.2 per site)</td>
447 </tr>
448
449 <tr>
450 <td><span class="dashicons dashicons-yes"></span>All Plugin Features</td>
451 <td><span class="dashicons dashicons-yes"></span>All Plugin Features</td>
452 <td><span class="dashicons dashicons-yes"></span>All Plugin Features</td>
453 </tr>
454
455 <tr>
456 <td><span class="dashicons dashicons-yes"></span>7 Types of Captcha</td>
457 <td><span class="dashicons dashicons-yes"></span>7 Types of Captcha</td>
458 <td><span class="dashicons dashicons-yes"></span>7 Types of Captcha</td>
459 </tr>
460
461 <tr>
462 <td><span class="dashicons dashicons-yes"></span>Advanced Firewall + Cloud Blacklists</td>
463 <td><span class="dashicons dashicons-yes"></span>Advanced Firewall + Cloud Blacklists</td>
464 <td><span class="dashicons dashicons-yes"></span>Advanced Firewall + Cloud Blacklists</td>
465 </tr>
466
467 <tr>
468 <td><span class="dashicons dashicons-yes"></span>Login Page Customization</td>
469 <td><span class="dashicons dashicons-yes"></span>Login Page Customization</td>
470 <td><span class="dashicons dashicons-yes"></span>Login Page Customization</td>
471 </tr>
472
473 <tr>
474 <td><span class="dashicons dashicons-yes"></span>Email Based 2FA</td>
475 <td><span class="dashicons dashicons-yes"></span>Email Based 2FA</td>
476 <td><span class="dashicons dashicons-yes"></span>Email Based 2FA</td>
477 </tr>
478
479 <tr>
480 <td><span class="dashicons dashicons-yes"></span>Temporary Access Links</td>
481 <td><span class="dashicons dashicons-yes"></span>Temporary Access Links</td>
482 <td><span class="dashicons dashicons-yes"></span>Temporary Access Links</td>
483 </tr>
484
485 <tr>
486 <td><span class="dashicons dashicons-yes"></span>Country Blocking</td>
487 <td><span class="dashicons dashicons-yes"></span>Country Blocking</td>
488 <td><span class="dashicons dashicons-yes"></span>Country Blocking</td>
489 </tr>
490
491 <tr>
492 <td><span class="dashicons dashicons-yes"></span>SaaS Dashboard</td>
493 <td><span class="dashicons dashicons-yes"></span>SaaS Dashboard</td>
494 <td><span class="dashicons dashicons-yes"></span>SaaS Dashboard</td>
495 </tr>
496
497 <tr>
498 <td><span class="dashicons dashicons-no"></span>White-label Mode</td>
499 <td><span class="dashicons dashicons-yes"></span>White-label Mode</td>
500 <td><span class="dashicons dashicons-yes"></span>White-label Mode</td>
501 </tr>
502
503 <tr>
504 <td><span class="dashicons dashicons-no"></span>Full Plugin Rebranding</td>
505 <td><span class="dashicons dashicons-no"></span>Full Plugin Rebranding</td>
506 <td><span class="dashicons dashicons-yes"></span>Full Plugin Rebranding</td>
507 </tr>
508
509 <tr>
510 <td><a class="button button-buy" data-href-org="https://getwpcaptcha.com/buy/?product=personal-yearly-launch&ref=pricing-table" href="https://getwpcaptcha.com/buy/?product=personal-yearly-launch&ref=pricing-table" target="_blank"><del>$59</del> $49 <small>/y</small><br>BUY NOW</a>
511 <br>or <a class="button-buy" data-href-org="https://getwpcaptcha.com/buy/?product=personal-ltd-launch&ref=pricing-table" href="https://getwpcaptcha.com/buy/?product=personal-ltd-launch&ref=pricing-table" target="_blank">only <del>$99</del> $79 for a lifetime license</a></td>
512 <td><a class="button button-buy" data-href-org="https://getwpcaptcha.com/buy/?product=team-yearly-launch&ref=pricing-table" href="https://getwpcaptcha.com/buy/?product=team-yearly-launch&ref=pricing-table" target="_blank"><del>$119</del> $99 <small>/y</small><br>BUY NOW</a></td>
513 <td><a class="button button-buy" data-href-org="https://getwpcaptcha.com/buy/?product=agency-yearly-launch&ref=pricing-table" href="https://getwpcaptcha.com/buy/?product=agency-yearly-launch&ref=pricing-table" target="_blank"><del>$149</del> $119 <small>/y</small><br>BUY NOW</a></td>
514 </tr>
515
516 </table>
517
518 <div class="center footer"><b>100% No-Risk Money Back Guarantee!</b> If you don\'t like the plugin over the next 7 days, we will happily refund 100% of your money. No questions asked! Payments are processed by our merchant of records - <a href="https://paddle.com/" target="_blank">Paddle</a>.</div>
519 </div>';
520
521 echo '</div>'; // wrap
522 } // options_page
523
524 /**
525 * Reset pointers
526 *
527 * @since 5.0
528 *
529 * @return null
530 */
531 static function reset_pointers()
532 {
533 $pointers = array();
534 $pointers['welcome'] = array('target' => '#menu-settings', 'edge' => 'left', 'align' => 'right', 'content' => 'Thank you for installing the <b style="font-weight: 800; font-variant: small-caps;">Advanced Google reCAPTCHA</b> plugin! Please open <a href="' . admin_url('options-general.php?page=wpcaptcha') . '">Settings - Advanced Google reCaptcha</a> to set up your captcha and website protection settings.');
535
536 update_option(WPCAPTCHA_POINTERS_KEY, $pointers);
537 } // reset_pointers
538
539 /**
540 * Settings footer submit button HTML
541 *
542 * @since 5.0
543 *
544 * @return null
545 */
546 static function footer_save_button()
547 {
548 echo '<p class="submit">';
549 echo '<button class="button button-primary button-large save-settings">' . esc_html__('Save Changes', 'advanced-google-recaptcha') . ' <i class="wpcaptcha-icon wpcaptcha-checkmark"></i></button>';
550 echo '</p>';
551 } // footer_save_button
552 } // class
553