PluginProbe
WP-Members Membership Plugin / trunk
WP-Members Membership Plugin vtrunk
trunk 3.3.9 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.4.4.2 3.4.5 3.4.6 3.4.7 3.4.8 3.4.9 3.4.9.1 3.4.9.2 3.4.9.3 3.4.9.4 3.4.9.5 3.4.9.6 3.4.9.7 3.5.0 3.5.1 3.5.2 3.5.3 3.5.4 All 34 releases
wp-members / includes / api / api-products.php

api-products.php in WP-Members Membership Plugin trunk, at includes/api/api-products.php

492 lines 15.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * WP-Members API Functions
4 *
5 * This file is part of the WP-Members plugin by Chad Butler
6 * You can find out more about this plugin at https://rocketgeek.com
7 * Copyright (c) 2006-2026 Chad Butler
8 * WP-Members(tm) is a trademark of butlerblog.com
9 *
10 * @package WP-Members
11 * @subpackage WP-Members API Functions
12 * @author Chad Butler
13 * @copyright 2006-2026
14 */
15
16 /**
17 * Gets all posts by product key.
18 *
19 * @since Unknown
20 * @since 3.4.5 Alias of wpmem_get_membership_post_list().
21 * @deprecated 3.5.0 Use wpmem_get_membership_post_list() instead.
22 *
23 * @global stdClass $wpmem
24 * @param string $product_key
25 * @return array
26 */
27 function wpmem_get_product_post_list( $product_key ) {
28 return wpmem_get_membership_post_list( $product_key );
29 }
30
31 /**
32 * Gets all posts by membership key.
33 *
34 * @since 3.4.5
35 *
36 * @global stdClass $wpmem
37 * @param string $membership_key
38 * @param string $order_by title|date
39 * @param string $order asc|desc
40 * @return array|boolean $post_ids if not empty, otherwise false
41 */
42 function wpmem_get_membership_post_list( $membership_key, $order_by = false, $order = 'ASC' ) {
43 global $wpmem;
44 return $wpmem->membership->get_all_posts( $membership_key, $order_by, $order );
45 }
46
47 /**
48 * Gets the membership products for a given post.
49 *
50 * @since 3.3.7
51 * @since 3.4.5 Alias of wpmem_get_post_memberships().
52 * @deprecated 3.5.0 Use wpmem_get_post_memberships() instead.
53 *
54 * @global stdClass $wpmem
55 * @param integer $post_id
56 * @return array
57 */
58 function wpmem_get_post_products( $post_id ) {
59 return wpmem_get_post_memberships( $post_id );
60 }
61
62 /**
63 * Gets the membership products for a given post.
64 *
65 * @since 3.4.5
66 *
67 * @global stdClass $wpmem
68 * @param integer $post_id
69 * @return array
70 */
71 function wpmem_get_post_memberships( $post_id ) {
72 global $wpmem;
73 return $wpmem->membership->get_post_products( $post_id );
74 }
75
76 /**
77 * Gets access message if user does not have required membership.
78 *
79 * @since 3.4.0
80 *
81 * @global stdClass $wpmem
82 * @param array $post_products
83 * @return string $message
84 */
85 function wpmem_get_access_message( $post_products ) {
86 global $wpmem;
87 return $wpmem->membership->get_access_message( $post_products );
88 }
89
90 /**
91 * Gets all memberships for the site.
92 * Alias of wpmem_get_memberships().
93 *
94 * @since Unknown
95 * @deprecated 3.5.0 Use wpmem_get_memberships() instead.
96 *
97 * @return array
98 */
99 function wpmem_get_products() {
100 return wpmem_get_memberships();
101 }
102
103 /**
104 * Gets all memberships for the site.
105 *
106 * @since Unknown
107 *
108 * @return array
109 */
110 function wpmem_get_memberships() {
111 global $wpmem;
112 return ( ! empty( $wpmem->membership->memberships ) ) ? $wpmem->membership->memberships : array();
113 }
114
115 /**
116 * Get array of memberships keyed by ID.
117 *
118 * @since Unknown
119 *
120 * return array
121 */
122 function wpmem_get_memberships_ids() {
123 global $wpmem;
124 return array_flip( $wpmem->membership->membership_by_id );
125 }
126
127 /**
128 * Get membership id by slug.
129 *
130 * @since 3.4.7
131 * @todo Fix for child memberships
132 * @param string $membership_slug
133 * @return int $ID
134 */
135 function wpmem_get_membership_id( $membership_slug ) {
136 $membership = get_page_by_path( $membership_slug, OBJECT, 'wpmem_product' );
137 return ( $membership ) ? $membership->ID: false;
138 }
139
140 /**
141 * Get membership display title by slug.
142 *
143 * @since 3.4.5
144 *
145 * @param string $membership_slug
146 * @return string Value of $wpmem->membership->memberships[ $membership_slug ]['title'] if set, otherwise, $membership_slug.
147 */
148 function wpmem_get_membership_name( $membership_slug ) {
149 global $wpmem;
150 return ( isset( $wpmem->membership->memberships[ $membership_slug ]['title'] ) ) ? $wpmem->membership->memberships[ $membership_slug ]['title'] : $membership_slug;
151 }
152
153 /**
154 * Get the membership name (slug) by membership ID.
155 *
156 * @since 3.4.7
157 *
158 * @param int $membership_id The membership ID
159 * @return string The membership name/slug
160 */
161 function wpmem_get_membership_slug( $membership_id ) {
162 return get_post_field( 'post_name', $membership_id );
163 }
164
165 /**
166 * Get the role required by a membership (if any).
167 *
168 * @since 3.5.0
169 * @since 3.5.5 Return false if no role.
170 *
171 * @param string $slug The membership slug (meta key).
172 */
173 function wpmem_get_membership_role( $membership_slug ) {
174 global $wpmem;
175 return ( isset( $wpmem->membership->memberships[ $membership_slug ]['role'] ) ) ? $wpmem->membership->memberships[ $membership_slug ]['role'] : false;
176 }
177
178 /**
179 * Get meta key for membership (with stem).
180 *
181 * @since 3.4.5
182 *
183 * @param string $membership_slug
184 * @return string
185 */
186 function wpmem_get_membership_meta( $membership_slug ) {
187 global $wpmem;
188 return $wpmem->membership->post_stem . $membership_slug;
189 }
190
191 /**
192 * Adds a membership to a post.
193 *
194 * @since 3.4.6
195 * @since 3.4.7 Added $action param
196 *
197 * @param string $membership_meta
198 * @param int $post_id
199 * @param string $action Action to run (add|remove default:add)
200 */
201 function wpmem_add_membership_to_post( $membership_meta, $post_id, $action = 'add' ) {
202
203 global $wpmem;
204
205 // Get existing post meta.
206 $post_memberships = get_post_meta( $post_id, $wpmem->membership->post_meta, true );
207
208 if ( 'remove' == $action ) {
209 // If we are removing, remove the meta key from the array.
210 if ( is_array( $post_memberships ) ) {
211 if ( ( $key = array_search( $membership_meta, $post_memberships ) ) !== false ) {
212 unset( $post_memberships[ $key ] );
213 }
214 }
215 } else {
216 // If the post has membership restrictions already, add new membership requirement.
217 if ( is_array( $post_memberships ) ) {
218 if ( ! in_array( $membership_meta, $post_memberships ) ) {
219 $post_memberships[] = $membership_meta;
220 }
221 } else {
222 $post_memberships = array( $membership_meta );
223 }
224 }
225
226 // Update post meta with restriction info.
227 update_post_meta( $post_id, $wpmem->membership->post_meta, $post_memberships );
228
229 if ( 'remove' == $action ) {
230 delete_post_meta( $post_id, wpmem_get_membership_meta( $membership_meta ) );
231 } else {
232 update_post_meta( $post_id, wpmem_get_membership_meta( $membership_meta ), 1 );
233 }
234 }
235
236 /**
237 * Removes a membership from a post.
238 *
239 * @since 3.4.7
240 *
241 * @param string $membership_meta
242 * @param int $post_id
243 */
244 function wpmem_remove_membership_from_post( $membership_meta, $post_id ) {
245 wpmem_add_membership_to_post( $membership_meta, $post_id, 'remove' );
246 }
247
248 /**
249 * Adds a membership to an array of post IDs.
250 *
251 * @since 3.4.6
252 * @since 3.4.7 Added $action param
253 *
254 * @param string $membership_meta
255 * @param string|array $post_ids
256 * @param string $action Action to run (add|remove default:add)
257 */
258 function wpmem_add_membership_to_posts( $membership_meta, $post_ids, $action = 'add' ) {
259 // Make sure $post_ids is an array (prepare comma separated values)
260 $posts_array = ( ! is_array( $post_ids ) ) ? explode( ",", $post_ids ) : $post_ids;
261
262 if ( 'remove' == $action ) {
263 // Run wpmem_remove_membership_from_post() for each ID.
264 foreach ( $posts_array as $ID ) {
265 wpmem_remove_membership_from_post( $membership_meta, $ID );
266 }
267 } else {
268 // Run wpmem_add_membership_to_post() for each ID.
269 foreach ( $posts_array as $ID ) {
270 wpmem_add_membership_to_post( $membership_meta, $ID );
271 }
272 }
273 }
274
275 /**
276 * Removes a membership from an array of post IDs.
277 *
278 * @since 3.4.7
279 *
280 * @param string $membership_meta
281 * @param string|array $post_ids
282 */
283 function wpmem_remove_membership_from_posts( $membership_meta, $post_ids ) {
284 wpmem_add_membership_to_posts( $membership_meta, $post_ids, 'remove' );
285 }
286
287 /**
288 * Create a membership.
289 *
290 * @since 3.4.6
291 *
292 * @param array $args {
293 * Parameters for creating the membership CPT.
294 *
295 * @type string $title User readable name of membership.
296 * @type string $name Sanitized title of the membership to be used as the meta key.
297 * @type string $status Published status: publish|draft (default: publish)
298 * @type int $author User ID of membership author, Optional, defaults to site admin.
299 * @type array $meta_input
300 * Meta fields for membership CPT (not all are required).
301 *
302 * @type string $name The sanitized title of the membership.
303 * @type string $default
304 * @type string $role Roles if a role is required.
305 * @type string $expires Expiration period if used (num|per).
306 * @type int $no_gap If renewal is "no gap" renewal.
307 * @type string $fixed_period (start|end|grace_num|grace_per)
308 * @type int $set_default_{$key}
309 * @type string $message Custom message for restriction.
310 * @type int $child_access If membership hierarchy is used.
311 * }
312 * }
313 * @return mixed $post_id|WP_Error
314 */
315 function wpmem_create_membership( $args ) {
316
317 // Get the admin user for default post_author.
318 $admin_email = get_option( 'admin_email' );
319 $admin_user = get_user_by( 'email', $admin_email );
320
321 // Set up post args.
322 $pre_postarr = array();
323 foreach ( $args as $key => $value ) {
324 if ( 'meta_input' == $key ) {
325 foreach( $value as $meta_key => $meta_value ) {
326 $pre_postarr['meta_input'][ 'wpmem_product_' . $meta_key ] = $meta_value;
327 }
328 } else {
329
330 // If parent is identified by slug.
331 if ( 'parent' == $key && ! is_int( $value ) ) {
332 $value = wpmem_get_membership_id( $value );
333 }
334
335 $pre_postarr[ 'post_' . $key ] = $value;
336 }
337 }
338
339 // Setup defaults.
340 $default_args = array(
341 'post_title' => '',
342 'post_name' => ( isset( $pre_postarr['post_name'] ) ) ? sanitize_title( $pre_postarr['post_name'] ) : sanitize_title( $pre_postarr['post_title'] ),
343 'post_status' => 'publish',
344 'post_author' => $admin_user->ID,
345 'post_type' => 'wpmem_product',
346 'meta_input' => array(
347 'wpmem_product_name' => ( isset( $pre_postarr['meta_input']['wpmem_product_name'] ) ) ? sanitize_title( $pre_postarr['meta_input']['wpmem_product_name'] ) : ( ( isset( $pre_postarr['post_name'] ) ) ? sanitize_title( $pre_postarr['post_name'] ) : sanitize_title( $pre_postarr['post_title'] ) ),
348 'wpmem_product_default' => false,
349 'wpmem_product_role' => false,
350 'wpmem_product_expires' => false,
351 ),
352 );
353
354 /**
355 * Filter the defaults.
356 *
357 * @since 3.4.6
358 *
359 * @param array $default_args {
360 * Mmembership CPT params for wp_insert_post().
361 *
362 * @type string $post_title User readable name of membership.
363 * @type string $post_name Sanitized title of the membership to be used as the meta key.
364 * @type string $post_status Published status: publish|draft (default: publish)
365 * @type int $post_author User ID of membership author, Optional, defaults to site admin.
366 * @type string $post_type Should not change this: default: wpmem_product.
367 * @type array $meta_input
368 * Meta fields for membership CPT (not all are required).
369 *
370 * @type string $wpmem_product_name The sanitized title of the membership.
371 * @type string $wpmem_product_default
372 * @type string $wpmem_product_role Roles if a role is required.
373 * @type string $wpmem_product_expires Expiration period if used (num|per).
374 *
375 * The following are optional and are not passed in the default args but could be returned by filter.
376 *
377 * @type int $wpmem_product_no_gap If renewal is "no gap" renewal.
378 * @type string $wpmem_product_fixed_period (start|end|grace_num|grace_per)
379 * @type int $wpmem_product_set_default_{$wpmem_product_key}
380 * @type string $wpmem_product_message Custom message for restriction.
381 * @type int $wpmem_product_child_access If membership hierarchy is used.
382 * }
383 * }
384 */
385 $default_args = apply_filters( 'wpmem_create_membership_defaults', $default_args );
386
387 if ( isset( $pre_postarr['meta_input']['wpmem_product_message'] ) ) {
388 $pre_postarr['meta_input']['wpmem_product_message'] = wp_kses_post( $pre_postarr['meta_input']['wpmem_product_message'] );
389 }
390
391 // Merge with defaults.
392 $postarr = rktgk_wp_parse_args( $pre_postarr, $default_args );
393
394 // Insert the new membership as a CPT.
395 $post_id = wp_insert_post( $postarr );
396
397 // wp_insert_post() returns post ID on success, WP_Error on fail.
398 return $post_id;
399 }
400
401 /**
402 * Sets the expiration date for a membership
403 *
404 * @since 3.5.0
405 *
406 * @param string $membership
407 * @param int $user_id
408 * @param mixed $set_date
409 * @param mixed $prev_value
410 * @param boolean $renew
411 * @return mixed $new_value
412 */
413 function wpmem_generate_membership_expiration_date( $membership, $user_id, $set_date = false, $prev_value = false, $renew = false ) {
414 global $wpmem;
415 return $wpmem->membership->set_product_expiration( $membership, $user_id, $set_date, $prev_value, $renew );
416 }
417
418 // @todo EXPERIMENTAL
419 // Anything after this line is subject to change in future versions, including the name.
420 /**
421 * Gets the count(s) of a given membership.
422 *
423 * @since 3.5.3
424 *
425 * @param string $membership The membership slug
426 * @param string $type What type of count to get (all|active|expired default:all)
427 * @return int $count
428 */
429 function wpmem_get_membership_count( $membership, $type = "all" ) {
430 global $wpdb;
431 $user_meta = wpmem_get_membership_meta( $membership );
432 switch ( $type ) {
433 case "active":
434 $period = strtotime( "-" . wpmem_get_expiration_period( $membership ), time() );
435 $compare = ">";
436 break;
437 case "expired":
438 $period = strtotime( "-" . wpmem_get_expiration_period( $membership ), time() );
439 $compare = "<";
440 break;
441 default:
442 $period = 0;
443 $compare = ">";
444 break;
445 }
446
447 //if ( $period ) {
448 // It's an expiration membership
449 $sql = "SELECT meta_value AS integer_value FROM " . $wpdb->usermeta . ' WHERE meta_key = "' . esc_sql( $user_meta ) . '" AND meta_value ' . esc_sql( $compare ) . ' ' . esc_sql( $period ) . ' ORDER BY meta_value;';
450 //} else {
451 // It's not an expiration membership
452 //}
453
454 $results = $wpdb->get_results( $sql );
455
456 return count( $results );
457 }
458
459 /**
460 * Checks whether a membership is an expiration membership.
461 *
462 * @since 3.5.3
463 *
464 * @param string $membership The membership slug
465 * @return boolean
466 */
467 function wpmem_is_membership_expirable( $membership ) {
468 global $wpmem;
469 $exp_period = ( isset( $wpmem->membership->memberships[ $membership ]['expires'] ) ) ? $wpmem->membership->memberships[ $membership ]['expires'] : false;
470 return ( is_array( $exp_period ) ) ? true : false;
471 }
472
473 /**
474 * Gets the expiration period for a membership.
475 *
476 * @since 3.5.3
477 *
478 * @param string $membership The membership slug
479 * @param boolean $raw Whether to return raw array (default) or string of period (i.e. "1 year")
480 * @return mixed Returns string of period for use in time() functions (i.e. "1 year") or
481 * the raw array (array(1,year)) if $raw=true.
482 */
483 function wpmem_get_expiration_period( $membership, $raw = false ) {
484 global $wpmem;
485 $exp_period = ( isset( $wpmem->membership->memberships[ $membership ]['expires'] ) ) ? $wpmem->membership->memberships[ $membership ]['expires'] : false;
486 if ( is_array( $exp_period ) ) {
487 $period = explode("|", $exp_period[0]);
488 return ( ! $raw ) ? $period[0] . ' ' . $period[1] : $period;
489 } else {
490 return false;
491 }
492 }