-
Notifications
You must be signed in to change notification settings - Fork 1
/
role-map-edd-members.php
304 lines (237 loc) · 8.03 KB
/
role-map-edd-members.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
<?php
/**
* Plugin Name: Role Map - EDD Members
* Plugin URI: http://themehybrid.com
* Description: Maps user roles to EDD Members options. Note: Currently only supports variable pricing.
* Version: 1.0.0
* Author: Justin Tadlock
* Author URI: http://justintadlock.com
*/
// Validate the membership.
add_action( 'init', 'role_map_edd_validate_membership', 95 );
// Add EDD extension settings.
add_filter( 'edd_settings_extensions', 'role_map_edd_settings_extensions' );
// Set the user role on purchase completion.
add_action( 'edd_complete_purchase', 'role_map_edd_complete_purchase' );
// Custom role price options.
add_action( 'edd_download_price_table_head', 'role_map_edd_prices_header', 801 );
add_action( 'edd_download_price_table_row', 'role_map_edd_price_option_role', 801, 3 );
/**
* Gets an array of allowed membership roles.
*
* @todo - Make plugin option.
* @since 1.0.0
* @access public
* @return array
*/
function role_map_edd_get_membership_roles() {
$roles = edd_get_option( 'role_map_edd_roles', false );
return $roles ? array_keys( $roles ) : array( get_option( 'default_role' ) );
}
/**
* Gets an array of allowed membership role names.
*
* @since 1.0.0
* @access public
* @return array
*/
function role_map_edd_get_membership_role_names() {
global $wp_roles;
$names = array();
foreach ( role_map_edd_get_membership_roles() as $role ) {
if ( isset( $wp_roles->role_names[ $role ] ) )
$names[ $role ] = $wp_roles->role_names[ $role ];
}
return $names;
}
/**
* Validates the membership and changes the user's role to the default if their
* membership has expired.
*
* @since 1.0.0
* @access public
* @return void
*/
function role_map_edd_validate_membership() {
// Bail if user is not logged in.
if ( ! is_user_logged_in() )
return;
// Get the current user's ID.
$user_id = get_current_user_id();
// Bail if the user doesn't have a membership role or if the membership is valid.
if ( ! role_map_edd_user_has_membership_role( $user_id ) || edd_members_is_membership_valid( $user_id ) )
return;
// Get the user object.
$user = new WP_User( $user_id );
// Loop through the roles to remove.
foreach ( role_map_edd_get_membership_roles() as $r ) {
// If the user has the role, remove it.
if ( in_array( $r, (array) $user->roles ) )
$user->remove_role( $r );
}
// Get the default role.
$default_role = get_option( 'default_role' );
// Add the default role to the user.
if ( ! in_array( $default_role, (array) $user->roles ) )
$user->add_role( $default_role );
}
/**
* Checks if a user has one of the membership roles.
*
* @since 1.0.0
* @access public
* @param int $user_id
* @return bool
*/
function role_map_edd_user_has_membership_role( $user_id ) {
// Get the user object.
$user = new WP_User( $user_id );
// Loop through the roles to remove.
foreach ( role_map_edd_get_membership_roles() as $r ) {
if ( in_array( $r, (array) $user->roles ) )
return true;
}
return false;
}
/**
* Adds variable prices header.
*
* @since 1.0.0
* @access public
* @param int $download_id
* @return void
*/
function role_map_edd_prices_header( $download_id ) {
if ( 'bundle' == edd_get_download_type( $download_id ) )
return;
// Get membership length enabled for deciding when to show membership length
$edd_members_length_enabled = get_post_meta( $download_id, '_edd_members_length_enabled', true ) ? true : false;
$edd_members_display = $edd_members_length_enabled ? '' : ' style="display:none;"'; ?>
<th <?php echo $edd_members_display; ?> class="edd-members-toggled-hide"><?php esc_html_e( 'Role', 'role-map-edd-members' ); ?></th>
<?php }
/**
* Adds variable price role option.
*
* @since 1.0.0
* @access public
* @param int $download_id
* @param int $price_id
* @param array $args
* @return bool
*/
function role_map_edd_price_option_role( $download_id, $price_id, $args ) {
if ( 'bundle' == edd_get_download_type( $download_id ) )
return;
// Get price role value.
$role_map_edd_role = role_map_edd_get_price_option_role( $download_id, $price_id );
// Get membership length enabled for deciding when to show membership length option
$edd_members_length_enabled = get_post_meta( $download_id, '_edd_members_length_enabled', true ) ? true : false;
$edd_members_display = $edd_members_length_enabled ? '' : ' style="display:none;"'; ?>
<td <?php echo $edd_members_display; ?> class="edd-members-toggled-hide">
<select name="edd_variable_prices[<?php echo $price_id; ?>][role_map_edd_role]" id="edd_variable_prices[<?php echo $price_id; ?>][role_map_edd_role]">
<?php foreach ( role_map_edd_get_membership_role_names() as $role => $name ) : ?>
<option value="<?php echo esc_attr( $role ); ?>" <?php selected( $role, $role_map_edd_role ); ?>><?php echo esc_html( $name ); ?></option>
<?php endforeach; ?>
</select>
</td>
<?php }
/**
* Gets the role for the price option.
*
* @since 1.0.0
* @access public
* @param int $download_id
* @param int $price_id
* @return string|bool
*/
function role_map_edd_get_price_option_role( $download_id = 0, $price_id = null ) {
$prices = edd_get_variable_prices( $download_id );
if ( isset( $prices[ $price_id ][ 'role_map_edd_role' ] ) )
return esc_attr( $prices[ $price_id ][ 'role_map_edd_role' ] );
return false;
}
/**
* Callback on the `edd_complete_purchase` hook that updates the user's role based on purchase
*
* @since 1.0.0
* @access public
* @param int $payment_id
* @return bool
*/
function role_map_edd_complete_purchase( $payment_id = 0 ) {
// User info
$user_info = edd_get_payment_meta_user_info( $payment_id );
// User ID
$user_id = $user_info['id'];
// Cart details
$downloads = edd_get_payment_meta_cart_details( $payment_id );
// Bail if there are no downloads.
if ( ! is_array( $downloads ) )
return;
// Get user roles purchased.
$roles = array();
foreach ( $downloads as $download ) {
// Bypass downloads that are not memberships.
if ( ! get_post_meta( $download['id'], '_edd_members_length_enabled', true ) )
continue;
// Get price id.
$price_id = edd_get_cart_item_price_id( $download );
// Get the price option role.
$roles[] = role_map_edd_get_price_option_role( $download['id'], $price_id );
}
// If we have roles.
if ( $roles ) {
// Note: We're currently grabbing the first role. We need to add a check to
// get the highest priced role in case someone purchases multiple.
role_map_edd_set_user_role( $user_id, array_shift( $roles ) );
}
}
/**
* Sets the user membership role and removes other membership roles.
*
* @since 1.0.0
* @access public
* @param int $user_id
* @param string $role
* @return void
*/
function role_map_edd_set_user_role( $user_id, $role ) {
$allowed = role_map_edd_get_membership_role_names();
// If not an allowed role, bail.
if ( ! isset( $allowed[ $role ] ) )
return;
// Get the user object.
$user = new WP_User( $user_id );
// If the user doesn't have the new role, add it.
if ( ! in_array( $role, (array) $user->roles ) )
$user->add_role( $role );
// Loop through the membership roles.
foreach ( $allowed as $allowed_role => $name ) {
// If the user has another membership role other than the purchased role, remove it.
if ( $role !== $allowed_role && in_array( $allowed_role, (array) $user->roles ) )
$user->remove_role( $allowed_role );
}
}
/**
* Adds custom extension setting for EDD. The setting allows users to select the
* roles that can be mapped to EDD Members pricing options.
*
* @since 1.0.0
* @access public
* @param array $settings
* @global object $wp_roles
* @return array
*/
function role_map_edd_settings_extensions( $settings ) {
global $wp_roles;
$roles = $wp_roles->role_names;
asort( $roles );
$settings[] = array(
'id' => 'role_map_edd_roles',
'name' => esc_html__( 'Membership Roles', 'role-map-edd-members' ),
'desc' => esc_html__( 'Select which roles can be mapped to EDD Members pricing options.', 'role-map-edd-members' ),
'type' => 'multicheck',
'options' => $roles
);
return $settings;
}