WP-Members Membership Plugin - Version 3.4.4

Version Description

  • Adds excerpt to membership restricted content when excerpts are used and the user is logged in (should work the same as blocked content for a non-logged in user).
  • Adds excerpt to wpmem_product_restricted_args arguments to be edited or removed using the filter.
  • Adds [memberships] shortcode for admin notification email; this will include a list of memberships for the user in admin notification.
  • Fixes potential issue with [wpmem_field] shortcode if field does not have a defined type.
  • Updates to [wpmem_profile] and [wpmem_form password] for improved password reset.
  • Moves password reset link actions to template_redirect action. This should resolve issues that occur when multiple instances of the_content are run (i.e. the appearance of an invalid key message upon completing the password reset).
  • Moves export class to main user object (previously loaded from admin files). @todo Export class file also remains in admin for backward compatibility if file is called directly.
  • Moves admin object load (back) to "init" action (from "admin_init") as later load can cause problems with extensions loading on the "wpmem_after_admin_init" action.
  • Load dependencies after settings are loaded (allows for conditional loading of certain dependencies).
  • Load membership/product restriction only if membership products setting is active.
Download this release

Release Info

Developer cbutlerjr
Plugin Icon 128x128 WP-Members Membership Plugin
Version 3.4.4
Comparing to
See all releases

Code changes from version 3.4.4.2 to 3.4.4

includes/admin/class-wp-members-admin-api.php CHANGED
@@ -76,7 +76,9 @@ class WP_Members_Admin_API {
76
  $dialogs = $this->default_dialogs(); // Load default dialogs.
77
  }
78
 
79
- $wpmem->membership->admin = new WP_Members_Products_Admin();
 
 
80
  }
81
 
