PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 110710
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v110710
260913 260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 111216 111220 120213 120219 All 188 releases
s2member / includes / classes / auto-eots.inc.php

auto-eots.inc.php in s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions 110710, at includes/classes/auto-eots.inc.php

292 lines 17.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * s2Member's Auto-EOT System *( EOT = End Of Term )*.
4 *
5 * Copyright: © 2009-2011
6 * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7 * ( coded in the USA )
8 *
9 * Released under the terms of the GNU General Public License.
10 * You should have received a copy of the GNU General Public License,
11 * along with this software. In the main directory, see: /licensing/
12 * If not, see: {@link http://www.gnu.org/licenses/}.
13 *
14 * @package s2Member\Auto_EOT_System
15 * @since 3.5
16 */
17 if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
18 exit("Do not access this file directly.");
19 /**/
20 if (!class_exists ("c_ws_plugin__s2member_auto_eots"))
21 {
22 /**
23 * s2Member's Auto-EOT System *( EOT = End Of Term )*.
24 *
25 * @package s2Member\Auto_EOT_System
26 * @since 3.5
27 */
28 class c_ws_plugin__s2member_auto_eots
29 {
30 /**
31 * Adds a scheduled task for s2Member's Auto-EOT System.
32 *
33 * @package s2Member\Auto_EOT_System
34 * @since 3.5
35 *
36 * @return bool True if able to add Auto-EOT System schedule, else false.
37 */
38 public static function add_auto_eot_system ()
39 {
40 do_action ("ws_plugin__s2member_before_add_auto_eot_system", get_defined_vars ());
41 /**/
42 if (!c_ws_plugin__s2member_auto_eots::delete_auto_eot_system ())
43 {
44 return apply_filters ("ws_plugin__s2member_add_auto_eot_system", false, get_defined_vars ());
45 }
46 else if (function_exists ("wp_cron")) /* Otherwise, we can schedule? */
47 {
48 wp_schedule_event (time (), "every10m", "ws_plugin__s2member_auto_eot_system__schedule");
49 /**/
50 return apply_filters ("ws_plugin__s2member_add_auto_eot_system", true, get_defined_vars ());
51 }
52 else /* Otherwise, it would appear that WP-Cron is not available. */
53 {
54 return apply_filters ("ws_plugin__s2member_add_auto_eot_system", false, get_defined_vars ());
55 }
56 }
57 /**
58 * Deletes all scheduled tasks for s2Member's Auto-EOT System.
59 *
60 * @package s2Member\Auto_EOT_System
61 * @since 3.5
62 *
63 * @return bool True if able to delete Auto-EOT System schedule, else false.
64 */
65 public static function delete_auto_eot_system ()
66 {
67 do_action ("ws_plugin__s2member_before_delete_auto_eot_system", get_defined_vars ());
68 /**/
69 if (function_exists ("wp_cron")) /* Is `wp_cron()` even available? */
70 {
71 wp_clear_scheduled_hook("ws_plugin__s2member_auto_eot_system__schedule"); /* Since v3.0.3. */
72 /**/
73 return apply_filters ("ws_plugin__s2member_delete_auto_eot_system", true, get_defined_vars ());
74 }
75 else /* Otherwise, it would appear that WP-Cron is not available. */
76 {
77 return apply_filters ("ws_plugin__s2member_delete_auto_eot_system", false, get_defined_vars ());
78 }
79 }
80 /**
81 * Processed by WP_Cron; this handles Auto-EOTs *( EOT = End Of Term )*.
82 *
83 * If you have a HUGE userbase, increase the max EOTs per process.
84 * But NOTE, this runs ``$per_process`` *( per Blog )* on a Multisite Network.
85 * To increase, use: ``add_filter ("ws_plugin__s2member_auto_eot_system_per_process");``.
86 *
87 * This function makes an important Hook available: `ws_plugin__s2member_after_auto_eot_system`.
88 * This Hook is used by some of s2Member Pro's Gateway integrations; allowing CRON processing
89 * to run for important communications; which poll Payment Gateway APIs for possible EOTs.
90 *
91 * @package s2Member\Auto_EOT_System
92 * @since 3.5
93 *
94 * @param int $per_process Number of database records to process each time.
95 * Can also be Filtered with `ws_plugin__s2member_auto_eot_system_per_process`.
96 * @return null
97 */
98 public static function auto_eot_system ($per_process = 3)
99 {
100 global $wpdb; /* Need global DB obj. */
101 global $current_site, $current_blog; /* Multisite. */
102 /**/
103 include_once ABSPATH . "wp-admin/includes/admin.php";
104 /**/
105 @set_time_limit(0); /* Make time for processing larger userbases. */
106 @ini_set ("memory_limit", "256M"); /* Acquire some additional RAM. */
107 /**/
108 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
109 do_action ("ws_plugin__s2member_before_auto_eot_system", get_defined_vars ());
110 unset ($__refs, $__v); /* Unset defined __refs, __v. */
111 /**/
112 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"]) /* Enabled? */
113 {
114 $per_process = apply_filters ("ws_plugin__s2member_auto_eot_system_per_process", $per_process, get_defined_vars ());
115 /**/
116 if (is_array ($eots = $wpdb->get_results ("SELECT `user_id` AS `ID` FROM `" . $wpdb->usermeta . "` WHERE `meta_key` = '" . $wpdb->prefix . "s2member_auto_eot_time' AND `meta_value` != '' AND `meta_value` <= '" . $wpdb->escape (strtotime ("now")) . "' LIMIT " . $per_process)))
117 {
118 foreach ($eots as $eot) /* Go through the array of EOTS. We need to (demote|delete) each of them. */
119 {
120 if (($user_id = $eot->ID) && is_object ($user = new WP_User ($user_id)) && $user->ID)
121 {
122 delete_user_option ($user_id, "s2member_auto_eot_time"); /* ALWAYS delete this. */
123 /**/
124 if (!$user->has_cap ("administrator")) /* Do NOT process Administrator accounts. */
125 {
126 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_eot_behavior"] === "demote")
127 {
128 $eot_del_type = /* Set EOT/Del type. */
129 "auto-eot-cancellation-expiration-demotion";
130 /**/
131 $custom = get_user_option ("s2member_custom", $user_id);
132 $subscr_id = get_user_option ("s2member_subscr_id", $user_id);
133 $fields = get_user_option ("s2member_custom_fields", $user_id);
134 $user_reg_ip = get_user_option ("s2member_registration_ip", $user_id);
135 /**/
136 $demotion_role = c_ws_plugin__s2member_option_forces::force_demotion_role ("subscriber");
137 $existing_role = c_ws_plugin__s2member_user_access::user_access_role ($user);
138 /**/
139 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
140 do_action ("ws_plugin__s2member_during_auto_eot_system_during_before_demote", get_defined_vars ());
141 do_action ("ws_plugin__s2member_during_collective_mods", $user_id, get_defined_vars (), $eot_del_type, "modification", $demotion_role);
142 do_action ("ws_plugin__s2member_during_collective_eots", $user_id, get_defined_vars (), $eot_del_type, "modification");
143 unset ($__refs, $__v); /* Unset defined __refs, __v. */
144 /**/
145 if ($existing_role !== $demotion_role) /* Only if NOT the existing Role. */
146 $user->set_role ($demotion_role); /* Give User the demotion Role. */
147 /**/
148 foreach ($user->allcaps as $cap => $cap_enabled)
149 if (preg_match ("/^access_s2member_ccap_/", $cap))
150 $user->remove_cap ($ccap = $cap);
151 /**/
152 delete_user_option ($user_id, "s2member_custom");
153 delete_user_option ($user_id, "s2member_subscr_id");
154 delete_user_option ($user_id, "s2member_subscr_gateway");
155 /**/
156 delete_user_option ($user_id, "s2member_ipn_signup_vars");
157 /**/
158 if (!apply_filters ("ws_plugin__s2member_preserve_paid_registration_times", true, get_defined_vars ()))
159 delete_user_option ($user_id, "s2member_paid_registration_times");
160 /**/
161 delete_user_option ($user_id, "s2member_last_status_scan");
162 delete_user_option ($user_id, "s2member_first_payment_txn_id");
163 delete_user_option ($user_id, "s2member_last_payment_time");
164 delete_user_option ($user_id, "s2member_auto_eot_time");
165 /**/
166 delete_user_option ($user_id, "s2member_file_download_access_arc");
167 delete_user_option ($user_id, "s2member_file_download_access_log");
168 /**/
169 c_ws_plugin__s2member_user_notes::append_user_notes ($user_id, "Demoted by s2Member: " . date ("D M j, Y g:i a T"));
170 /**/
171 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_urls"] && is_array ($cv = preg_split ("/\|/", $custom)))
172 {
173 foreach (preg_split ("/[\r\n\t]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_urls"]) as $url) /* Handle EOT Notifications. */
174 /**/
175 if (($url = preg_replace ("/%%cv([0-9]+)%%/ei", 'urlencode(trim($cv[$1]))', $url)) && ($url = preg_replace ("/%%eot_del_type%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ("auto-eot-cancellation-expiration-demotion")), $url)) && ($url = preg_replace ("/%%subscr_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($subscr_id)), $url)))
176 if (($url = preg_replace ("/%%user_first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user->first_name)), $url)) && ($url = preg_replace ("/%%user_last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user->last_name)), $url)))
177 if (($url = preg_replace ("/%%user_full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode (trim ($user->first_name . " " . $user->last_name))), $url)))
178 if (($url = preg_replace ("/%%user_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user->user_email)), $url)))
179 if (($url = preg_replace ("/%%user_login%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user->user_login)), $url)))
180 if (($url = preg_replace ("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user_reg_ip)), $url)))
181 if (($url = preg_replace ("/%%user_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user_id)), $url)))
182 {
183 if (is_array ($fields) && !empty ($fields))
184 foreach ($fields as $var => $val) /* Custom Registration Fields. */
185 if (!($url = preg_replace ("/%%" . preg_quote ($var, "/") . "%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode (maybe_serialize ($val))), $url)))
186 break;
187 /**/
188 if (($url = trim (preg_replace ("/%%(.+?)%%/i", "", $url))))
189 c_ws_plugin__s2member_utils_urls::remote ($url);
190 }
191 }
192 /**/
193 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_recipients"] && is_array ($cv = preg_split ("/\|/", $custom)))
194 {
195 c_ws_plugin__s2member_email_configs::email_config_release (); /* Release all Filters applied to wp_mail() From: headers. */
196 /**/
197 $msg = $sbj = "( s2Member / API Notification Email ) - EOT/Deletion";
198 $msg .= "\n\n"; /* Spacing in the message body. */
199 /**/
200 $msg .= "eot_del_type: %%eot_del_type%%\n";
201 $msg .= "subscr_id: %%subscr_id%%\n";
202 $msg .= "user_first_name: %%user_first_name%%\n";
203 $msg .= "user_last_name: %%user_last_name%%\n";
204 $msg .= "user_full_name: %%user_full_name%%\n";
205 $msg .= "user_email: %%user_email%%\n";
206 $msg .= "user_login: %%user_login%%\n";
207 $msg .= "user_ip: %%user_ip%%\n";
208 $msg .= "user_id: %%user_id%%\n";
209 /**/
210 if (is_array ($fields) && !empty ($fields))
211 foreach ($fields as $var => $val)
212 $msg .= $var . ": %%" . $var . "%%\n";
213 /**/
214 $msg .= "cv0: %%cv0%%\n";
215 $msg .= "cv1: %%cv1%%\n";
216 $msg .= "cv2: %%cv2%%\n";
217 $msg .= "cv3: %%cv3%%\n";
218 $msg .= "cv4: %%cv4%%\n";
219 $msg .= "cv5: %%cv5%%\n";
220 $msg .= "cv6: %%cv6%%\n";
221 $msg .= "cv7: %%cv7%%\n";
222 $msg .= "cv8: %%cv8%%\n";
223 $msg .= "cv9: %%cv9%%";
224 /**/
225 if (($msg = preg_replace ("/%%cv([0-9]+)%%/ei", 'trim($cv[$1])', $msg)) && ($msg = preg_replace ("/%%eot_del_type%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ("auto-eot-cancellation-expiration-demotion"), $msg)) && ($msg = preg_replace ("/%%subscr_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($subscr_id), $msg)))
226 if (($msg = preg_replace ("/%%user_first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user->first_name), $msg)) && ($msg = preg_replace ("/%%user_last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user->last_name), $msg)))
227 if (($msg = preg_replace ("/%%user_full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (trim ($user->first_name . " " . $user->last_name)), $msg)))
228 if (($msg = preg_replace ("/%%user_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user->user_email), $msg)))
229 if (($msg = preg_replace ("/%%user_login%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user->user_login), $msg)))
230 if (($msg = preg_replace ("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user_reg_ip), $msg)))
231 if (($msg = preg_replace ("/%%user_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user_id), $msg)))
232 {
233 if (is_array ($fields) && !empty ($fields))
234 foreach ($fields as $var => $val) /* Custom Registration Fields. */
235 if (!($msg = preg_replace ("/%%" . preg_quote ($var, "/") . "%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (maybe_serialize ($val)), $msg)))
236 break;
237 /**/
238 if (($msg = trim (preg_replace ("/%%(.+?)%%/i", "", $msg))))
239 foreach (c_ws_plugin__s2member_utils_strings::trim_deep (preg_split ("/;+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_recipients"])) as $recipient)
240 ($recipient) ? wp_mail ($recipient, apply_filters ("ws_plugin__s2member_eot_del_notification_email_sbj", $sbj, get_defined_vars ()), apply_filters ("ws_plugin__s2member_eot_del_notification_email_msg", $msg, get_defined_vars ()), "From: \"" . preg_replace ('/"/', "'", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["reg_email_from_name"]) . "\" <" . $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["reg_email_from_email"] . ">\r\nContent-Type: text/plain; charset=utf-8") : null;
241 }
242 }
243 /**/
244 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
245 do_action ("ws_plugin__s2member_during_auto_eot_system_during_demote", get_defined_vars ());
246 unset ($__refs, $__v); /* Unset defined __refs, __v. */
247 }
248 else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_eot_behavior"] === "delete")
249 {
250 $eot_del_type = $GLOBALS["ws_plugin__s2member_eot_del_type"] = "auto-eot-cancellation-expiration-deletion";
251 /**/
252 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
253 do_action ("ws_plugin__s2member_during_auto_eot_system_during_before_delete", get_defined_vars ());
254 do_action ("ws_plugin__s2member_during_collective_eots", $user_id, get_defined_vars (), $eot_del_type, "removal-deletion");
255 unset ($__refs, $__v); /* Unset defined __refs, __v. */
256 /**/
257 if (is_multisite ()) /* Multisite does NOT actually delete; ONLY removes. */
258 {
259 remove_user_from_blog ($user_id, $current_blog->blog_id);
260 /* This will automatically trigger `eot_del_notification_urls` as well. */
261 c_ws_plugin__s2member_user_deletions::handle_ms_user_deletions ($user_id, $current_blog->blog_id, "s2says");
262 }
263 /**/
264 else /* Otherwise, we can actually delete them. */
265 /* This will automatically trigger `eot_del_notification_urls` as well. */
266 wp_delete_user($user_id); /* `c_ws_plugin__s2member_user_deletions::handle_user_deletions()` */
267 /**/
268 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
269 do_action ("ws_plugin__s2member_during_auto_eot_system_during_delete", get_defined_vars ());
270 unset ($__refs, $__v); /* Unset defined __refs, __v. */
271 }
272 /**/
273 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
274 do_action ("ws_plugin__s2member_during_auto_eot_system", get_defined_vars ());
275 unset ($__refs, $__v); /* Unset defined __refs, __v. */
276 }
277 }
278 }
279 }
280 }
281 /**/
282 c_ws_plugin__s2member_utils_logs::cleanup_expired_s2m_transients (); /* Cleanup. */
283 /**/
284 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
285 do_action ("ws_plugin__s2member_after_auto_eot_system", get_defined_vars ());
286 unset ($__refs, $__v); /* Unset defined __refs, __v. */
287 /**/
288 return; /* Return for uniformity. */
289 }
290 }
291 }
292 ?>