PluginProbe
LoginPress | wp-login Custom Login Page Customizer / 1.6.0
LoginPress | wp-login Custom Login Page Customizer v1.6.0
6.2.5 6.2.4 6.2.3 6.2.2 6.2.1 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.2 1.0.20 1.0.21 1.0.22 1.0.23 1.0.3 1.0.4 All 118 releases
loginpress / loginpress.php

loginpress.php in LoginPress | wp-login Custom Login Page Customizer 1.6.0, at loginpress.php

655 lines 20.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plugin Name: LoginPress - Customizing the WordPress Login Screen.
4 * Plugin URI: https://loginpress.pro/?utm_source=loginpress-lite&utm_medium=plugin-inside&utm_campaign=pro-upgrade&utm_content=plugin_uri
5 * Description: LoginPress is the best <code>wp-login</code> Login Page Customizer plugin by <a href="https://wpbrigade.com/?utm_source=loginpress-lite">WPBrigade</a> which allows you to completely change the layout of login, register and forgot password forms.
6 * Version: 1.6.0
7 * Author: WPBrigade
8 * Author URI: https://WPBrigade.com/?utm_source=loginpress-lite
9 * Text Domain: loginpress
10 * Domain Path: /languages
11 *
12 * @package loginpress
13 * @category Core
14 * @author WPBrigade
15 */
16
17
18 if ( ! class_exists( 'LoginPress' ) ) :
19
20 final class LoginPress {
21
22 /**
23 * @var string
24 */
25 public $version = '1.6.0';
26
27 /**
28 * @var The single instance of the class
29 * @since 1.0.0
30 */
31 protected static $_instance = null;
32
33 /**
34 * @var WP_Session session
35 */
36 public $session = null;
37
38 /**
39 * @var WP_Query $query
40 */
41 public $query = null;
42
43 /**s
44 * @var WP_Countries $countries
45 */
46 public $countries = null;
47
48 /* * * * * * * * * *
49 * Class constructor
50 * * * * * * * * * */
51 public function __construct() {
52
53 $this->define_constants();
54 $this->includes();
55 $this->_hooks();
56
57 }
58
59 /**
60 * Define LoginPress Constants
61 */
62 private function define_constants() {
63
64 $this->define( 'LOGINPRESS_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
65 $this->define( 'LOGINPRESS_DIR_PATH', plugin_dir_path( __FILE__ ) );
66 $this->define( 'LOGINPRESS_DIR_URL', plugin_dir_url( __FILE__ ) );
67 $this->define( 'LOGINPRESS_ROOT_PATH', dirname( __FILE__ ) . '/' );
68 $this->define( 'LOGINPRESS_ROOT_FILE', __FILE__ );
69 $this->define( 'LOGINPRESS_VERSION', $this->version );
70 $this->define( 'LOGINPRESS_FEEDBACK_SERVER', 'https://wpbrigade.com/' );
71 }
72
73 /**
74 * Include required core files used in admin and on the frontend.
75 * @version 1.1.7
76 */
77
78 public function includes() {
79
80 include_once( LOGINPRESS_DIR_PATH . 'include/compatibility.php' );
81 include_once( LOGINPRESS_DIR_PATH . 'custom.php' );
82 include_once( LOGINPRESS_DIR_PATH . 'classes/class-loginpress-setup.php' );
83 include_once( LOGINPRESS_DIR_PATH . 'classes/class-loginpress-ajax.php' );
84 // include_once( LOGINPRESS_DIR_PATH . 'classes/class-loginpress-filter-plugin.php' );
85 include_once( LOGINPRESS_DIR_PATH . 'classes/class-loginpress-developer-hooks.php' );
86 include_once( LOGINPRESS_DIR_PATH . 'classes/class-loginpress-notifications.php' );
87 if ( is_multisite() ) {
88 require_once( LOGINPRESS_DIR_PATH . 'include/class-loginpress-theme-template.php' );
89 }
90
91 $loginpress_setting = get_option( 'loginpress_setting' );
92
93 $loginpress_privacy_policy = isset( $loginpress_setting['enable_privacy_policy'] ) ? $loginpress_setting['enable_privacy_policy'] : 'off';
94 if ( 'off' != $loginpress_privacy_policy ) {
95 include_once( LOGINPRESS_DIR_PATH . 'include/privacy-policy.php' );
96 }
97
98 $login_with_email = isset( $loginpress_setting['login_order'] ) ? $loginpress_setting['login_order'] : 'default';
99 if ( 'default' != $login_with_email ) {
100 include_once( LOGINPRESS_DIR_PATH . 'classes/class-loginpress-login-order.php' );
101 new LoginPress_Login_Order();
102 }
103
104 $enable_reg_pass_field = isset( $loginpress_setting['enable_reg_pass_field'] ) ? $loginpress_setting['enable_reg_pass_field'] : 'off';
105 if ( 'off' != $enable_reg_pass_field ) {
106 include_once( LOGINPRESS_DIR_PATH . 'classes/class-loginpress-custom-password.php' );
107 new LoginPresss_Custom_Password();
108 }
109
110 }
111
112 /**
113 * Hook into actions and filters
114 * @since 1.0.0
115 * @version 1.2.2
116 */
117 private function _hooks() {
118
119 add_action( 'admin_menu', array( $this, 'register_options_page' ) );
120 add_action( 'plugins_loaded', array( $this, 'textdomain' ) );
121 add_filter( 'plugin_row_meta', array( $this, '_row_meta'), 10, 2 );
122 add_action( 'admin_enqueue_scripts', array( $this, '_admin_scripts' ) );
123 add_action( 'admin_footer', array( $this, 'add_deactive_modal' ) );
124 add_action( 'plugin_action_links', array( $this, 'loginpress_action_links' ), 10, 2 );
125 add_action( 'admin_init', array( $this, 'redirect_optin' ) );
126 add_filter( 'auth_cookie_expiration', array( $this, '_change_auth_cookie_expiration' ), 10, 3 );
127 //add_filter( 'plugins_api', array( $this, 'get_addon_info_' ) , 100, 3 );
128 if ( is_multisite() ) {
129 add_action( 'admin_init', array( $this, 'redirect_loginpress_edit_page' ) );
130 add_action( 'admin_init', array( $this, 'check_loginpress_page' ) );
131 // Makes sure the plugin is defined before trying to use it
132 if ( ! function_exists( 'is_plugin_active_for_network' ) || ! function_exists( 'is_plugin_active' ) ) {
133 require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
134 if ( is_plugin_active_for_network( 'wordpress-seo/wp-seo.php' ) ) {
135 /**
136 * This filters the ID of the page/post which you want to remove from the sitemap XML.
137 * @since 1.5.14
138 *
139 * @documentation https://developer.yoast.com/features/xml-sitemaps/api/
140 */
141 add_filter( 'wpseo_exclude_from_sitemap_by_post_ids', array( $this, 'loginpress_exclude_from_sitemap' ) );
142 }
143 }
144
145
146 }
147
148 }
149
150 /**
151 * Callback function to exclude LoginPress page from sitemap.
152 *
153 * @return bool Exclude page/s or post/s.
154 * @since 1.5.14
155 */
156 public function loginpress_exclude_from_sitemap() {
157
158 $page = get_page_by_path( 'loginpress' );
159 if ( is_object( $page ) ) {
160 return array( $page->ID );
161 }
162 }
163
164 /**
165 * Redirect to Optin page.
166 *
167 * @since 1.0.15
168 */
169 function redirect_optin() {
170
171 // delete_option( '_loginpress_optin' );
172
173 if ( isset( $_POST['loginpress-submit-optout'] ) ) {
174
175 update_option( '_loginpress_optin', 'no' );
176 $this->_send_data( array(
177 'action' => 'Skip',
178 ) );
179
180 } elseif ( isset( $_POST['loginpress-submit-optin'] ) ) {
181
182 update_option( '_loginpress_optin', 'yes' );
183 $fields = array(
184 'action' => 'Activate',
185 'track_mailchimp' => 'yes'
186 );
187 $this->_send_data( $fields );
188
189 } elseif ( ! get_option( '_loginpress_optin' ) && isset( $_GET['page'] ) && ( $_GET['page'] === 'loginpress-settings' || $_GET['page'] === 'loginpress' || $_GET['page'] === 'abw' ) ) {
190
191 /**
192 * XSS Attack vector found and fixed.
193 *
194 * @since 1.5.11
195 */
196 $page_redirect = $_GET['page'] === 'loginpress' ? 'loginpress' : 'loginpress-settings';
197 wp_redirect( admin_url('admin.php?page=loginpress-optin&redirect-page=' . $page_redirect) );
198 exit;
199 } elseif ( get_option( '_loginpress_optin' ) && ( get_option( '_loginpress_optin' ) == 'yes' || get_option( '_loginpress_optin' ) == 'no' ) && isset( $_GET['page'] ) && $_GET['page'] === 'loginpress-optin' ) {
200 wp_redirect( admin_url( 'admin.php?page=loginpress-settings' ) );
201 exit;
202 }
203 }
204
205
206 /**
207 * Main Instance
208 *
209 * @since 1.0.0
210 * @static
211 * @see loginPress_loader()
212 * @return Main instance
213 */
214 public static function instance() {
215 if ( is_null( self::$_instance ) ) {
216 self::$_instance = new self();
217 }
218 return self::$_instance;
219 }
220
221
222 /**
223 * Load Languages
224 * @since 1.0.0
225 */
226 public function textdomain() {
227
228 $plugin_dir = dirname( plugin_basename( __FILE__ ) ) ;
229 load_plugin_textdomain( 'loginpress', false, $plugin_dir . '/languages/' );
230 }
231
232 /**
233 * Define constant if not already set
234 * @param string $name
235 * @param string|bool $value
236 */
237 private function define( $name, $value ) {
238 if ( ! defined( $name ) ) {
239 define( $name, $value );
240 }
241 }
242
243 /**
244 * Init WPBrigade when WordPress Initialises.
245 */
246 public function init() {
247 // Before init action
248 }
249
250 /**
251 * Create LoginPress Page Template.
252 *
253 * @since 1.1.3
254 */
255 public function check_loginpress_page() {
256
257 // Retrieve the LoginPress admin page option, that was created during the activation process.
258 $option = $this->get_loginpress_page();
259
260 include LOGINPRESS_DIR_PATH . 'include/create-loginpress-page.php';
261 // Retrieve the status of the page, if the option is available.
262 if ( $option ) {
263 $page = get_post( $option );
264 $status = $page->post_status;
265 } else {
266 $status = null;
267 }
268
269 // Check the status of the page. Let's fix it, if the page is missing or in the trash.
270 if ( empty( $status ) || 'trash' === $status ) {
271 new LoginPress_Page_Create();
272 }
273 }
274
275 /**
276 * function for redirect the LoginPress page on editing.
277 *
278 * @since 1.1.3
279 */
280 public function redirect_loginpress_edit_page() {
281 global $pagenow;
282
283 $page = $this->get_loginpress_page();
284
285 if ( ! $page ) {
286 return;
287 }
288
289 $page_url = get_permalink( $page );
290 $page_id = get_post( $page );
291 $page_id = $page->ID;
292
293 // Generate the redirect url.
294 $url = add_query_arg(
295 array(
296 'autofocus[section]' => 'loginpress_panel',
297 'url' => rawurlencode( $page_url ),
298 ),
299 admin_url( 'customize.php' )
300 );
301
302 /* Check current admin page. */
303 if ( $pagenow == 'post.php' && isset( $_GET['post'] ) && $_GET['post'] == $page_id ) {
304 wp_safe_redirect( $url );
305 }
306 }
307
308 /**
309 * Add new page in Apperance to customize Login Page
310 */
311 public function register_options_page() {
312
313 add_submenu_page( null, __( 'Activate', 'loginpress' ), __( 'Activate', 'loginpress' ), 'manage_options', 'loginpress-optin', array( $this, 'render_optin' ) );
314
315 add_theme_page( __( 'LoginPress', 'loginpress' ), __( 'LoginPress', 'loginpress' ), 'manage_options', "abw", '__return_null' );
316 }
317
318
319 /**
320 * Show Opt-in Page.
321 *
322 * @since 1.0.15
323 */
324 function render_optin() {
325 include LOGINPRESS_DIR_PATH . 'include/loginpress-optin-form.php';
326 }
327
328 /**
329 * Wrapper function to send data.
330 * @param [arrays] $args.
331 *
332 * @since 1.0.15
333 * @version 1.0.23
334 */
335 function _send_data( $args ) {
336
337 $cuurent_user = wp_get_current_user();
338 $fields = array(
339 'email' => get_option( 'admin_email' ),
340 'website' => get_site_url(),
341 'action' => '',
342 'reason' => '',
343 'reason_detail' => '',
344 'display_name' => $cuurent_user->display_name,
345 'blog_language' => get_bloginfo( 'language' ),
346 'wordpress_version' => get_bloginfo( 'version' ),
347 'php_version' => PHP_VERSION,
348 'plugin_version' => LOGINPRESS_VERSION,
349 'plugin_name' => 'LoginPress Free',
350 );
351
352 $args = array_merge( $fields, $args );
353 $response = wp_remote_post( LOGINPRESS_FEEDBACK_SERVER, array(
354 'method' => 'POST',
355 'timeout' => 5,
356 'httpversion' => '1.0',
357 'blocking' => true,
358 'headers' => array(),
359 'body' => $args,
360 ) );
361
362 // echo '<pre>'; print_r( $args ); echo '</pre>';
363
364 }
365
366 /**
367 * Session Expiration
368 *
369 * @since 1.0.18
370 * @version 1.3.2
371 */
372 function _change_auth_cookie_expiration( $expiration, $user_id, $remember ) {
373
374 $loginpress_setting = get_option( 'loginpress_setting' );
375 $_expiration = isset( $loginpress_setting['session_expiration'] ) ? intval( $loginpress_setting['session_expiration'] ) : '';
376
377 /**
378 * return the WordPress default $expiration time if LoginPress Session Expiration time set 0 or empty.
379 * @since 1.0.18
380 */
381 if ( empty( $_expiration ) || '0' == $_expiration ) {
382 return $expiration;
383 }
384
385 /**
386 * $filter_role Use filter `loginpress_exclude_role_session` for return the role.
387 * By default it's false and $expiration time will apply on all user.
388 *
389 * @return string/array role name.
390 * @since 1.3.2
391 */
392 $filter_role = apply_filters( 'loginpress_exclude_role_session', false );
393
394 if ( $filter_role ) {
395 $user_roles = get_userdata( $user_id )->roles;
396
397 // if $filter_role is array, return the default $expiration for each defined role.
398 if ( is_array( $filter_role ) ) {
399 foreach ( $filter_role as $role ) {
400 if ( in_array( $role, $user_roles ) ) {
401 return $expiration;
402 }
403 }
404 } else if ( in_array( $filter_role, $user_roles ) ) {
405 return $expiration;
406 }
407 }
408
409 // Convert Duration (minutes) of the expiration period in seconds.
410 $expiration = $_expiration * 60;
411
412 return $expiration;
413 }
414
415 /**
416 * Load JS or CSS files at admin side and enqueue them
417 * @param string tell you the Page ID
418 * @return void
419 */
420 function _admin_scripts( $hook ) {
421
422 if( $hook == 'toplevel_page_loginpress-settings' || $hook == 'loginpress_page_loginpress-addons' || $hook == 'loginpress_page_loginpress-help' || $hook == 'loginpress_page_loginpress-import-export' || $hook == 'loginpress_page_loginpress-license' ) {
423
424 wp_enqueue_style( 'loginpress_stlye', plugins_url( 'css/style.css', __FILE__ ), array(), LOGINPRESS_VERSION );
425 wp_enqueue_script( 'loginpress_js', plugins_url( 'js/admin-custom.js', __FILE__ ), array(), LOGINPRESS_VERSION );
426
427 // Array for localize.
428 $loginpress_localize = array(
429 'plugin_url' => plugins_url(),
430 );
431
432 wp_localize_script( 'loginpress_js', 'loginpress_script', $loginpress_localize );
433 }
434
435 }
436
437 /**
438 * Add rating icon on plugins page.
439 *
440 * @since 1.0.9
441 * @version 1.1.22
442 */
443
444 public function _row_meta( $meta_fields, $file ) {
445
446 if ( $file != 'loginpress/loginpress.php' ) {
447
448 return $meta_fields;
449 }
450
451 echo "<style>.loginpress-rate-stars { display: inline-block; color: #ffb900; position: relative; top: 3px; }.loginpress-rate-stars svg{ fill:#ffb900; } .loginpress-rate-stars svg:hover{ fill:#ffb900 } .loginpress-rate-stars svg:hover ~ svg{ fill:none; } </style>";
452
453 $plugin_rate = "https://wordpress.org/support/plugin/loginpress/reviews/?rate=5#new-post";
454 $plugin_filter = "https://wordpress.org/support/plugin/loginpress/reviews/?filter=5";
455 $svg_xmlns = "https://www.w3.org/2000/svg";
456 $svg_icon = '';
457
458 for ( $i = 0; $i < 5; $i++ ) {
459 $svg_icon .= "<svg xmlns='" . esc_url( $svg_xmlns ) . "' width='15' height='15' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-star'><polygon points='12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2'/></svg>";
460 }
461
462 // Set icon for thumbsup.
463 $meta_fields[] = '<a href="' . esc_url( $plugin_filter ) . '" target="_blank"><span class="dashicons dashicons-thumbs-up"></span>' . __( 'Vote!', 'loginpress' ) . '</a>';
464
465 // Set icon for 5-star reviews. v1.1.22
466 $meta_fields[] = "<a href='" . esc_url( $plugin_rate ) . "' target='_blank' title='" . esc_html__( 'Rate', 'loginpress' ) . "'><i class='loginpress-rate-stars'>" . $svg_icon . "</i></a>";
467
468 return $meta_fields;
469 }
470
471 /**
472 * Add deactivate modal layout.
473 */
474 function add_deactive_modal() {
475 global $pagenow;
476
477 if ( 'plugins.php' !== $pagenow ) {
478 return;
479 }
480
481 include LOGINPRESS_DIR_PATH . 'include/deactivate_modal.php';
482 include LOGINPRESS_DIR_PATH . 'include/loginpress-optout-form.php';
483 }
484
485 /**
486 * Plugin activation
487 *
488 * @since 1.0.15
489 * @version 1.0.22
490 */
491 static function plugin_activation() {
492
493 $loginpress_key = get_option( 'loginpress_customization' );
494 $loginpress_setting = get_option( 'loginpress_setting' );
495
496 // Create a key 'loginpress_customization' with empty array.
497 if ( ! $loginpress_key ) {
498 update_option( 'loginpress_customization', array() );
499 }
500
501 // Create a key 'loginpress_setting' with empty array.
502 if ( ! $loginpress_setting ) {
503 update_option( 'loginpress_setting', array() );
504 }
505 }
506
507 static function plugin_uninstallation() {
508
509 $email = get_option( 'admin_email' );
510
511 $fields = array(
512 'email' => $email,
513 'website' => get_site_url(),
514 'action' => 'Uninstall',
515 'reason' => '',
516 'reason_detail' => '',
517 'blog_language' => get_bloginfo( 'language' ),
518 'wordpress_version' => get_bloginfo( 'version' ),
519 'php_version' => PHP_VERSION,
520 'plugin_version' => LOGINPRESS_VERSION,
521 'plugin_name' => 'LoginPress Free',
522 );
523
524 $response = wp_remote_post( LOGINPRESS_FEEDBACK_SERVER, array(
525 'method' => 'POST',
526 'timeout' => 5,
527 'httpversion' => '1.0',
528 'blocking' => false,
529 'headers' => array(),
530 'body' => $fields,
531 ) );
532
533 }
534
535
536
537 /**
538 * Pull the LoginPress page from options.
539 *
540 * @access public
541 * @since 1.1.3
542 * @version 1.1.7
543 */
544 public function get_loginpress_page() {
545
546 $loginpress_setting = get_option( 'loginpress_setting', array() );
547 if ( ! is_array( $loginpress_setting ) && empty( $loginpress_setting ) ) {
548 $loginpress_setting = array();
549 }
550 $page = array_key_exists( 'loginpress_page', $loginpress_setting ) ? get_post( $loginpress_setting['loginpress_page'] ) : false;
551
552 return $page;
553 }
554
555
556 /**
557 * Add a link to the settings page to the plugins list
558 *
559 * @since 1.0.11
560 */
561 public function loginpress_action_links( $links, $file ) {
562
563 static $this_plugin;
564
565 if ( empty( $this_plugin ) ) {
566
567 $this_plugin = 'loginpress/loginpress.php';
568 }
569
570 if ( $file == $this_plugin ) {
571
572 $settings_link = sprintf( esc_html__( '%1$s Settings %2$s | %3$s Customize %4$s', 'loginpress' ), '<a href="' . admin_url( 'admin.php?page=loginpress-settings' ) . '">', '</a>', '<a href="' . admin_url( 'admin.php?page=loginpress' ) . '">', '</a>' );
573
574
575 if( 'yes' == get_option( '_loginpress_optin' ) ){
576 $settings_link .= sprintf( esc_html__( ' | %1$s Opt Out %2$s ', 'loginpress'), '<a class="opt-out" href="' . admin_url( 'admin.php?page=loginpress-settings' ) . '">', '</a>' );
577 } else {
578 $settings_link .= sprintf( esc_html__( ' | %1$s Opt In %2$s ', 'loginpress'), '<a href="' . admin_url( 'admin.php?page=loginpress-optin&redirect-page=' .'loginpress-settings' ) . '">', '</a>' );
579 }
580
581 array_unshift( $links, $settings_link );
582
583 if ( ! has_action( 'loginpress_pro_add_template' ) ) :
584 $pro_link = sprintf( esc_html__( '%1$s %3$s Upgrade Pro %4$s %2$s', 'loginpress' ), '<a href="https://wpbrigade.com/wordpress/plugins/loginpress-pro/?utm_source=loginpress-lite&utm_medium=plugin-action-link&utm_campaign=pro-upgrade" target="_blank">', '</a>', '<span class="loginpress-dasboard-pro-link">', '</span>' );
585 array_push( $links, $pro_link );
586 endif;
587 }
588
589 return $links;
590 }
591
592 // function get_addon_info_( $api, $action, $args ) {
593
594 // if ( $action == 'plugin_information' && empty( $api ) && ( ! empty( $_GET['lgp'] ) ) ) {
595
596 // $raw_response = wp_remote_post( 'https://wpbrigade.com/loginpress-api/search.php', array(
597 // 'body' => array(
598 // 'slug' => $args->slug
599 // ) )
600 // );
601
602 // if ( is_wp_error( $raw_response ) || $raw_response['response']['code'] != 200 ) {
603 // return false;
604 // }
605
606 // $plugin = unserialize( $raw_response['body'] );
607
608 // $api = new stdClass();
609 // $api->name = $plugin['title'];
610 // $api->version = $plugin['version'];
611 // $api->download_link = $plugin['download_url'];
612 // $api->tested = '10.0';
613
614 // }
615
616 // return $api;
617 // }
618 } // End Of Class.
619 endif;
620
621
622 /**
623 * Returns the main instance of WP to prevent the need to use globals.
624 *
625 * @since 1.0.0
626 * @return LoginPress
627 */
628 function loginPress_loader() {
629 return LoginPress::instance();
630 }
631
632 // Call the function
633 loginPress_loader();
634
635 /**
636 * Create the Object of Custom Login Entites and Settings.
637 *
638 * @since 1.0.0
639 */
640 new LoginPress_Entities();
641 new LoginPress_Settings();
642
643 /**
644 * Create the Object of Remote Notification.
645 *
646 * @since 1.0.9
647 */
648 if (!class_exists('TAV_Remote_Notification_Client')) {
649 require( LOGINPRESS_ROOT_PATH . 'include/class-remote-notification-client.php' );
650 }
651 $notification = new TAV_Remote_Notification_Client( 125, '16765c0902705d62', 'https://wpbrigade.com?post_type=notification' );
652
653 register_activation_hook( __FILE__, array( 'LoginPress', 'plugin_activation' ) );
654 register_uninstall_hook( __FILE__, array( 'LoginPress', 'plugin_uninstallation' ) );
655