82
  /**
@@ -114,6 +116,9 @@ class WP_Members_Admin_API {
114
  }
115
  include_once( $wpmem->path . 'includes/admin/tabs/class-wp-members-fields-table.php' );
116
  }
 
 
 
117
  }
118
 
119
  /**
76
  $dialogs = $this->default_dialogs(); // Load default dialogs.
77
  }
78
 
79
+ if ( 1 == $wpmem->enable_products ) {
80
+ $wpmem->membership->admin = new WP_Members_Products_Admin();
81
+ }
82
  }
83
 
84
  /**
116
  }
117
  include_once( $wpmem->path . 'includes/admin/tabs/class-wp-members-fields-table.php' );
118
  }
119
+ if ( current_user_can( 'list_users' ) ) {
120
+ // include_once( $wpmem->path . 'includes/admin/class-wp-members-bulk-edit-users.php' );
121
+ }
122
  }
123
 
124
  /**
includes/admin/class-wp-members-bulk-edit-users.php ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Set process to update user accordingly.
4
+ *
5
+ * This function will run for each user being updated in the main
6
+ * framework script below. Breaking out the actual update process
7
+ * makes the framework more modular so it can be adapted to multiple
8
+ * use cases.
9
+ *
10
+ * For this use case, identify the actual meta keys used for the fields
11
+ * imported with the membership slug and expiration date. The default
12
+ * set up below is "membership" and "expires". The script will get
13
+ * the meta values for those fields and run wpmem_set_user_product().
14
+ * It will clean up for itself by deleting the meta values after it
15
+ * is done.
16
+ *
17
+ * Because of the clean up process (deleting the meta keys it has
18
+ * processed), if the script crashes from too many users, it can
19
+ * be run again and will not overwrite existing processed users.
20
+ */
21
+ function my_update_selected_user( $user_id ) {
22
+
23
+ // Set specific criteria.
24
+ $membership_key = "membership";
25
+ $expiration_key = "expires";
26
+
27
+ // Get the user's membership product info.
28
+ $membership = get_user_meta( $user_id, $membership_key, true );
29
+ $expiration = get_user_meta( $user_id, $expiration_key, true );
30
+
31
+ // Only process users who have not been processed already.
32
+ if ( $membership ) {
33
+
34
+ // Set expiration date - either "false" or MySQL timestamp.
35
+ if ( $expiration ) {
36
+ $date = ( 'none' == $expiration ) ? false : date( "Y-m-d H:i:s", strtotime( $expiration ) );
37
+ } else {
38
+ $date = false;
39
+ }
40
+
41
+ // Set user product access.
42
+ wpmem_set_user_product( $membership, $user_id, $date );
43
+
44
+ // Clean up after yourself.
45
+ delete_user_meta( $user_id, $membership_key );
46
+ delete_user_meta( $user_id, $expiration_key );
47
+
48
+ }
49
+ }
50
+
51
+ /**
52
+ * A drop-in code snippet to update all users' membership
53
+ * access and any applicable expiration date.
54
+ *
55
+ * To Use:
56
+ * 1. Save the code snippet to your theme's functions.php
57
+ * 2. Go to Tools > Update All Users.
58
+ * 3. Follow prompts on screen.
59
+ * 4. Remove the code snippet when completed.
60
+ */
61
+
62
+ class WP_Members_Bulk_Edit_Users {
63
+
64
+ public $settings = array(
65
+ 'enable_products' => "Membership",
66
+ 'mod_reg' => "Activation",
67
+ 'act_link' => "Confirmation",
68
+ );
69
+
70
+ function __construct() {
71
+ add_action( 'admin_menu', array( $this, 'admin_menu' ) );
72
+ }
73
+
74
+ function admin_menu() {
75
+ global $wpmem;
76
+ if ( 1 == $wpmem->act_link || 1 == $wpmem->mod_reg || 1 == $wpmem->enable_products ) {
77
+ $hook = add_users_page( 'WP-Members Bulk Edit Users', 'Bulk Edits', 'edit_users', 'wpmem-bulk-user-update', array( $this, 'admin_page' ) );
78
+ add_action( "load-$hook", array( $this, 'admin_page_load' ) );
79
+ }
80
+ }
81
+
82
+ function admin_page_load() {
83
+ global $update_all_complete;
84
+ $update_all_complete = false;
85
+
86
+ $utility_state = wpmem_get( 'wpmem_bulk_utility_state', false, 'request' );
87
+
88
+ if ( isset( $_GET['page'] ) && 'wpmem-bulk-user-update' == $_GET['page'] ) {
89
+
90
+ }
91
+
92
+ if ( isset( $_GET['page'] ) && 'update-all-users' == $_GET['page'] && isset( $_POST['update-all-confirm'] ) && 1 == $_POST['update-all-confirm'] ) {
93
+ $users = get_users( array( 'fields'=>'ID' ) );
94
+ // This is where we loop through users and update them.
95
+ foreach ( $users as $user_id ) {
96
+
97
+ // This is the custom process.
98
+ my_update_selected_user( $user_id );
99
+
100
+ }
101
+ $update_all_complete = true;
102
+ }
103
+ }
104
+
105
+ function admin_page() {
106
+ global $wpmem, $update_all_complete;
107
+
108
+ $utility_state = wpmem_get( 'wpmem_bulk_utility_state', false, 'request' );
109
+ $form_post = ( function_exists( 'wpmem_admin_form_post_url' ) ) ? wpmem_admin_form_post_url() : '';
110
+
111
+ echo '<div class="wrap">';
112
+ echo "<h2>" . __( 'WP-Members Bulk User Update', 'wp-members' ) . "</h2>";
113
+ echo '<form name="wpmem-bulk-update-all-users" id="wpmem-bulk-update-all-users" method="post" action="' . $form_post . '">';
114
+
115
+ switch ( $utility_state ) {
116
+
117
+ case false:
118
+
119
+ echo '<p>This utility allows you to run various bulk edits to all users.</p>';
120
+ echo '<p>Select the utility to run:</p>';
121
+ echo '<select name="wpmem_bulk_utility_state">
122
+ <option value="">Select option</option>';
123
+ foreach ( $this->settings as $setting => $label ) {
124
+ if ( 1 == $wpmem->{$setting} ) {
125
+ echo '<option value="start_' . strtolower( $label ) . '">' . $label . '</option>';
126
+ }
127
+ }
128
+ echo '</select>
129
+ <input type="submit" name="submit" value="Submit" />';
130
+ break;
131
+
132
+ case 'start_activation':
133
+ case 'start_confirmation':
134
+ echo '<p>';
135
+ echo ( 'start_activation' == $utility_state ) ? 'This process will set ALL users as activated.' : 'This process will set ALL users as confirmed.';
136
+ echo '</p>';
137
+ echo '<p><input name="wpmem_bulk_utility_state" type="checkbox" value="activation_confirm" /> ';
138
+ echo ( 'start_activation' == $utility_state ) ? 'Activate all users' : 'Confirm all users';
139
+ echo '</p>';
140
+ echo '<input type="submit" name="submit" value="Submit" />';
141
+ break;
142
+
143
+ case 'activation_confirm':
144
+ case 'confirmation_confirm':
145
+ echo '<p>';
146
+ echo ( 'start_activation' == $utility_state ) ? 'All users have been set as activated.' : 'All users have been set as confirmed.';
147
+ echo '</p>';
148
+ break;
149
+
150
+ case 'start_membership':
151
+ echo '<p>';
152
+ echo 'This will set all users to a valid membership based on imported values.';
153
+ echo '<p>';
154
+ break;
155
+
156
+ case 'membership_confirm':
157
+ echo '<p>';
158
+ echo 'All user memberships have been set.';
159
+ echo '</p>';
160
+ break;
161
+ }
162
+
163
+ if ( $update_all_complete ) {
164
+ echo '<p>All users were updated.<br />';
165
+ echo 'You may now remove this code snippet if desired.</p>';
166
+ } else {
167
+
168
+ }
169
+
170
+ echo '</form>';
171
+ echo '</div>';
172
+ }
173
+ }
174
+ // End of My_Update_All_Users_Class
includes/admin/class-wp-members-products-admin.php CHANGED
@@ -23,34 +23,33 @@ class WP_Members_Products_Admin {
23
  */
24
  function __construct() {
25
  global $wpmem;
26
- if ( 1 == $wpmem->enable_products ) {
27
- add_filter( 'manage_wpmem_product_posts_columns', array( $this, 'columns_heading' ) );
28
- add_action( 'manage_wpmem_product_posts_custom_column', array( $this, 'columns_content' ), 10, 2 );
29
- add_action( 'add_meta_boxes', array( $this, 'meta_boxes' ) );
30
- add_action( 'page_attributes_misc_attributes', array( $this, 'membership_attributes' ) );
31
- add_action( 'save_post', array( $this, 'save_details' ) );
32
- add_action( 'wpmem_admin_after_block_meta', array( $this, 'add_product_to_post' ), 10, 2 );
33
- add_action( 'wpmem_admin_block_meta_save', array( $this, 'save_product_to_post' ), 10, 3 );
34
- add_action( 'admin_footer', array( $this, 'enqueue_select2' ) );
35
- add_filter( 'manage_users_columns', array( $this, 'user_columns' ) );
36
- add_filter( 'manage_users_custom_column', array( $this, 'user_columns_content' ), 10, 3 );
37
- add_action( 'admin_head', array( $this, 'post_columns_width' ) );
38
- add_filter( 'manage_posts_columns', array( $this, 'post_columns' ) );
39
- add_action( 'manage_posts_custom_column', array( $this, 'post_columns_content' ), 10, 2 );
40
- add_filter( 'manage_pages_columns', array( $this, 'post_columns' ) );
41
- add_action( 'manage_pages_custom_column', array( $this, 'post_columns_content' ), 10, 2 );
42
- foreach( $wpmem->post_types as $key => $val ) {
43
- add_filter( 'manage_' . $key . '_posts_columns', array( $this, 'post_columns' ) );
44
- add_action( 'manage_' . $key . '_posts_custom_column', array( $this, 'post_columns_content' ), 10, 2 );
45
- }
46
-
47
- add_filter( 'wpmem_user_profile_tabs', array( $this, 'user_profile_tabs' ), 1 );
48
- add_action( 'wpmem_user_profile_tabs_content', array( $this, 'user_profile_tab_content' ), 10 );
49
-
50
- add_filter( 'wpmem_views_users', array( $this, 'user_views' ), 10, 2 );
51
- add_filter( 'wpmem_query_where', array( $this, 'query_where' ), 10, 2 );
52
  }
53
 
 
 
 
 
 
 
54
  $this->default_products = $wpmem->membership->get_default_products();
55
  }
56
 
23
  */
24
  function __construct() {
25
  global $wpmem;
26
+
27
+ add_filter( 'manage_wpmem_product_posts_columns', array( $this, 'columns_heading' ) );
28
+ add_action( 'manage_wpmem_product_posts_custom_column', array( $this, 'columns_content' ), 10, 2 );
29
+ add_action( 'add_meta_boxes', array( $this, 'meta_boxes' ) );
30
+ add_action( 'page_attributes_misc_attributes', array( $this, 'membership_attributes' ) );
31
+ add_action( 'save_post', array( $this, 'save_details' ) );
32
+ add_action( 'wpmem_admin_after_block_meta', array( $this, 'add_product_to_post' ), 10, 2 );
33
+ add_action( 'wpmem_admin_block_meta_save', array( $this, 'save_product_to_post' ), 10, 3 );
34
+ add_action( 'admin_footer', array( $this, 'enqueue_select2' ) );
35
+ add_filter( 'manage_users_columns', array( $this, 'user_columns' ) );
36
+ add_filter( 'manage_users_custom_column', array( $this, 'user_columns_content' ), 10, 3 );
37
+ add_action( 'admin_head', array( $this, 'post_columns_width' ) );
38
+ add_filter( 'manage_posts_columns', array( $this, 'post_columns' ) );
39
+ add_action( 'manage_posts_custom_column', array( $this, 'post_columns_content' ), 10, 2 );
40
+ add_filter( 'manage_pages_columns', array( $this, 'post_columns' ) );
41
+ add_action( 'manage_pages_custom_column', array( $this, 'post_columns_content' ), 10, 2 );
42
+ foreach( $wpmem->post_types as $key => $val ) {
43
+ add_filter( 'manage_' . $key . '_posts_columns', array( $this, 'post_columns' ) );
44
+ add_action( 'manage_' . $key . '_posts_custom_column', array( $this, 'post_columns_content' ), 10, 2 );
 
 
 
 
 
 
 
45
  }
46
 
47
+ add_filter( 'wpmem_user_profile_tabs', array( $this, 'user_profile_tabs' ), 1 );
48
+ add_action( 'wpmem_user_profile_tabs_content', array( $this, 'user_profile_tab_content' ), 10 );
49
+
50
+ add_filter( 'wpmem_views_users', array( $this, 'user_views' ), 10, 2 );
51
+ add_filter( 'wpmem_query_where', array( $this, 'query_where' ), 10, 2 );
52
+
53
  $this->default_products = $wpmem->membership->get_default_products();
54
  }
55
 
includes/class-wp-members.php CHANGED
@@ -398,11 +398,14 @@ class WP_Members {
398
  $this->forms = new WP_Members_Forms; // Load forms.
399
  $this->api = new WP_Members_API; // Load api.
400
  $this->shortcodes = new WP_Members_Shortcodes(); // Load shortcodes.
401
- $this->membership = new WP_Members_Products(); // Load membership plans
402
  $this->email = new WP_Members_Email; // Load email functions
403
  $this->user = new WP_Members_User( $this ); // Load user functions.
404
  $this->menus = new WP_Members_Menus();
405
  $this->dialogs = new WP_Members_Dialogs();
 
 
 
 
406
  if ( $this->clone_menus ) {
407
  $this->menus_clone = new WP_Members_Clone_Menus(); // Load clone menus.
408
  }
@@ -466,7 +469,6 @@ class WP_Members {
466
  // Add actions.
467
 
468
  add_action( 'init', array( $this, 'load_textdomain' ) );
469
- add_action( 'init', array( $this->membership, 'add_cpt' ), 0 ); // Adds membership plans custom post type.
470
  add_action( 'widgets_init', array( $this, 'widget_init' ) ); // initializes the widget
471
  add_action( 'rest_api_init', array( $this, 'rest_init' ) );
472
  add_action( 'pre_get_posts', array( $this, 'do_hide_posts' ), 20 );
@@ -478,7 +480,7 @@ class WP_Members {
478
  add_action( 'wp_footer', array( $this, 'invisible_captcha' ) );
479
 
480
  if ( is_admin() ) {
481
- add_action( 'init', array( $this, 'load_admin' ) ); // @todo Check user role to load correct dashboard
482
  }
483
 
484
  if ( is_user_logged_in() ) {
@@ -525,6 +527,11 @@ class WP_Members {
525
  add_filter( 'get_next_post_where', array( $this, 'filter_get_adjacent_post_where' ) );
526
  add_filter( 'allow_password_reset', array( $this->user, 'no_reset' ) ); // no password reset for non-activated users
527
 
 
 
 
 
 
528
  // If registration is moderated, check for activation (blocks backend login by non-activated users).
529
  if ( 1 == $this->mod_reg ) {
530
  add_filter( 'authenticate', array( $this->user, 'check_activated' ), 99, 3 );
@@ -641,7 +648,6 @@ class WP_Members {
641
  require_once( $this->path . 'includes/class-wp-members-email.php' );
642
  require_once( $this->path . 'includes/class-wp-members-forms.php' );
643
  require_once( $this->path . 'includes/class-wp-members-menus.php' );
644
- require_once( $this->path . 'includes/class-wp-members-products.php' );
645
  require_once( $this->path . 'includes/class-wp-members-pwd-reset.php' );
646
  require_once( $this->path . 'includes/class-wp-members-shortcodes.php' );
647
  require_once( $this->path . 'includes/class-wp-members-user.php' );
@@ -651,10 +657,14 @@ class WP_Members {
651
  require_once( $this->path . 'includes/api/api.php' );
652
  require_once( $this->path . 'includes/api/api-email.php' );
653
  require_once( $this->path . 'includes/api/api-forms.php' );
654
- require_once( $this->path . 'includes/api/api-products.php' );
655
  require_once( $this->path . 'includes/api/api-users.php' );
656
  require_once( $this->path . 'includes/api/api-utilities.php' );
657
 
 
 
 
 
 
658
  if ( defined( 'WP_CLI' ) && WP_CLI ) {
659
  require_once( $this->path . 'includes/cli/class-wp-members-cli.php' );
660
  require_once( $this->path . 'includes/cli/class-wp-members-cli-user.php' );
398
  $this->forms = new WP_Members_Forms; // Load forms.
399
  $this->api = new WP_Members_API; // Load api.
400
  $this->shortcodes = new WP_Members_Shortcodes(); // Load shortcodes.
 
401
  $this->email = new WP_Members_Email; // Load email functions
402
  $this->user = new WP_Members_User( $this ); // Load user functions.
403
  $this->menus = new WP_Members_Menus();
404
  $this->dialogs = new WP_Members_Dialogs();
405
+
406
+ if ( 1 == $this->enable_products ) {
407
+ $this->membership = new WP_Members_Products(); // Load membership plans
408
+ }
409
  if ( $this->clone_menus ) {
410
  $this->menus_clone = new WP_Members_Clone_Menus(); // Load clone menus.
411
  }
469
  // Add actions.
470
 
471
  add_action( 'init', array( $this, 'load_textdomain' ) );
 
472
  add_action( 'widgets_init', array( $this, 'widget_init' ) ); // initializes the widget
473
  add_action( 'rest_api_init', array( $this, 'rest_init' ) );
474
  add_action( 'pre_get_posts', array( $this, 'do_hide_posts' ), 20 );
480
  add_action( 'wp_footer', array( $this, 'invisible_captcha' ) );
481
 
482
  if ( is_admin() ) {
483
+ add_action( 'init', array( $this, 'load_admin' ) ); // @todo Check user role to load correct dashboard
484
  }
485
 
486
  if ( is_user_logged_in() ) {
527
  add_filter( 'get_next_post_where', array( $this, 'filter_get_adjacent_post_where' ) );
528
  add_filter( 'allow_password_reset', array( $this->user, 'no_reset' ) ); // no password reset for non-activated users
529
 
530
+ // If memberships are enabled.
531
+ if ( 1 == $this->enable_products ) {
532
+ add_action( 'init', array( $this->membership, 'add_cpt' ), 0 ); // Adds membership plans custom post type.
533
+ }
534
+
535
  // If registration is moderated, check for activation (blocks backend login by non-activated users).
536
  if ( 1 == $this->mod_reg ) {
537
  add_filter( 'authenticate', array( $this->user, 'check_activated' ), 99, 3 );
648
  require_once( $this->path . 'includes/class-wp-members-email.php' );
649
  require_once( $this->path . 'includes/class-wp-members-forms.php' );
650
  require_once( $this->path . 'includes/class-wp-members-menus.php' );
 
651
  require_once( $this->path . 'includes/class-wp-members-pwd-reset.php' );
652
  require_once( $this->path . 'includes/class-wp-members-shortcodes.php' );
653
  require_once( $this->path . 'includes/class-wp-members-user.php' );
657
  require_once( $this->path . 'includes/api/api.php' );
658
  require_once( $this->path . 'includes/api/api-email.php' );
659
  require_once( $this->path . 'includes/api/api-forms.php' );
 
660
  require_once( $this->path . 'includes/api/api-users.php' );
661
  require_once( $this->path . 'includes/api/api-utilities.php' );
662
 
663
+ if ( 1 == $this->enable_products ) {
664
+ require_once( $this->path . 'includes/class-wp-members-products.php' );
665
+ require_once( $this->path . 'includes/api/api-products.php' );
666
+ }
667
+
668
  if ( defined( 'WP_CLI' ) && WP_CLI ) {
669
  require_once( $this->path . 'includes/cli/class-wp-members-cli.php' );
670
  require_once( $this->path . 'includes/cli/class-wp-members-cli-user.php' );
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: cbutlerjr
3
  Tags: access, authentication, content, login, member, membership, password, protect, register, registration, restriction, subscriber
4
  Requires at least: 4.0
5
  Tested up to: 6.0
6
- Stable tag: 3.4.4.2
7
 
8
  License: GPLv3
9
 
@@ -108,7 +108,7 @@ The FAQs are maintained at https://rocketgeek.com/plugins/wp-members/docs/faqs/
108
 
109
  == Upgrade Notice ==
110
 
111
- WP-Members 3.4.4 is a minor update. 3.4.4.2 is a compatibility release for users of WP-Members Advanced Options. Backup prior to upgrading is recommended, but rollback is possible. See changelog for a list of updates. Minimum WP version is 4.0.
112
 
113
 
114
  == Screenshots ==
@@ -136,14 +136,6 @@ WP-Members 3.4.4 is a minor update. 3.4.4.2 is a compatibility release for users
136
 
137
  * @todo WP-Members pluggable deprecated for use in theme functions.php (wpmem will be initialized when plugins are loaded). If you have any WP-Members pluggable functions that load in the theme functions.php, you'll need to move these to another location, such as a custom plugin file. Keep in mind, pluggable functions are no longer the preferred way of customizing (and have not been for many years) as most customizations, if not all, can be handled by using the plugin's filter and action hooks.
138
 
139
- = 3.4.4.2 =
140
-
141
- * Fixes an issue in the 3.4.4.1 release that calls an undefined function (wpmem_admin_options()).
142
-
143
- = 3.4.4.1 =
144
-
145
- * 3.4.4 is not compatible with WP-Members Advanced Options when redirect to login is used. This version corrects that issue by rolling back the change to only load membership restriction functions when the membership products setting is enabled. Users with WP-Members Advanced Options should update to 3.4.4.1.
146
-
147
  = 3.4.4 =
148
 
149
  * Adds excerpt to membership restricted content when excerpts are used and the user is logged in (should work the same as blocked content for a non-logged in user).
3
  Tags: access, authentication, content, login, member, membership, password, protect, register, registration, restriction, subscriber
4
  Requires at least: 4.0
5
  Tested up to: 6.0
6
+ Stable tag: 3.4.4
7
 
8
  License: GPLv3
9
 
108
 
109
  == Upgrade Notice ==
110
 
111
+ WP-Members 3.4.4 is a minor update. Backup prior to upgrading is recommended, but rollback is possible. See changelog for a list of updates. Minimum WP version is 4.0.
112
 
113
 
114
  == Screenshots ==
136
 
137
  * @todo WP-Members pluggable deprecated for use in theme functions.php (wpmem will be initialized when plugins are loaded). If you have any WP-Members pluggable functions that load in the theme functions.php, you'll need to move these to another location, such as a custom plugin file. Keep in mind, pluggable functions are no longer the preferred way of customizing (and have not been for many years) as most customizations, if not all, can be handled by using the plugin's filter and action hooks.
138
 
 
 
 
 
 
 
 
 
139
  = 3.4.4 =
140
 
141
  * Adds excerpt to membership restricted content when excerpts are used and the user is logged in (should work the same as blocked content for a non-logged in user).
wp-members.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: WP-Members
4
  Plugin URI: https://rocketgeek.com
5
  Description: WP access restriction and user registration. For more information on plugin features, refer to <a href="https://rocketgeek.com/plugins/wp-members/docs/">the online Users Guide</a>. A <a href="https://rocketgeek.com/plugins/wp-members/quick-start-guide/">Quick Start Guide</a> is also available. WP-Members(tm) is a trademark of butlerblog.com.
6
- Version: 3.4.4.2
7
  Author: Chad Butler
8
  Author URI: https://butlerblog.com/
9
  Text Domain: wp-members
@@ -58,7 +58,7 @@ if ( ! defined( 'ABSPATH' ) ) {
58
  }
59
 
60
  // Initialize constants.
61
- define( 'WPMEM_VERSION', '3.4.4.1' );
62
  define( 'WPMEM_DB_VERSION', '2.3.0' );
63
  define( 'WPMEM_PATH', plugin_dir_path( __FILE__ ) );
64
 
3
  Plugin Name: WP-Members
4
  Plugin URI: https://rocketgeek.com
5
  Description: WP access restriction and user registration. For more information on plugin features, refer to <a href="https://rocketgeek.com/plugins/wp-members/docs/">the online Users Guide</a>. A <a href="https://rocketgeek.com/plugins/wp-members/quick-start-guide/">Quick Start Guide</a> is also available. WP-Members(tm) is a trademark of butlerblog.com.
6
+ Version: 3.4.4
7
  Author: Chad Butler
8
  Author URI: https://butlerblog.com/
9
  Text Domain: wp-members
58
  }
59
 
60
  // Initialize constants.
61
+ define( 'WPMEM_VERSION', '3.4.4' );
62
  define( 'WPMEM_DB_VERSION', '2.3.0' );
63
  define( 'WPMEM_PATH', plugin_dir_path( __FILE__ ) );
64