Theme My Login - Version 7.0.14

Version Description

  • Fix login page error on on WP 5.2+
  • Implement caching for remote extension data to speed up plugins screen
  • Implement a CLI command for adding TML actions as nav menu items
  • Ensure password recovery error messages match core
  • Fix notice if a settings field isn't passed with an args parameter
  • Fix permalinks being flushed on all TML admin pages
  • Allow form attributes to be set in the form constructor
  • Add tml_activate_extension action hook
  • Add tml_deactivate_extension action hook
Download this release

Release Info

Developer jfarthing84
Plugin Icon 128x128 Theme My Login
Version 7.0.14
Comparing to
See all releases

Code changes from version 7.0.13 to 7.0.14

admin/settings.php CHANGED
@@ -68,7 +68,7 @@ function tml_admin_register_settings() {
68
 
69
  // Add the field
70
  if ( ! empty( $field['callback'] ) && ! empty( $field['title'] ) ) {
71
- add_settings_field( $field_id, $field['title'], $field['callback'], $page, $section_id, $field['args'] );
72
  }
73
 
74
  // Register the setting
@@ -458,7 +458,9 @@ function tml_admin_setting_callback_license_key_field( $args ) {
458
  function tml_admin_settings_page() {
459
  global $title, $plugin_page;
460
 
461
- tml_flush_rewrite_rules();
 
 
462
 
463
  settings_errors();
464
  ?>
68
 
69
  // Add the field
70
  if ( ! empty( $field['callback'] ) && ! empty( $field['title'] ) ) {
71
+ add_settings_field( $field_id, $field['title'], $field['callback'], $page, $section_id, isset( $field['args'] ) ? $field['args'] : array() );
72
  }
73
 
74
  // Register the setting
458
  function tml_admin_settings_page() {
459
  global $title, $plugin_page;
460
 
461
+ if ( 'theme-my-login' == $plugin_page ) {
462
+ tml_flush_rewrite_rules();
463
+ }
464
 
465
  settings_errors();
466
  ?>
includes/actions.php CHANGED
@@ -387,7 +387,7 @@ function tml_login_handler() {
387
  if ( headers_sent() ) {
388
  $user = new WP_Error( 'test_cookie', sprintf(
389
  __( '<strong>ERROR</strong>: Cookies are blocked due to unexpected output. For help, please see <a href="%1$s">this documentation</a> or try the <a href="%2$s">support forums</a>.' ),
390
- __( 'https://codex.wordpress.org/Cookies' ),
391
  __( 'https://wordpress.org/support/' )
392
  )
393
  );
@@ -395,7 +395,7 @@ function tml_login_handler() {
395
  // If cookies are disabled we can't log in even with a valid user+pass
396
  $user = new WP_Error( 'test_cookie', sprintf(
397
  __( '<strong>ERROR</strong>: Cookies are blocked or not supported by your browser. You must <a href="%s">enable cookies</a> to use WordPress.' ),
398
- __( 'https://codex.wordpress.org/Cookies' )
399
  )
400
  );
401
  }
@@ -433,6 +433,10 @@ function tml_login_handler() {
433
  $errors = new WP_Error;
434
  }
435
 
 
 
 
 
436
  // Some parts of this script use the main login form to display a message
437
  if ( isset( $_GET['loggedout'] ) && true == $_GET['loggedout'] ) {
438
  $errors->add( 'loggedout', __( 'You are now logged out.' ), 'message' );
@@ -626,18 +630,17 @@ function tml_password_reset_handler() {
626
  */
627
  function tml_confirmaction_handler() {
628
  if ( ! isset( $_GET['request_id'] ) ) {
629
- wp_die( __( 'Invalid request.' ) );
630
  }
631
 
632
- $request_id = (int) $_GET['request_id'];
633
-
634
- if ( isset( $_GET['confirm_key'] ) ) {
635
- $key = sanitize_text_field( wp_unslash( $_GET['confirm_key'] ) );
636
- $result = wp_validate_user_request_key( $request_id, $key );
637
- } else {
638
- $result = new WP_Error( 'invalid_key', __( 'Invalid key' ) );
639
  }
640
 
 
 
 
 
641
  if ( is_wp_error( $result ) ) {
642
  wp_die( $result );
643
  }
387
  if ( headers_sent() ) {
388
  $user = new WP_Error( 'test_cookie', sprintf(
389
  __( '<strong>ERROR</strong>: Cookies are blocked due to unexpected output. For help, please see <a href="%1$s">this documentation</a> or try the <a href="%2$s">support forums</a>.' ),
390
+ __( 'https://wordpress.org/support/article/cookies' ),
391
  __( 'https://wordpress.org/support/' )
392
  )
393
  );
395
  // If cookies are disabled we can't log in even with a valid user+pass
396
  $user = new WP_Error( 'test_cookie', sprintf(
397
  __( '<strong>ERROR</strong>: Cookies are blocked or not supported by your browser. You must <a href="%s">enable cookies</a> to use WordPress.' ),
398
+ __( 'https://wordpress.org/support/article/cookies#enable-cookies-your-browser' )
399
  )
400
  );
401
  }
433
  $errors = new WP_Error;
434
  }
435
 
436
+ if ( empty( $_POST ) && $errors->get_error_codes() === array( 'empty_username', 'empty_password' ) ) {
437
+ $errors = new WP_Error;
438
+ }
439
+
440
  // Some parts of this script use the main login form to display a message
441
  if ( isset( $_GET['loggedout'] ) && true == $_GET['loggedout'] ) {
442
  $errors->add( 'loggedout', __( 'You are now logged out.' ), 'message' );
630
  */
631
  function tml_confirmaction_handler() {
632
  if ( ! isset( $_GET['request_id'] ) ) {
633
+ wp_die( __( 'Missing request ID.' ) );
634
  }
635
 
636
+ if ( ! isset( $_GET['confirm_key'] ) ) {
637
+ wp_die( __( 'Missing confirm key.' ) );
 
 
 
 
 
638
  }
639
 
640
+ $request_id = (int) $_GET['request_id'];
641
+ $key = sanitize_text_field( wp_unslash( $_GET['confirm_key'] ) );
642
+ $result = wp_validate_user_request_key( $request_id, $key );
643
+
644
  if ( is_wp_error( $result ) ) {
645
  wp_die( $result );
646
  }
includes/class-theme-my-login-extension.php CHANGED
@@ -398,6 +398,15 @@ abstract class Theme_My_Login_Extension {
398
  * @since 7.0
399
  */
400
  public function activate() {
 
 
 
 
 
 
 
 
 
401
  /**
402
  * Fires when the extension is being activated.
403
  *
@@ -412,6 +421,15 @@ abstract class Theme_My_Login_Extension {
412
  * @since 7.0
413
  */
414
  public function deactivate() {
 
 
 
 
 
 
 
 
 
415
  /**
416
  * Fires when the extension is being deactivated.
417
  *
398
  * @since 7.0
399
  */
400
  public function activate() {
401
+ /**
402
+ * Fires when an extension is being activated.
403
+ *
404
+ * @since 7.0.14
405
+ *
406
+ * @param string $name The extension name.
407
+ */
408
+ do_action( 'tml_activate_extension', $this->get_name() );
409
+
410
  /**
411
  * Fires when the extension is being activated.
412
  *
421
  * @since 7.0
422
  */
423
  public function deactivate() {
424
+ /**
425
+ * Fires when the extension is being deactivated.
426
+ *
427
+ * @since 7.0.14
428
+ *
429
+ * @param string $slug The extension name.
430
+ */
431
+ do_action( 'tml_deactivate_extension', $this->get_name() );
432
+
433
  /**
434
  * Fires when the extension is being deactivated.
435
  *
includes/class-theme-my-login-form.php CHANGED
@@ -90,8 +90,9 @@ class Theme_My_Login_Form {
90
  $this->set_name( $name );
91
 
92
  $args = wp_parse_args( $args, array(
93
- 'action' => '',
94
- 'method' => 'post',
 
95
  ) );
96
 
97
  $this->set_action( $args['action'] );
@@ -109,6 +110,10 @@ class Theme_My_Login_Form {
109
  }
110
  }
111
 
 
 
 
 
112
  if ( ! empty( $args['render_args'] ) ) {
113
  $this->render_args = $args['render_args'];
114
  }
90
  $this->set_name( $name );
91
 
92
  $args = wp_parse_args( $args, array(
93
+ 'action' => '',
94
+ 'method' => 'post',
95
+ 'attributes' => array(),
96
  ) );
97
 
98
  $this->set_action( $args['action'] );
110
  }
111
  }
112
 
113
+ foreach ( (array) $args['attributes'] as $key => $value ) {
114
+ $this->add_attribute( $key, $value );
115
+ }
116
+
117
  if ( ! empty( $args['render_args'] ) ) {
118
  $this->render_args = $args['render_args'];
119
  }
includes/commands.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Theme My Login Command Functions
5
+ *
6
+ * @package Theme_My_Login
7
+ * @subpackage CLI
8
+ */
9
+
10
+ /**
11
+ * Adds a Theme My Login action menu item.
12
+ *
13
+ * ## OPTIONS
14
+ *
15
+ * <menu>
16
+ * : The name, slug, or term ID for the menu.
17
+ *
18
+ * <action>
19
+ * : The name of the Theme My Login action.
20
+ *
21
+ * [--title=<title>]
22
+ * : Set a custom title for the menu item.
23
+ *
24
+ * [--description=<description>]
25
+ * : Set a custom description for the menu item.
26
+ *
27
+ * [--attr-title=<attr-title>]
28
+ * : Set a custom title attribute for the menu item.
29
+ *
30
+ * [--target=<target>]
31
+ * : Set a custom link target for the menu item.
32
+ *
33
+ * [--classes=<classes>]
34
+ * : Set a custom link classes for the menu item.
35
+ *
36
+ * [--position=<position>]
37
+ * : Specify the position of this menu item.
38
+ *
39
+ * [--parent-id=<parent-id>]
40
+ * : Make this menu item a child of another menu item.
41
+ *
42
+ * ## EXAMPLES
43
+ *
44
+ * $ wp menu item add-tml-action sidebar-menu login
45
+ * Success: Menu item added.
46
+ */
47
+ WP_CLI::add_command( 'menu item add-tml-action', function( $args, $assoc_args ) {
48
+
49
+ list( $menu, $action ) = $args;
50
+
51
+ $menu = wp_get_nav_menu_object( $menu );
52
+ if ( ! $menu || is_wp_error( $menu ) ) {
53
+ WP_CLI::error( 'Invalid menu.' );
54
+ }
55
+ if ( ! $action = tml_get_action( $action ) ) {
56
+ WP_CLI::error( 'Invalid action.' );
57
+ }
58
+
59
+ $default_args = [
60
+ 'position' => 0,
61
+ 'title' => $action->get_title(),
62
+ 'description' => '',
63
+ 'parent-id' => 0,
64
+ 'attr-title' => '',
65
+ 'target' => '',
66
+ 'classes' => '',
67
+ 'xfn' => '',
68
+ 'status' => 'publish',
69
+ ];
70
+
71
+ $menu_item_args = [];
72
+ foreach ( $default_args as $key => $default_value ) {
73
+ $menu_item_args[ 'menu-item-' . $key ] = \WP_CLI\Utils\get_flag_value( $assoc_args, $key, $default_value );
74
+ }
75
+ $menu_item_args['menu-item-object-id'] = -1;
76
+ $menu_item_args['menu-item-object'] = $action->get_name();
77
+ $menu_item_args['menu-item-type'] = 'tml_action';
78
+ $menu_item_args['menu-item-url'] = $action->get_url();
79
+
80
+ $ret = wp_update_nav_menu_item( $menu->term_id, 0, $menu_item_args );
81
+ if ( is_wp_error( $ret ) ) {
82
+ WP_CLI::error( $ret->get_error_message() );
83
+ } elseif ( ! $ret ) {
84
+ WP_CLI::error( "Couldn't add menu item." );
85
+ } else {
86
+ if ( ! is_object_in_term( $ret, 'nav_menu', (int) $menu->term_id ) ) {
87
+ wp_set_object_terms( $ret, array( (int) $menu->term_id ), 'nav_menu' );
88
+ }
89
+ if ( ! empty( $assoc_args['porcelain'] ) ) {
90
+ WP_CLI::line( $ret );
91
+ } else {
92
+ WP_CLI::success( 'Menu item added.' );
93
+ }
94
+ }
95
+ });
includes/compat.php CHANGED
@@ -25,7 +25,7 @@ function tml_retrieve_password() {
25
  } elseif ( strpos( $_POST['user_login'], '@' ) ) {
26
  $user_data = get_user_by( 'email', trim( wp_unslash( $_POST['user_login'] ) ) );
27
  if ( empty( $user_data ) ) {
28
- $errors->add( 'invalid_email', __( '<strong>ERROR</strong>: There is no user registered with that email address.' ) );
29
  }
30
  } else {
31
  $login = trim( $_POST['user_login'] );
@@ -40,7 +40,7 @@ function tml_retrieve_password() {
40
  }
41
 
42
  if ( ! $user_data ) {
43
- $errors->add( 'invalidcombo', __( '<strong>ERROR</strong>: Invalid username or email.' ) );
44
  return $errors;
45
  }
46
 
25
  } elseif ( strpos( $_POST['user_login'], '@' ) ) {
26
  $user_data = get_user_by( 'email', trim( wp_unslash( $_POST['user_login'] ) ) );
27
  if ( empty( $user_data ) ) {
28
+ $errors->add( 'invalid_email', __( '<strong>ERROR</strong>: There is no account with that username or email address.' ) );
29
  }
30
  } else {
31
  $login = trim( $_POST['user_login'] );
40
  }
41
 
42
  if ( ! $user_data ) {
43
+ $errors->add( 'invalidcombo', __( '<strong>ERROR</strong>: There is no account with that username or email address.' ) );
44
  return $errors;
45
  }
46
 
includes/extensions.php CHANGED
@@ -109,11 +109,9 @@ function tml_add_extension_data_to_plugins_api( $result = false, $action = '', $
109
  return $result;
110
  }
111
 
112
- if ( $result = tml_extension_api_call( $extension->get_store_url(), array(
113
- 'license' => $extension->get_license_key(),
114
- 'item_id' => $extension->get_item_id(),
115
- 'slug' => $extension->get_name(),
116
- ) ) ) {
117
  if ( ! empty( $result->new_version ) ) {
118
  $result->version = $result->new_version;
119
  }
@@ -135,31 +133,29 @@ function tml_add_extension_data_to_plugins_transient( $transient = '' ) {
135
  $transient = (object) array();
136
  }
137
 
 
 
138
  foreach ( tml_get_extensions() as $extension ) {
139
- $response = tml_extension_api_call( $extension->get_store_url(), array(
140
- 'license' => $extension->get_license_key(),
141
- 'item_id' => $extension->get_item_id(),
142
- 'slug' => $extension->get_name(),
143
- ) );
144
 
145
- if ( is_object( $response ) ) {
146
- $basename = $extension->get_basename();
147
 
148
- if ( empty( $response->plugin ) ) {
149
- $response->plugin = $basename;
150
- }
151
-
152
- // This is a valid update
153
- if ( ! empty( $response->new_version ) && version_compare( $extension->get_version(), $response->new_version, '<' ) ) {
154
- $transient->response[ $basename ] = $response;
155
 
156
- // This is just fetching the plugin information
157
- } else {
158
- $transient->no_update[ $basename ] = $response;
159
- }
160
 
161
- $transient->last_checked = time();
 
 
162
  }
 
 
163
  }
164
 
165
  return $transient;
@@ -334,3 +330,33 @@ function tml_extension_api_call( $url, $args = array() ) {
334
 
335
  return $response;
336
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
  return $result;
110
  }
111
 
112
+ $extension_data = tml_get_extension_data();
113
+ if ( isset( $extension_data[ $extension->get_name() ] ) ) {
114
+ $result = $extension_data[ $extension->get_name() ];
 
 
115
  if ( ! empty( $result->new_version ) ) {
116
  $result->version = $result->new_version;
117
  }
133
  $transient = (object) array();
134
  }
135
 
136
+ $extension_data = tml_get_extension_data();
137
+
138
  foreach ( tml_get_extensions() as $extension ) {
139
+ if ( ! isset( $extension_data[ $extension->get_name() ] ) ) {
140
+ continue;
141
+ }
 
 
142
 
143
+ $data = $extension_data[ $extension->get_name() ];
 
144
 
145
+ if ( empty( $data->plugin ) ) {
146
+ $data->plugin = $extension->get_basename();
147
+ }
 
 
 
 
148
 
149
+ // This is a valid update
150
+ if ( ! empty( $data->new_version ) && version_compare( $extension->get_version(), $data->new_version, '<' ) ) {
151
+ $transient->response[ $data->plugin ] = $data;
 
152
 
153
+ // This is just fetching the plugin information
154
+ } else {
155
+ $transient->no_update[ $data->plugin ] = $data;
156
  }
157
+
158
+ $transient->last_checked = time();
159
  }
160
 
161
  return $transient;
330
 
331
  return $response;
332
  }
333
+
334
+ /**
335
+ * Get all extension data.
336
+ *
337
+ * @since 7.0.14
338
+ *
339
+ * @return array An array of objects containing extension data.
340
+ */
341
+ function tml_get_extension_data( $refresh = false ) {
342
+ $extension_data = get_site_transient( 'tml_extension_data' );
343
+ if ( ! is_array( $extension_data ) ) {
344
+ $extension_data = array();
345
+ }
346
+
347
+ if ( empty( $extension_data ) || $refresh ) {
348
+ foreach ( tml_get_extensions() as $extension ) {
349
+ $data = tml_extension_api_call( $extension->get_store_url(), array(
350
+ 'license' => $extension->get_license_key(),
351
+ 'item_id' => $extension->get_item_id(),
352
+ 'slug' => $extension->get_name(),
353
+ ) );
354
+ if ( $data ) {
355
+ $extension_data[ $extension->get_name() ] = $data;
356
+ }
357
+ }
358
+ set_site_transient( 'tml_extension_data', $extension_data, DAY_IN_SECONDS / 2 );
359
+ }
360
+
361
+ return $extension_data;
362
+ }
includes/hooks.php CHANGED
@@ -54,9 +54,11 @@ add_action( 'retrieved_password_key', 'tml_retrieve_password_notification', 10,
54
 
55
  // Activation
56
  add_action( 'tml_activate', 'tml_flush_rewrite_rules' );
 
57
 
58
  // Deactivation
59
  add_action( 'tml_deactivate', 'tml_flush_rewrite_rules' );
 
60
 
61
  /**
62
  * Add Filters
54
 
55
  // Activation
56
  add_action( 'tml_activate', 'tml_flush_rewrite_rules' );
57
+ add_action( 'tml_activate_extension', 'tml_get_extension_data' );
58
 
59
  // Deactivation
60
  add_action( 'tml_deactivate', 'tml_flush_rewrite_rules' );
61
+ add_action( 'tml_deactivate_extension', 'tml_get_extension_data' );
62
 
63
  /**
64
  * Add Filters
languages/theme-my-login.pot CHANGED
@@ -1,297 +1,380 @@
1
  # Copyright (C) 2019 Theme My Login
2
- # This file is distributed under the same license as the Theme My Login package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Theme My Login 7.0.13\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/theme-my-login\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2019-02-21T10:15:38-05:00\n"
13
- "PO-Revision-Date: 2019-02-21T10:15:38-05:00\n"
 
14
  "X-Domain: theme-my-login\n"
15
 
16
- #: includes/functions.php:511
17
- #: admin/functions.php:278
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  msgid "Theme My Login Actions"
19
  msgstr ""
20
 
21
- #: includes/functions.php:512
 
22
  msgid "Theme My Login Action"
23
  msgstr ""
24
 
25
- #: includes/functions.php:540
26
- #: includes/functions.php:567
27
- #: includes/functions.php:582
 
 
 
28
  msgid "TML Action"
29
  msgstr ""
30
 
31
- #: includes/functions.php:646
 
32
  msgid "<strong>ERROR</strong>: Please enter a password."
33
  msgstr ""
34
 
35
- #: includes/functions.php:649
 
36
  msgid "<strong>ERROR</strong>: Passwords may not contain the character \"\\\"."
37
  msgstr ""
38
 
39
- #: includes/functions.php:652
 
40
  msgid "<strong>ERROR</strong>: Please enter the same password in both password fields."
41
  msgstr ""
42
 
43
- #: includes/functions.php:669
 
44
  msgid "If you have already set your own password, you may disregard this email and use the password you have already set."
45
  msgstr ""
46
 
47
- #: includes/actions.php:68
 
48
  msgid "Your Data Request"
49
  msgstr ""
50
 
51
- #: includes/actions.php:451
 
52
  msgid "Registration complete. You may now log in."
53
  msgstr ""
54
 
55
- #. Plugin Name of the plugin
56
- #. Author of the plugin
57
- #: includes/class-theme-my-login-widget.php:23
58
- #: admin/functions.php:69
59
- msgid "Theme My Login"
60
- msgstr ""
61
-
62
- #: includes/class-theme-my-login-widget.php:25
63
  msgid "A login form for your site."
64
  msgstr ""
65
 
66
- #: includes/class-theme-my-login-widget.php:57
 
67
  msgctxt "Howdy"
68
  msgid "Welcome"
69
  msgstr ""
70
 
71
- #: includes/class-theme-my-login-widget.php:92
 
72
  msgid "Profile"
73
  msgstr ""
74
 
75
- #: includes/class-theme-my-login-widget.php:173
 
76
  msgid "Show action links?"
77
  msgstr ""
78
 
79
- #: includes/forms.php:133
 
80
  msgid "Confirm Password"
81
  msgstr ""
82
 
83
- #: includes/extensions.php:189
84
- #: includes/extensions.php:220
85
- #: includes/extensions.php:250
86
- #: includes/extensions.php:278
 
 
 
 
87
  msgid "An error occurred, please try again."
88
  msgstr ""
89
 
90
- #: includes/extensions.php:202
 
91
  msgid "Your license key has been disabled."
92
  msgstr ""
93
 
94
- #: includes/extensions.php:207
 
95
  msgid "Invalid license."
96
  msgstr ""
97
 
98
- #: includes/extensions.php:212
 
99
  msgid "Your license is not active for this URL."
100
  msgstr ""
101
 
102
- #: includes/extensions.php:216
 
103
  msgid "Your license key has reached its activation limit."
104
  msgstr ""
105
 
106
- #: admin/functions.php:68
107
- #: admin/functions.php:79
 
 
108
  msgid "Theme My Login Settings"
109
  msgstr ""
110
 
111
- #: admin/functions.php:80
 
112
  msgid "General"
113
  msgstr ""
114
 
115
- #: admin/functions.php:101
 
116
  msgid "Theme My Login Licenses"
117
  msgstr ""
118
 
119
- #: admin/functions.php:102
 
120
  msgid "Licenses"
121
  msgstr ""
122
 
123
- #: admin/functions.php:111
 
124
  msgid "Theme My Login Extensions"
125
  msgstr ""
126
 
127
- #: admin/functions.php:112
128
- #: admin/functions.php:356
 
 
129
  msgid "Extensions"
130
  msgstr ""
131
 
132
- #: admin/functions.php:163
 
133
  msgid "As a token of our gratitude, we would like to offer your an incentive for upgrading Theme My Login to version 7.0. For a limited time, we are offering a <strong>20% discount</strong> when you use the code <strong>SAVINGFACE</strong> at checkout. Act now - this offer won't last!"
134
  msgstr ""
135
 
136
- #: admin/functions.php:179
 
137
  msgid "A new <strong>Theme My Login</strong> extension is available!"
138
  msgstr ""
139
 
140
- #: admin/functions.php:186
141
- #: admin/extensions.php:95
 
 
142
  msgid "Get This Extension"
143
  msgstr ""
144
 
145
- #: admin/settings.php:96
 
146
  msgid "Registration"
147
  msgstr ""
148
 
149
- #: admin/settings.php:101
 
150
  msgid "Slugs"
151
  msgstr ""
152
 
153
- #: admin/settings.php:122
154
- #: admin/settings.php:127
 
 
155
  msgid "Login Type"
156
  msgstr ""
157
 
158
- #: admin/settings.php:129
159
- #: admin/settings.php:149
 
 
160
  msgid "Default"
161
  msgstr ""
162
 
163
- #: admin/settings.php:130
 
164
  msgid "Username only"
165
  msgstr ""
166
 
167
- #: admin/settings.php:131
168
- #: admin/settings.php:150
 
 
169
  msgid "Email only"
170
  msgstr ""
171
 
172
- #: admin/settings.php:142
173
- #: admin/settings.php:147
 
 
174
  msgid "Registration Type"
175
  msgstr ""
176
 
177
- #: admin/settings.php:157
 
178
  msgid "Passwords"
179
  msgstr ""
180
 
181
- #: admin/settings.php:162
 
182
  msgid "Allow users to set their own password"
183
  msgstr ""
184
 
185
- #: admin/settings.php:169
 
186
  msgid "Auto-Login"
187
  msgstr ""
188
 
189
- #: admin/settings.php:174
 
190
  msgid "Automatically log in users after registration"
191
  msgstr ""
192
 
193
- #: admin/settings.php:221
 
194
  msgid "The slugs defined here will be used to generate the URL to the corresponding action. You can see this URL below the slug field. If you would like to use pages for these actions, simply make sure the slug for the action below matches the slug of the page you would like to use for that action."
195
  msgstr ""
196
 
197
- #: admin/settings.php:420
 
198
  msgid "Active"
199
  msgstr ""
200
 
201
- #: admin/settings.php:424
 
202
  msgid "Invalid"
203
  msgstr ""
204
 
205
- #: admin/settings.php:427
 
206
  msgid "Inactive"
207
  msgstr ""
208
 
209
- #: admin/settings.php:442
 
210
  msgid "Deactivate"
211
  msgstr ""
212
 
213
- #: admin/settings.php:444
 
214
  msgid "Activate"
215
  msgstr ""
216
 
217
- #: admin/settings.php:555
 
218
  msgid "Welcome to Theme My Login!"
219
  msgstr ""
220
 
221
- #: admin/settings.php:556
 
222
  msgid "Below, you can configure how you would like users to register and log in to your site."
223
  msgstr ""
224
 
225
- #: admin/settings.php:557
 
226
  msgid "Additionally, you can change the slugs that are used to generate the URLs that represent specific actions."
227
  msgstr ""
228
 
229
- #: admin/settings.php:563
230
- #: admin/settings.php:586
231
- #: admin/settings.php:606
232
- #: admin/settings.php:634
 
 
 
 
233
  msgid "View Documentation"
234
  msgstr ""
235
 
236
- #: admin/settings.php:568
237
- #: admin/settings.php:590
238
- #: admin/settings.php:641
 
 
 
239
  msgid "Get Support"
240
  msgstr ""
241
 
242
- #: admin/settings.php:578
 
243
  msgid "When you purchase extensions for Theme My Login, you will enter your license keys on this page."
244
  msgstr ""
245
 
246
- #: admin/settings.php:579
 
247
  msgid "After you enter your license keys and click the Save Changes button at the bottom of the screen, you will see a new button next to each field with a license in it."
248
  msgstr ""
249
 
250
- #: admin/settings.php:580
 
251
  msgid "If you have not yet activated your license, this button will say \"Activate\". Click this button to activate your license."
252
  msgstr ""
253
 
254
- #: admin/settings.php:581
 
255
  msgid "If you have already activated your license, this button will say \"Deactivate\". Click this button to deactivate your license."
256
  msgstr ""
257
 
258
- #: admin/settings.php:600
 
259
  msgid "This page shows you all of the extensions available to purchase for Theme My Login."
260
  msgstr ""
261
 
262
- #: admin/settings.php:601
 
263
  msgid "Once you purchase an extension, you download it from your email receipt or your account page on our website. Then, you install it just like a normal WordPress plugin."
264
  msgstr ""
265
 
266
- #: admin/settings.php:610
 
267
  msgid "Go to the Extensions Store"
268
  msgstr ""
269
 
270
- #: admin/settings.php:614
 
271
  msgid "View your Theme My Login account"
272
  msgstr ""
273
 
274
- #: admin/settings.php:625
 
275
  msgid "On this page, you can configure the settings for the Theme My Login %s extension."
276
  msgstr ""
277
 
278
- #: admin/extensions.php:72
 
279
  msgid "Whoops! Looks like there was an error fetching extensions from the server. Please try again."
280
  msgstr ""
281
 
282
- #: admin/extensions.php:73
 
283
  msgid "Error: %s"
284
  msgstr ""
285
 
286
- #: admin/extensions.php:105
 
287
  msgid "View All Extensions"
288
  msgstr ""
289
-
290
- #. Plugin URI of the plugin
291
- #. Author URI of the plugin
292
- msgid "https://thememylogin.com"
293
- msgstr ""
294
-
295
- #. Description of the plugin
296
- msgid "Creates an alternate login, registration and password recovery experience within your theme."
297
- msgstr ""
1
  # Copyright (C) 2019 Theme My Login
2
+ # This file is distributed under the same license as the Theme My Login plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Theme My Login 7.0.14\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/theme-my-login\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2019-05-13T11:01:02-04:00\n"
13
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
+ "X-Generator: WP-CLI 2.2.0\n"
15
  "X-Domain: theme-my-login\n"
16
 
17
+ #. Plugin Name of the plugin
18
+ #. Author of the plugin
19
+ #: build/includes/class-theme-my-login-widget.php:23
20
+ #: build/admin/functions.php:69
21
+ #: src/includes/class-theme-my-login-widget.php:23
22
+ #: src/admin/functions.php:69
23
+ msgid "Theme My Login"
24
+ msgstr ""
25
+
26
+ #. Plugin URI of the plugin
27
+ #. Author URI of the plugin
28
+ msgid "https://thememylogin.com"
29
+ msgstr ""
30
+
31
+ #. Description of the plugin
32
+ msgid "Creates an alternate login, registration and password recovery experience within your theme."
33
+ msgstr ""
34
+
35
+ #: build/includes/functions.php:511
36
+ #: build/admin/functions.php:278
37
+ #: src/includes/functions.php:511
38
+ #: src/admin/functions.php:278
39
  msgid "Theme My Login Actions"
40
  msgstr ""
41
 
42
+ #: build/includes/functions.php:512
43
+ #: src/includes/functions.php:512
44
  msgid "Theme My Login Action"
45
  msgstr ""
46
 
47
+ #: build/includes/functions.php:540
48
+ #: build/includes/functions.php:567
49
+ #: build/includes/functions.php:582
50
+ #: src/includes/functions.php:540
51
+ #: src/includes/functions.php:567
52
+ #: src/includes/functions.php:582
53
  msgid "TML Action"
54
  msgstr ""
55
 
56
+ #: build/includes/functions.php:646
57
+ #: src/includes/functions.php:646
58
  msgid "<strong>ERROR</strong>: Please enter a password."
59
  msgstr ""
60
 
61
+ #: build/includes/functions.php:649
62
+ #: src/includes/functions.php:649
63
  msgid "<strong>ERROR</strong>: Passwords may not contain the character \"\\\"."
64
  msgstr ""
65
 
66
+ #: build/includes/functions.php:652
67
+ #: src/includes/functions.php:652
68
  msgid "<strong>ERROR</strong>: Please enter the same password in both password fields."
69
  msgstr ""
70
 
71
+ #: build/includes/functions.php:669
72
+ #: src/includes/functions.php:669
73
  msgid "If you have already set your own password, you may disregard this email and use the password you have already set."
74
  msgstr ""
75
 
76
+ #: build/includes/actions.php:68
77
+ #: src/includes/actions.php:68
78
  msgid "Your Data Request"
79
  msgstr ""
80
 
81
+ #: build/includes/actions.php:455
82
+ #: src/includes/actions.php:455
83
  msgid "Registration complete. You may now log in."
84
  msgstr ""
85
 
86
+ #: build/includes/class-theme-my-login-widget.php:25
87
+ #: src/includes/class-theme-my-login-widget.php:25
 
 
 
 
 
 
88
  msgid "A login form for your site."
89
  msgstr ""
90
 
91
+ #: build/includes/class-theme-my-login-widget.php:57
92
+ #: src/includes/class-theme-my-login-widget.php:57
93
  msgctxt "Howdy"
94
  msgid "Welcome"
95
  msgstr ""
96
 
97
+ #: build/includes/class-theme-my-login-widget.php:92
98
+ #: src/includes/class-theme-my-login-widget.php:92
99
  msgid "Profile"
100
  msgstr ""
101
 
102
+ #: build/includes/class-theme-my-login-widget.php:173
103
+ #: src/includes/class-theme-my-login-widget.php:173
104
  msgid "Show action links?"
105
  msgstr ""
106
 
107
+ #: build/includes/forms.php:133
108
+ #: src/includes/forms.php:133
109
  msgid "Confirm Password"
110
  msgstr ""
111
 
112
+ #: build/includes/extensions.php:185
113
+ #: build/includes/extensions.php:216
114
+ #: build/includes/extensions.php:246
115
+ #: build/includes/extensions.php:274
116
+ #: src/includes/extensions.php:185
117
+ #: src/includes/extensions.php:216
118
+ #: src/includes/extensions.php:246
119
+ #: src/includes/extensions.php:274
120
  msgid "An error occurred, please try again."
121
  msgstr ""
122
 
123
+ #: build/includes/extensions.php:198
124
+ #: src/includes/extensions.php:198
125
  msgid "Your license key has been disabled."
126
  msgstr ""
127
 
128
+ #: build/includes/extensions.php:203
129
+ #: src/includes/extensions.php:203
130
  msgid "Invalid license."
131
  msgstr ""
132
 
133
+ #: build/includes/extensions.php:208
134
+ #: src/includes/extensions.php:208
135
  msgid "Your license is not active for this URL."
136
  msgstr ""
137
 
138
+ #: build/includes/extensions.php:212
139
+ #: src/includes/extensions.php:212
140
  msgid "Your license key has reached its activation limit."
141
  msgstr ""
142
 
143
+ #: build/admin/functions.php:68
144
+ #: build/admin/functions.php:79
145
+ #: src/admin/functions.php:68
146
+ #: src/admin/functions.php:79
147
  msgid "Theme My Login Settings"
148
  msgstr ""
149
 
150
+ #: build/admin/functions.php:80
151
+ #: src/admin/functions.php:80
152
  msgid "General"
153
  msgstr ""
154
 
155
+ #: build/admin/functions.php:101
156
+ #: src/admin/functions.php:101
157
  msgid "Theme My Login Licenses"
158
  msgstr ""
159
 
160
+ #: build/admin/functions.php:102
161
+ #: src/admin/functions.php:102
162
  msgid "Licenses"
163
  msgstr ""
164
 
165
+ #: build/admin/functions.php:111
166
+ #: src/admin/functions.php:111
167
  msgid "Theme My Login Extensions"
168
  msgstr ""
169
 
170
+ #: build/admin/functions.php:112
171
+ #: build/admin/functions.php:356
172
+ #: src/admin/functions.php:112
173
+ #: src/admin/functions.php:356
174
  msgid "Extensions"
175
  msgstr ""
176
 
177
+ #: build/admin/functions.php:163
178
+ #: src/admin/functions.php:163
179
  msgid "As a token of our gratitude, we would like to offer your an incentive for upgrading Theme My Login to version 7.0. For a limited time, we are offering a <strong>20% discount</strong> when you use the code <strong>SAVINGFACE</strong> at checkout. Act now - this offer won't last!"
180
  msgstr ""
181
 
182
+ #: build/admin/functions.php:179
183
+ #: src/admin/functions.php:179
184
  msgid "A new <strong>Theme My Login</strong> extension is available!"
185
  msgstr ""
186
 
187
+ #: build/admin/functions.php:186
188
+ #: build/admin/extensions.php:95
189
+ #: src/admin/functions.php:186
190
+ #: src/admin/extensions.php:95
191
  msgid "Get This Extension"
192
  msgstr ""
193
 
194
+ #: build/admin/settings.php:96
195
+ #: src/admin/settings.php:96
196
  msgid "Registration"
197
  msgstr ""
198
 
199
+ #: build/admin/settings.php:101
200
+ #: src/admin/settings.php:101
201
  msgid "Slugs"
202
  msgstr ""
203
 
204
+ #: build/admin/settings.php:122
205
+ #: build/admin/settings.php:127
206
+ #: src/admin/settings.php:122
207
+ #: src/admin/settings.php:127
208
  msgid "Login Type"
209
  msgstr ""
210
 
211
+ #: build/admin/settings.php:129
212
+ #: build/admin/settings.php:149
213
+ #: src/admin/settings.php:129
214
+ #: src/admin/settings.php:149
215
  msgid "Default"
216
  msgstr ""
217
 
218
+ #: build/admin/settings.php:130
219
+ #: src/admin/settings.php:130
220
  msgid "Username only"
221
  msgstr ""
222
 
223
+ #: build/admin/settings.php:131
224
+ #: build/admin/settings.php:150
225
+ #: src/admin/settings.php:131
226
+ #: src/admin/settings.php:150
227
  msgid "Email only"
228
  msgstr ""
229
 
230
+ #: build/admin/settings.php:142
231
+ #: build/admin/settings.php:147
232
+ #: src/admin/settings.php:142
233
+ #: src/admin/settings.php:147
234
  msgid "Registration Type"
235
  msgstr ""
236
 
237
+ #: build/admin/settings.php:157
238
+ #: src/admin/settings.php:157
239
  msgid "Passwords"
240
  msgstr ""
241
 
242
+ #: build/admin/settings.php:162
243
+ #: src/admin/settings.php:162
244
  msgid "Allow users to set their own password"
245
  msgstr ""
246
 
247
+ #: build/admin/settings.php:169
248
+ #: src/admin/settings.php:169
249
  msgid "Auto-Login"
250
  msgstr ""
251
 
252
+ #: build/admin/settings.php:174
253
+ #: src/admin/settings.php:174
254
  msgid "Automatically log in users after registration"
255
  msgstr ""
256
 
257
+ #: build/admin/settings.php:221
258
+ #: src/admin/settings.php:221
259
  msgid "The slugs defined here will be used to generate the URL to the corresponding action. You can see this URL below the slug field. If you would like to use pages for these actions, simply make sure the slug for the action below matches the slug of the page you would like to use for that action."
260
  msgstr ""
261
 
262
+ #: build/admin/settings.php:420
263
+ #: src/admin/settings.php:420
264
  msgid "Active"
265
  msgstr ""
266
 
267
+ #: build/admin/settings.php:424
268
+ #: src/admin/settings.php:424
269
  msgid "Invalid"
270
  msgstr ""
271
 
272
+ #: build/admin/settings.php:427
273
+ #: src/admin/settings.php:427
274
  msgid "Inactive"
275
  msgstr ""
276
 
277
+ #: build/admin/settings.php:442
278
+ #: src/admin/settings.php:442
279
  msgid "Deactivate"
280
  msgstr ""
281
 
282
+ #: build/admin/settings.php:444
283
+ #: src/admin/settings.php:444
284
  msgid "Activate"
285
  msgstr ""
286
 
287
+ #: build/admin/settings.php:557
288
+ #: src/admin/settings.php:557
289
  msgid "Welcome to Theme My Login!"
290
  msgstr ""
291
 
292
+ #: build/admin/settings.php:558
293
+ #: src/admin/settings.php:558
294
  msgid "Below, you can configure how you would like users to register and log in to your site."
295
  msgstr ""
296
 
297
+ #: build/admin/settings.php:559
298
+ #: src/admin/settings.php:559
299
  msgid "Additionally, you can change the slugs that are used to generate the URLs that represent specific actions."
300
  msgstr ""
301
 
302
+ #: build/admin/settings.php:565
303
+ #: build/admin/settings.php:588
304
+ #: build/admin/settings.php:608
305
+ #: build/admin/settings.php:636
306
+ #: src/admin/settings.php:565
307
+ #: src/admin/settings.php:588
308
+ #: src/admin/settings.php:608
309
+ #: src/admin/settings.php:636
310
  msgid "View Documentation"
311
  msgstr ""
312
 
313
+ #: build/admin/settings.php:570
314
+ #: build/admin/settings.php:592
315
+ #: build/admin/settings.php:643
316
+ #: src/admin/settings.php:570
317
+ #: src/admin/settings.php:592
318
+ #: src/admin/settings.php:643
319
  msgid "Get Support"
320
  msgstr ""
321
 
322
+ #: build/admin/settings.php:580
323
+ #: src/admin/settings.php:580
324
  msgid "When you purchase extensions for Theme My Login, you will enter your license keys on this page."
325
  msgstr ""
326
 
327
+ #: build/admin/settings.php:581
328
+ #: src/admin/settings.php:581
329
  msgid "After you enter your license keys and click the Save Changes button at the bottom of the screen, you will see a new button next to each field with a license in it."
330
  msgstr ""
331
 
332
+ #: build/admin/settings.php:582
333
+ #: src/admin/settings.php:582
334
  msgid "If you have not yet activated your license, this button will say \"Activate\". Click this button to activate your license."
335
  msgstr ""
336
 
337
+ #: build/admin/settings.php:583
338
+ #: src/admin/settings.php:583
339
  msgid "If you have already activated your license, this button will say \"Deactivate\". Click this button to deactivate your license."
340
  msgstr ""
341
 
342
+ #: build/admin/settings.php:602
343
+ #: src/admin/settings.php:602
344
  msgid "This page shows you all of the extensions available to purchase for Theme My Login."
345
  msgstr ""
346
 
347
+ #: build/admin/settings.php:603
348
+ #: src/admin/settings.php:603
349
  msgid "Once you purchase an extension, you download it from your email receipt or your account page on our website. Then, you install it just like a normal WordPress plugin."
350
  msgstr ""
351
 
352
+ #: build/admin/settings.php:612
353
+ #: src/admin/settings.php:612
354
  msgid "Go to the Extensions Store"
355
  msgstr ""
356
 
357
+ #: build/admin/settings.php:616
358
+ #: src/admin/settings.php:616
359
  msgid "View your Theme My Login account"
360
  msgstr ""
361
 
362
+ #: build/admin/settings.php:627
363
+ #: src/admin/settings.php:627
364
  msgid "On this page, you can configure the settings for the Theme My Login %s extension."
365
  msgstr ""
366
 
367
+ #: build/admin/extensions.php:72
368
+ #: src/admin/extensions.php:72
369
  msgid "Whoops! Looks like there was an error fetching extensions from the server. Please try again."
370
  msgstr ""
371
 
372
+ #: build/admin/extensions.php:73
373
+ #: src/admin/extensions.php:73
374
  msgid "Error: %s"
375
  msgstr ""
376
 
377
+ #: build/admin/extensions.php:105
378
+ #: src/admin/extensions.php:105
379
  msgid "View All Extensions"
380
  msgstr ""
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: thememylogin, jfarthing84
3
  Tags: login, register, password, branding, customize, widget, wp-login, wp-login.php
4
  Requires at least: 4.6
5
- Tested up to: 5.1
6
- Stable tag: 7.0.13
7
 
8
  The ultimate login branding solution! Theme My Login offers matchless customization of your WordPress user experience!
9
 
@@ -59,6 +59,17 @@ Report bugs, suggest ideas and participate in development at [GitHub](https://gi
59
 
60
  == Changelog ==
61
 
 
 
 
 
 
 
 
 
 
 
 
62
  = 7.0.13 =
63
  * Ensure proper retrieval of request parameters in all server configuration scenarios
64
  * Ensure scripts and styles are loaded in the proper order on TML actions
2
  Contributors: thememylogin, jfarthing84
3
  Tags: login, register, password, branding, customize, widget, wp-login, wp-login.php
4
  Requires at least: 4.6
5
+ Tested up to: 5.2.1
6
+ Stable tag: 7.0.14
7
 
8
  The ultimate login branding solution! Theme My Login offers matchless customization of your WordPress user experience!
9
 
59
 
60
  == Changelog ==
61
 
62
+ = 7.0.14 =
63
+ * Fix login page error on on WP 5.2+
64
+ * Implement caching for remote extension data to speed up plugins screen
65
+ * Implement a CLI command for adding TML actions as nav menu items
66
+ * Ensure password recovery error messages match core
67
+ * Fix notice if a settings field isn't passed with an `args` parameter
68
+ * Fix permalinks being flushed on all TML admin pages
69
+ * Allow form attributes to be set in the form constructor
70
+ * Add `tml_activate_extension` action hook
71
+ * Add `tml_deactivate_extension` action hook
72
+
73
  = 7.0.13 =
74
  * Ensure proper retrieval of request parameters in all server configuration scenarios
75
  * Ensure scripts and styles are loaded in the proper order on TML actions
theme-my-login.php CHANGED
@@ -10,7 +10,7 @@
10
  Plugin Name: Theme My Login
11
  Plugin URI: https://thememylogin.com
12
  Description: Creates an alternate login, registration and password recovery experience within your theme.
13
- Version: 7.0.13
14
  Author: Theme My Login
15
  Author URI: https://thememylogin.com
16
  License: GPLv2
@@ -24,7 +24,7 @@ Network: true
24
  *
25
  * @since 7.0
26
  */
27
- define( 'THEME_MY_LOGIN_VERSION', '7.0.13' );
28
 
29
  /**
30
  * Stores the path to TML.
@@ -77,6 +77,10 @@ if ( is_multisite() ) {
77
  require THEME_MY_LOGIN_PATH . 'includes/ms-hooks.php';
78
  }
79
 
 
 
 
 
80
  /**
81
  * Load custom functions file.
82
  */
10
  Plugin Name: Theme My Login
11
  Plugin URI: https://thememylogin.com
12
  Description: Creates an alternate login, registration and password recovery experience within your theme.
13
+ Version: 7.0.14
14
  Author: Theme My Login
15
  Author URI: https://thememylogin.com
16
  License: GPLv2
24
  *
25
  * @since 7.0
26
  */
27
+ define( 'THEME_MY_LOGIN_VERSION', '7.0.14' );
28
 
29
  /**
30
  * Stores the path to TML.
77
  require THEME_MY_LOGIN_PATH . 'includes/ms-hooks.php';
78
  }
79
 
80
+ if ( defined( 'WP_CLI' ) && WP_CLI ) {
81
+ require THEME_MY_LOGIN_PATH . 'includes/commands.php';
82
+ }
83
+
84
  /**
85
  * Load custom functions file.
86
  */