PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 111017
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v111017
260917 260913 260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 111216 111220 120213 All 189 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 111017, at includes/classes/auto-eots.inc.php

296 lines 18.0 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. */
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 if (!apply_filters ("ws_plugin__s2member_preserve_paid_registration_times", true, get_defined_vars ()))
158 delete_user_option ($user_id, "s2member_paid_registration_times");
159 /**/
160 delete_user_option ($user_id, "s2member_last_status_scan");
161 delete_user_option ($user_id, "s2member_first_payment_txn_id");
162 delete_user_option ($user_id, "s2member_last_payment_time");
163 delete_user_option ($user_id, "s2member_auto_eot_time");
164 /**/
165 delete_user_option ($user_id, "s2member_file_download_access_arc");
166 delete_user_option ($user_id, "s2member_file_download_access_log");
167 /**/
168 c_ws_plugin__s2member_user_notes::append_user_notes ($user_id, "Demoted by s2Member: " . date ("D M j, Y g:i a T"));
169 /**/
170 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_urls"] && is_array ($cv = preg_split ("/\|/", $custom)))
171 {
172 foreach (preg_split ("/[\r\n\t]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_urls"]) as $url) /* Handle EOT Notifications. */
173 /**/
174 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)))
175 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)))
176 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)))
177 if (($url = preg_replace ("/%%user_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user->user_email)), $url)))
178 if (($url = preg_replace ("/%%user_login%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user->user_login)), $url)))
179 if (($url = preg_replace ("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user_reg_ip)), $url)))
180 if (($url = preg_replace ("/%%user_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user_id)), $url)))
181 {
182 if (is_array ($fields) && !empty ($fields))
183 foreach ($fields as $var => $val) /* Custom Registration/Profile Fields. */
184 if (!($url = preg_replace ("/%%" . preg_quote ($var, "/") . "%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode (maybe_serialize ($val))), $url)))
185 break;
186 /**/
187 if (($url = trim (preg_replace ("/%%(.+?)%%/i", "", $url))))
188 c_ws_plugin__s2member_utils_urls::remote ($url);
189 }
190 }
191 /**/
192 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_recipients"] && is_array ($cv = preg_split ("/\|/", $custom)))
193 {
194 $email_configs_were_on = c_ws_plugin__s2member_email_configs::email_config_status ();
195 c_ws_plugin__s2member_email_configs::email_config_release ();
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/Profile 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 ($sbj && ($msg = trim (preg_replace ("/%%(.+?)%%/i", "", $msg)))) /* Still have a ``$sbj`` and a ``$msg``? */
239 /**/
240 foreach (c_ws_plugin__s2member_utils_strings::parse_emails ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_recipients"]) as $recipient)
241 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 ()), "Content-Type: text/plain; charset=utf-8");
242 }
243 /**/
244 if ($email_configs_were_on) /* Back on? */
245 c_ws_plugin__s2member_email_configs::email_config ();
246 }
247 /**/
248 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
249 do_action ("ws_plugin__s2member_during_auto_eot_system_during_demote", get_defined_vars ());
250 unset ($__refs, $__v); /* Unset defined __refs, __v. */
251 }
252 else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_eot_behavior"] === "delete")
253 {
254 $eot_del_type = $GLOBALS["ws_plugin__s2member_eot_del_type"] = "auto-eot-cancellation-expiration-deletion";
255 /**/
256 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
257 do_action ("ws_plugin__s2member_during_auto_eot_system_during_before_delete", get_defined_vars ());
258 do_action ("ws_plugin__s2member_during_collective_eots", $user_id, get_defined_vars (), $eot_del_type, "removal-deletion");
259 unset ($__refs, $__v); /* Unset defined __refs, __v. */
260 /**/
261 if (is_multisite ()) /* Multisite does NOT actually delete; ONLY removes. */
262 {
263 remove_user_from_blog ($user_id, $current_blog->blog_id);
264 /* This will automatically trigger `eot_del_notification_urls` as well. */
265 c_ws_plugin__s2member_user_deletions::handle_ms_user_deletions ($user_id, $current_blog->blog_id, "s2says");
266 }
267 /**/
268 else /* Otherwise, we can actually delete them. */
269 /* This will automatically trigger `eot_del_notification_urls` as well. */
270 wp_delete_user ($user_id); /* `c_ws_plugin__s2member_user_deletions::handle_user_deletions()` */
271 /**/
272 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
273 do_action ("ws_plugin__s2member_during_auto_eot_system_during_delete", get_defined_vars ());
274 unset ($__refs, $__v); /* Unset defined __refs, __v. */
275 }
276 /**/
277 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
278 do_action ("ws_plugin__s2member_during_auto_eot_system", get_defined_vars ());
279 unset ($__refs, $__v); /* Unset defined __refs, __v. */
280 }
281 }
282 }
283 }
284 }
285 /**/
286 c_ws_plugin__s2member_utils_logs::cleanup_expired_s2m_transients (); /* Cleanup. */
287 /**/
288 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
289 do_action ("ws_plugin__s2member_after_auto_eot_system", get_defined_vars ());
290 unset ($__refs, $__v); /* Unset defined __refs, __v. */
291 /**/
292 return; /* Return for uniformity. */
293 }
294 }
295 }
296 ?>