PluginProbe ʕ •ᴥ•ʔ
WP 2FA – Two-factor authentication for WordPress / 2.9.2
WP 2FA – Two-factor authentication for WordPress v2.9.2
4.0.0 1.7.1 2.0.0 2.0.1 2.1.0 2.2.0 2.2.1 2.3.0 2.4.0 2.4.1 2.4.2 2.5.0 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.8.0 2.9.0 2.9.1 2.9.2 2.9.3 3.0.0 3.0.1 3.1.0 3.1.1 3.1.1.2 trunk 1.2.0 1.3.0 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.6.0 1.6.1 1.6.2 1.7.0
wp-2fa / includes / classes / Admin / class-premium-features.php
wp-2fa / includes / classes / Admin Last commit date
Controllers 10 months ago Fly-Out 10 months ago Helpers 10 months ago Methods 10 months ago SettingsPages 10 months ago Views 10 months ago class-help-contact-us.php 10 months ago class-plugin-updated-notice.php 10 months ago class-premium-features.php 10 months ago class-settings-page.php 10 months ago class-setup-wizard.php 10 months ago class-user-listing.php 10 months ago class-user-notices.php 10 months ago class-user-profile.php 10 months ago class-user-registered.php 10 months ago index.php 10 months ago
class-premium-features.php
486 lines
1 <?php
2 /**
3 * Premium features rendering class.
4 *
5 * @package wp2fa
6 * @subpackage admin
7 *
8 * @copyright 2025 Melapress
9 * @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
10 *
11 * @see https://wordpress.org/plugins/wp-2fa/
12 * @since 2.0.0
13 */
14
15 declare(strict_types=1);
16
17 namespace WP2FA\Admin;
18
19 /*
20 * Premium_Features class for the premium features show
21 *
22 * @since 2.4.0
23 */
24 if ( ! class_exists( '\WP2FA\Admin\Premium_Features' ) ) {
25 /**
26 * Handles contact the features page and content.
27 */
28 class Premium_Features {
29 public const TOP_MENU_SLUG = 'wp-2fa-premium-features';
30
31 /**
32 * Create admin menu entry and settings page.
33 *
34 * @return void
35 *
36 * @since 2.8.0
37 */
38 public static function add_extra_menu_item() {
39 \add_submenu_page(
40 Settings_Page::TOP_MENU_SLUG,
41 \esc_html__( 'Premium Features', 'wp-2fa' ),
42 \esc_html__( 'Premium Features ➤', 'wp-2fa' ),
43 'manage_options',
44 self::TOP_MENU_SLUG,
45 array( __CLASS__, 'render' ),
46 100
47 );
48 }
49
50 /**
51 * Adds an upgrade banner to settings pages.
52 *
53 * @return void
54 *
55 * @since 2.8.0
56 */
57 public static function add_settings_banner() {
58 $banner = '<div id="wp-2fa-side-banner">';
59 $banner .= '<img src="' . \esc_url( WP_2FA_URL . 'dist/images/wizard-logo.png' ) . '">';
60 $banner .= '<p>' . \esc_html__( 'Upgrade to Premium & benefit:', 'wp-2fa' ) . '</p>';
61 $banner .= '<ul><li><span class="dashicons dashicons-yes-alt"></span>' . \esc_html__( 'Login with 2FA via SMS, push notification or with a simple mouse click', 'wp-2fa' ) . '</li>';
62 $banner .= '<li><span class="dashicons dashicons-yes-alt"></span>' . \esc_html__( 'Add & manage trusted devices ("Remember this device" option)', 'wp-2fa' ) . '</li>';
63 $banner .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__( 'Add alternative 2FA methods ensuring no user is ever locked out', 'wp-2fa' ) . '</li>';
64 $banner .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__( 'One-click 2FA integration with WooCommerce', 'wp-2fa' ) . '</li>';
65 $banner .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__( 'Completely whitelabel the 2FA user experience including the 2FA code page, email & wizards text', 'wp-2fa' ) . '</li>';
66 $banner .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__( 'Configure different 2FA policies for different user roles', 'wp-2fa' ) . '</li>';
67 $banner .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__( 'Many other features', 'wp-2fa' ) . '</li>';
68 $banner .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__( 'No Ads!', 'wp-2fa' ) . '</li></ul>';
69 $banner .= '<a href="https://melapress.com/wordpress-2fa/pricing/?utm_source=plugin&utm_medium=wp2fa&utm_campaign=upgrade_to_premium_banner" class="button button-primary" target="_blank">' . \esc_html__( 'Upgrade to Premium', 'wp-2fa' ) . '</a>';
70 $banner .= '</div>';
71
72 echo $banner; // phpcs:ignore
73 }
74
75 /**
76 * Handles rendering the content.
77 *
78 * @return void
79 *
80 * @since 2.8.0
81 */
82 public static function render() {
83 ?>
84 <style>
85 .features-wrap {
86 background: #fff;
87 padding: 25px 30px;
88 margin-top: 25px;
89 }
90
91 .features-wrap h2 {
92 font-size: 28px;
93 margin-bottom: 30px;
94 }
95
96 .features-wrap p {
97 font-size: 16px;
98 line-height: 28px;
99 }
100
101 .feature-list {
102 margin-bottom: 20px;
103 }
104
105 .feature-list li {
106 margin-bottom: 10px;
107 font-size: 15px;
108 }
109
110 .feature-list li .dashicons {
111 color: #3E6BFF;
112 }
113
114 .premium-cta {
115 margin: 25px 0 15px;
116 text-align: center;
117 }
118
119 .premium-cta a:not(.inverse), .table-link {
120 background-color: #3E6BFF;
121 color: #fff;
122 padding: 15px 26px;
123 border-radius: 30px;
124 font-size: 16px;
125 white-space: nowrap;
126 text-decoration: none;
127 font-weight: 700;
128 display: inline-block;
129 margin-right: 15px;
130 border: 2px solid #3E6BFF;
131 }
132
133 .premium-cta a:hover, .table-link:hover, .premium-cta a.inverse, .table-link.inverse {
134 color: #3E6BFF;
135 background-color: #fff;
136 }
137
138 .premium-cta a.inverse {
139 font-weight: 700;
140 text-decoration: none;
141 font-size: 16px;
142 }
143
144 .content-block {
145 margin-bottom: 26px;
146 border-bottom: 1px solid #eee;
147 padding-bottom: 15px;
148 }
149
150 .feature-table tr td {
151 text-align: center;
152 min-width: 200px
153 }
154 .feature-table tr td:first-of-type {
155 text-align: left;
156 font-weight: 500;
157 }
158 .feature-table td p {
159 margin-top: 0;
160 }
161 .row-head span {
162 font-size: 17px;
163 font-weight: 700;
164 }
165 .feature-table .dashicons {
166 color: #3E6BFF;
167 }
168 .feature-table .dashicons-no {
169 color: red;
170 }
171 .table-link {
172 font-size: 14px;
173 padding: 9px;
174 width: 193px;
175 margin-top: 10px;
176 }
177 .pull-up {
178 position: relative;
179 top: -23px;
180 }
181
182 .wp2fa-logo {
183 max-width: 130px;
184 }
185
186 .logo-wrap {
187 float: left;
188 margin-right: 30px;
189 }
190 </style>
191
192 <div class="wrap help-wrap features-wrap wp-2fa-settings-wrapper">
193 <div class="page-head">
194 <h2><?php \esc_html_e( 'Upgrade to Premium and benefit more!', 'wp-2fa' ); ?></h2>
195 </div>
196 <div class="content-block">
197 <div class="logo-wrap">
198 <img class="wp2fa-logo" src="<?php echo WP_2FA_URL; // phpcs:ignore?>dist/images/wp-2fa-color_opt.png" alt="">
199 </div>
200 <div>
201 <p><?php \esc_html_e( 'WP 2FA is your trusted gatekeeper, keeping your website, users, customers, team members, and anyone who accesses your website, including you, secure and better protected than ever before.', 'wp-2fa' ); ?></p>
202 <p><?php \esc_html_e( 'Upgrade to WP 2FA Premium to add more secure authentication options and automate more, encouraging all your website users to utilize 2FA to its fullest extent and give your users more flexibility by allowing them to work from anywhere without compromising on security.', 'wp-2fa' ); ?></p>
203 </div>
204 </div>
205 <div class="content-block">
206 <p><strong><?php \esc_html_e( 'Upgrade to Premium and start benefiting from value-added features such as:', 'wp-2fa' ); ?></strong></p>
207 <ul class="feature-list">
208 <li><span class="dashicons dashicons-saved"></span> <?php \esc_html_e( 'More 2FA methods, including SMS, push notifications & one-click login', 'wp-2fa' ); ?></li>
209 <li><span class="dashicons dashicons-saved"></span> <?php \esc_html_e( 'Trusted devices: Allow users to add trusted devices so they do not have to manually enter the 2FA code each time they log in', 'wp-2fa' ); ?></li>
210 <li><span class="dashicons dashicons-saved"></span> <?php \esc_html_e( 'White labeling features: Gain increased trust by extending your business’ branding and tone of voice to all 2FA pages, wizards & emails', 'wp-2fa' ); ?></li>
211 <li><span class="dashicons dashicons-saved"></span> <?php \esc_html_e( 'Refer to the features matrix below for a detailed list of all the premium features', 'wp-2fa' ); ?></li>
212 </ul>
213 <div class="premium-cta">
214 <a href="<?php echo \esc_url( 'https://melapress.com/wordpress-2fa/pricing/?utm_source=plugin&utm_medium=wp2fa&utm_campaign=upgrade_to_premium_banner_2' ); ?>" target="_blank" rel="noopener"><?php \esc_html_e( 'Upgrade to Premium', 'wp-2fa' ); ?></a>
215 </div>
216 </div>
217 <div class="content-block">
218 <p><strong><?php \esc_html_e( 'WP 2FA plugin features', 'wp-2fa' ); ?></strong></p>
219 <p><?php \esc_html_e( 'Take advantage of these benefits and many others, with prices starting from as little as $29 for 5 users per year. ', 'wp-2fa' ); ?></p>
220 <table class="c21 feature-table">
221 <tbody>
222 <tr class="c2">
223 <td class="c6" colspan="1" rowspan="1">
224 <p class="c10 c4"><span class="c5"></span></p>
225 </td>
226 <td class="c8 row-head" colspan="1" rowspan="1">
227 <p class="c7"><span class="c5"><?php \esc_html_e( 'Premium', 'wp-2fa' ); ?></span></p>
228 </td>
229 <td class="c12 row-head" colspan="1" rowspan="1">
230 <p class="c7"><span class="c5"><?php \esc_html_e( 'Free', 'wp-2fa' ); ?></span></p>
231 </td>
232 </tr>
233 <tr class="c2">
234 <td class="c6" colspan="1" rowspan="1">
235 <p class="c10"><span class="c5"><?php \esc_html_e( 'Support', 'wp-2fa' ); ?></span></p>
236 </td>
237 <td class="c8" colspan="1" rowspan="1">
238 <p class="c7"><span class="c5"><?php \esc_html_e( '1-to-1 emails, forums', 'wp-2fa' ); ?></span></p>
239 </td>
240 <td class="c12" colspan="1" rowspan="1">
241 <p class="c7"><span class="c5"><?php \esc_html_e( 'forums', 'wp-2fa' ); ?></span></p>
242 </td>
243 </tr>
244 <tr class="c2">
245 <td class="c6" colspan="1" rowspan="1">
246 <p class="c10"><span class="c5"><?php \esc_html_e( 'Out of the box support for e-commerce, membership & third party plugins (no code required)', 'wp-2fa' ); ?></span></p>
247 </td>
248 <td class="c8" colspan="1" rowspan="1">
249 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
250 </td>
251 <td class="c12" colspan="1" rowspan="1">
252 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
253 </td>
254 </tr>
255 <tr class="c2">
256 <td class="c6" colspan="1" rowspan="1">
257 <p class="c10"><span class="c5"><?php \esc_html_e( '2FA code via mobile app', 'wp-2fa' ); ?></span></p>
258 </td>
259 <td class="c8" colspan="1" rowspan="1">
260 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
261 </td>
262 <td class="c12" colspan="1" rowspan="1">
263 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
264 </td>
265 </tr>
266 <tr class="c2">
267 <td class="c6" colspan="1" rowspan="1">
268 <p class="c10"><span class="c5"><?php \esc_html_e( '2FA code over email', 'wp-2fa' ); ?></span></p>
269 </td>
270 <td class="c8" colspan="1" rowspan="1">
271 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
272 </td>
273 <td class="c12" colspan="1" rowspan="1">
274 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
275 </td>
276 </tr>
277 <tr class="c2">
278 <td class="c6" colspan="1" rowspan="1">
279 <p class="c10"><span class="c5"><?php \esc_html_e( '2FA login with hardware key (YubiKey)', 'wp-2fa' ); ?></span></p>
280 </td>
281 <td class="c8" colspan="1" rowspan="1">
282 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
283 </td>
284 <td class="c12" colspan="1" rowspan="1">
285 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
286 </td>
287 </tr>
288 <tr class="c2">
289 <td class="c6" colspan="1" rowspan="1">
290 <p class="c10"><span class="c5"><?php \esc_html_e( '2FA login with push notification (Authy)', 'wp-2fa' ); ?></span></p>
291 </td>
292 <td class="c8" colspan="1" rowspan="1">
293 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
294 </td>
295 <td class="c12" colspan="1" rowspan="1">
296 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
297 </td>
298 </tr>
299 <tr class="c2">
300 <td class="c6" colspan="1" rowspan="1">
301 <p class="c10"><span class="c5"><?php \esc_html_e( '2FA Login with SMS (with Twilio or Clickatell)', 'wp-2fa' ); ?></span></p>
302 </td>
303 <td class="c8" colspan="1" rowspan="1">
304 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
305 </td>
306 <td class="c12" colspan="1" rowspan="1">
307 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
308 </td>
309 </tr>
310 <tr class="c2">
311 <td class="c6" colspan="1" rowspan="1">
312 <p class="c10"><span class="c5"><?php \esc_html_e( 'One-click 2FA login (via link in email)', 'wp-2fa' ); ?></span></p>
313 </td>
314 <td class="c8" colspan="1" rowspan="1">
315 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
316 </td>
317 <td class="c12" colspan="1" rowspan="1">
318 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
319 </td>
320 </tr>
321 <tr class="c2">
322 <td class="c6" colspan="1" rowspan="1">
323 <p class="c10"><span class="c5"><?php \esc_html_e( 'Allow next login without 2FA', 'wp-2fa' ); ?></span></p>
324 </td>
325 <td class="c8" colspan="1" rowspan="1">
326 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
327 </td>
328 <td class="c12" colspan="1" rowspan="1">
329 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
330 </td>
331 </tr>
332 <tr class="c2">
333 <td class="c6" colspan="1" rowspan="1">
334 <p class="c10"><span class="c5"><?php \esc_html_e( 'Different 2FA policies per user role', 'wp-2fa' ); ?></span></p>
335 </td>
336 <td class="c8" colspan="1" rowspan="1">
337 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
338 </td>
339 <td class="c12" colspan="1" rowspan="1">
340 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
341 </td>
342 </tr>
343 <tr class="c2">
344 <td class="c6" colspan="1" rowspan="1">
345 <p class="c10"><span class="c5"><?php \esc_html_e( 'Trusted devices (remember devices)', 'wp-2fa' ); ?></span></p>
346 </td>
347 <td class="c8" colspan="1" rowspan="1">
348 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
349 </td>
350 <td class="c12" colspan="1" rowspan="1">
351 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
352 </td>
353 </tr>
354 <tr class="c2">
355 <td class="c6" colspan="1" rowspan="1">
356 <p class="c10"><span class="c5"><?php \esc_html_e( 'Alternative 2FA methods', 'wp-2fa' ); ?></span></p>
357 </td>
358 <td class="c8" colspan="1" rowspan="1">
359 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
360 </td>
361 <td class="c12" colspan="1" rowspan="1">
362 <p class="c7"><span class="c5"><?php \esc_html_e( 'Backup codes only', 'wp-2fa' ); ?></span></p>
363 </td>
364 </tr>
365 <tr class="c2">
366 <td class="c6" colspan="1" rowspan="1">
367 <p class="c10"><span class="c5"><?php \esc_html_e( 'White labeling (logo, wizards, email, colours, fonts & custom CSS)', 'wp-2fa' ); ?></span></p>
368 </td>
369 <td class="c8" colspan="1" rowspan="1">
370 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
371 </td>
372 <td class="c12" colspan="1" rowspan="1">
373 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
374 </td>
375 </tr>
376 <tr class="c2">
377 <td class="c6" colspan="1" rowspan="1">
378 <p class="c10"><span class="c5"><?php \esc_html_e( 'One-click 2FA integration in WooCommerce user page', 'wp-2fa' ); ?></span></p>
379 </td>
380 <td class="c8" colspan="1" rowspan="1">
381 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
382 </td>
383 <td class="c12" colspan="1" rowspan="1">
384 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
385 </td>
386 </tr>
387 <tr class="c2">
388 <td class="c6" colspan="1" rowspan="1">
389 <p class="c10"><span class="c5"><?php \esc_html_e( 'Reports & Statistics', 'wp-2fa' ); ?></span></p>
390 </td>
391 <td class="c8" colspan="1" rowspan="1">
392 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
393 </td>
394 <td class="c12" colspan="1" rowspan="1">
395 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
396 </td>
397 </tr>
398 <tr class="c2">
399 <td class="c6" colspan="1" rowspan="1">
400 <p class="c10"><span class="c5"><?php \esc_html_e( 'Configurable 2FA code expiration time', 'wp-2fa' ); ?></span></p>
401 </td>
402 <td class="c8" colspan="1" rowspan="1">
403 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
404 </td>
405 <td class="c12" colspan="1" rowspan="1">
406 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
407 </td>
408 </tr>
409 <tr class="c2">
410 <td class="c6" colspan="1" rowspan="1">
411 <p class="c10"><span class="c5"><?php \esc_html_e( 'Sortable users\' 2FA status', 'wp-2fa' ); ?></span></p>
412 </td>
413 <td class="c8" colspan="1" rowspan="1">
414 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
415 </td>
416 <td class="c12" colspan="1" rowspan="1">
417 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
418 </td>
419 </tr>
420 <tr class="c2">
421 <td class="c6" colspan="1" rowspan="1">
422 <p class="c10"><span class="c5"><?php \esc_html_e( 'Export/import plugin settings', 'wp-2fa' ); ?></span></p>
423 </td>
424 <td class="c8" colspan="1" rowspan="1">
425 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
426 </td>
427 <td class="c12" colspan="1" rowspan="1">
428 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
429 </td>
430 </tr>
431 <tr class="c2">
432 <td class="c6" colspan="1" rowspan="1">
433 <p class="c10"><span class="c5"><?php \esc_html_e( 'No Ads!', 'wp-2fa' ); ?></span></p>
434 </td>
435 <td class="c8" colspan="1" rowspan="1">
436 <p class="c7"><span class="c5"><span class="dashicons dashicons-saved"></span></span></p>
437 </td>
438 <td class="c12" colspan="1" rowspan="1">
439 <p class="c7"><span class="c5"><span class="dashicons dashicons-no"></span></span></p>
440 </td>
441 </tr>
442 </tbody>
443 </table>
444
445 <div class="premium-cta">
446 <a href="<?php echo \esc_url( 'https://melapress.com/wordpress-2fa/pricing/?utm_source=plugin&utm_medium=wp2fa&utm_campaign=upgrade_to_premium_banner_3' ); ?>" target="_blank" rel="noopener"><?php \esc_html_e( 'Upgrade to Premium', 'wp-2fa' ); ?></a>
447 </div>
448 </div>
449
450 <div>
451 <p>
452 <?php
453 $text = sprintf(
454 /* translators: 1: Link to our site 2: Link to our contact page */
455 \esc_html__( 'Visit the WP 2FA %1$s for more information or %2$s with any questions you might have. We look forward to hearing from you.', 'wp-2fa' ),
456 '<a target="_blank" href="' . \esc_url( 'https://melapress.com/wordpress-2fa/?&utm_source=plugin&utm_medium=wp2fa&utm_campaign=melapress_plugin_website' ) . '">' . \esc_html__( 'plugin website', 'wp-2fa' ) . '</a>',
457 '<a target="_blank" href="' . \esc_url( 'https://melapress.com/contact/?&utm_source=plugin&utm_medium=wp2fa&utm_campaign=melapress_contact_us' ) . '">' . \esc_html__( 'contact us', 'wp-2fa' ) . '</a>'
458 );
459
460 echo $text; // phpcs:ignore -- Visit the WP 2FA plugin website for more information or contact us with any questions you might have. We look forward to hearing from you.
461 ?>
462 </p>
463 </div>
464 </div>
465 <?php
466 }
467
468 /**
469 * Add "_blank" attr to pricing link to ensure it opens in new tab.
470 *
471 * @return void
472 *
473 * @since 2.8.0
474 */
475 public static function pricing_new_tab_js() {
476 ?>
477 <script type="text/javascript">
478 jQuery( document ).ready( function() {
479 jQuery( '.wp-2fa.pricing' ).parent().attr( 'target', '_blank' );
480 });
481 </script>
482 <?php
483 }
484 }
485 }
486