PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 110731
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v110731
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 / users-list-in.inc.php

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

559 lines 44.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Users list ( inner processing routines ).
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\Users_List
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_users_list_in"))
21 {
22 /**
23 * Users list ( inner processing routines ).
24 *
25 * @package s2Member\Users_List
26 * @since 3.5
27 */
28 class c_ws_plugin__s2member_users_list_in
29 {
30 /**
31 * Adds Custom Fields to the admin Profile editing page.
32 *
33 * @package s2Member\Users_List
34 * @since 3.5
35 *
36 * @attaches-to: ``add_action("edit_user_profile");``
37 * @attaches-to: ``add_action("show_user_profile");``
38 *
39 * @param obj $user Expects a `WP_User` object passed in by the Action Hook.
40 * @return null
41 */
42 public static function users_list_edit_cols ($user = FALSE)
43 {
44 global $current_site, $current_blog; /* Multisite Networking. */
45 /**/
46 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
47 do_action ("ws_plugin__s2member_before_users_list_edit_cols", get_defined_vars ());
48 unset ($__refs, $__v); /* Unset defined __refs, __v. */
49 /**/
50 $current_user = (is_user_logged_in ()) ? wp_get_current_user () : false; /* Current User. */
51 /**/
52 if (is_object ($user) && ($user_id = $user->ID) && is_object ($current_user) && $current_user->ID)
53 {
54 $role = c_ws_plugin__s2member_user_access::user_access_role ($user); /* This User's WordPress® Role. */
55 $level = c_ws_plugin__s2member_user_access::user_access_level ($user); /* This User's Access Level for s2Member. */
56 /**/
57 if (current_user_can ("edit_users") && (!is_multisite () || is_super_admin () || is_user_member_of_blog ($user_id)))
58 {
59 echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
60 /**/
61 echo '<h3 style="position:relative;"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/large-icon.png" title="s2Member ( a Membership management system for WordPress® )" alt="" style="position:absolute; top:-15px; right:0; border:0;" />s2Member Configuration &amp; Profile Fields' . ((is_multisite ()) ? ' ( for this Blog )' : '') . '</h3>' . "\n";
62 /**/
63 echo '<table class="form-table">' . "\n";
64 /**/
65 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
66 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before", get_defined_vars ());
67 unset ($__refs, $__v); /* Unset defined __refs, __v. */
68 /**/
69 if (is_multisite () && is_super_admin ()) /* MUST be a Super Admin. */
70 /* On a Multisite Network, the Super Administrator can ALWAYS edit this. */
71 {
72 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
73 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_originating_blog", get_defined_vars ());
74 unset ($__refs, $__v); /* Unset defined __refs, __v. */
75 /**/
76 echo '<tr>' . "\n";
77 echo '<th><label for="ws-plugin--s2member-profile-s2member-originating-blog">Originating Blog ID#:</label> <a href="#" onclick="alert(\'On a Multisite Network, this is how s2Member keeps track of which Blog each User/Member originated from. So this ID#, is automatically associated with a Blog in your Network, matching the User\\\'s point of origin. ~ ONLY a Super Admin can modify this.\\n\\nOn a Multisite Blog Farm, the Originating Blog ID# for your own Customers, will ALWAYS be associated with your ( Main Site ). It is NOT likely that you\\\'ll need to modify this manually, but s2Member makes it available; just in case.\\n\\n*Tip* - If you add Users ( and/or Blogs ) with the `Super Admin` Network Administration panel inside WordPress®, then you WILL need to set everything manually. s2Member does NOT tamper with automation routines whenever YOU ( as a Super Administrator ) are working in that area.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
78 echo '<td><input type="text" name="ws_plugin__s2member_profile_s2member_originating_blog" id="ws-plugin--s2member-profile-s2member-originating-blog" value="' . format_to_edit (get_user_meta ($user_id, "s2member_originating_blog", true)) . '" class="regular-text" /></td>' . "\n";
79 echo '</tr>' . "\n";
80 /**/
81 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
82 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_originating_blog", get_defined_vars ());
83 unset ($__refs, $__v); /* Unset defined __refs, __v. */
84 }
85 /**/
86 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
87 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_subscr_gateway", get_defined_vars ());
88 unset ($__refs, $__v); /* Unset defined __refs, __v. */
89 /**/
90 echo '<tr>' . "\n";
91 echo '<th><label for="ws-plugin--s2member-profile-s2member-subscr-gateway">Paid Subscr. Gateway:</label> <a href="#" onclick="alert(\'A Payment Gateway code is associated with the Paid Subscr. ID below. A Paid Subscription ID ( or a Buy Now Transaction ID ) is only valid for paid Members. Also known as ( a Recurring Profile ID, a ClickBank® Receipt #, a Google® TID/SID ( with an s2 prefix ), an AliPay® Trade No. ). This will be filled automatically by s2Member.\\n\\nThis field will be empty for Free Subscribers, and/or anyone who is NOT paying you. This field is only editable for Customer Service purposes; just in case you ever need to update the Paid Subscr. Gateway/ID manually.\\n\\nThe value of Paid® Subscr. ID, can be a PayPal® Standard `Subscription ID`, or a PayPal® Pro `Recurring Profile ID`, or a PayPal® `Transaction ID`; depending on the type of sale. Your PayPal® account will supply this information. If you\\\'re using Google® Checkout, use the TID/SID value in the sale Description; it always starts with `s2-`. ClickBank® provides a Receipt #, ccBill® provides a Subscription ID, Authorize.Net® provides a Subscription ID, and AliPay® provides a Transaction ID. The general rule is... IF there\\\'s a Subscription ID, use that! If there\\\'s NOT, use the Transaction ID.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
92 echo '<td><select name="ws_plugin__s2member_profile_s2member_subscr_gateway" id="ws-plugin--s2member-profile-s2member-subscr-gateway" style="width:25em;"><option value=""></option>' . "\n";
93 foreach (apply_filters ("ws_plugin__s2member_profile_s2member_subscr_gateways", array ("paypal" => "PayPal® ( code: paypal )"), get_defined_vars ()) as $gateway => $gateway_name)
94 echo '<option value="' . esc_attr ($gateway) . '"' . (($gateway === get_user_option ("s2member_subscr_gateway", $user_id)) ? ' selected="selected"' : '') . '>' . esc_html ($gateway_name) . '</option>' . "\n";
95 echo '</select>' . "\n";
96 echo '</td>' . "\n";
97 echo '</tr>' . "\n";
98 /**/
99 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
100 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_subscr_gateway", get_defined_vars ());
101 unset ($__refs, $__v); /* Unset defined __refs, __v. */
102 /**/
103 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
104 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_subscr_id", get_defined_vars ());
105 unset ($__refs, $__v); /* Unset defined __refs, __v. */
106 /**/
107 echo '<tr>' . "\n";
108 echo '<th><label for="ws-plugin--s2member-profile-s2member-subscr-id">Paid Subscr. ID:</label> <a href="#" onclick="alert(\'A Paid Subscription ID ( or a Buy Now Transaction ID ) is only valid for paid Members. Also known as ( a Recurring Profile ID, a ClickBank® Receipt #, a Google® TID/SID ( with an s2 prefix ), an AliPay® Trade No. ). This will be filled automatically by s2Member.\\n\\nThis field will be empty for Free Subscribers, and/or anyone who is NOT paying you. This field is only editable for Customer Service purposes; just in case you ever need to update the Paid Subscr. Gateway/ID manually.\\n\\nThe value of Paid® Subscr. ID, can be a PayPal® Standard `Subscription ID`, or a PayPal® Pro `Recurring Profile ID`, or a PayPal® `Transaction ID`; depending on the type of sale. Your PayPal® account will supply this information. If you\\\'re using Google® Checkout, use the TID/SID value in the sale Description; it always starts with `s2-`. ClickBank® provides a Receipt #, ccBill® provides a Subscription ID, Authorize.Net® provides a Subscription ID, and AliPay® provides a Transaction ID. The general rule is... IF there\\\'s a Subscription ID, use that! If there\\\'s NOT, use the Transaction ID.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
109 echo '<td><input type="text" name="ws_plugin__s2member_profile_s2member_subscr_id" id="ws-plugin--s2member-profile-s2member-subscr-id" value="' . format_to_edit (get_user_option ("s2member_subscr_id", $user_id)) . '" class="regular-text" /></td>' . "\n";
110 echo '</tr>' . "\n";
111 /**/
112 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
113 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_subscr_id", get_defined_vars ());
114 unset ($__refs, $__v); /* Unset defined __refs, __v. */
115 /**/
116 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
117 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_custom", get_defined_vars ());
118 unset ($__refs, $__v); /* Unset defined __refs, __v. */
119 /**/
120 echo '<tr>' . "\n";
121 echo '<th><label for="ws-plugin--s2member-profile-s2member-custom">Custom Value:</label> <a href="#" onclick="alert(\'A Paid Subscription is always associated with a Custom String that is passed through the custom=\\\'\\\'' . c_ws_plugin__s2member_utils_strings::esc_sq (esc_attr ($_SERVER["HTTP_HOST"])) . '\\\'\\\' attribute of your Shortcode. This Custom Value, MUST always start with your domain name. However, you can also pipe delimit additional values after your domain, if you need to.\\n\\nFor example:\n' . c_ws_plugin__s2member_utils_strings::esc_sq (esc_attr ($_SERVER["HTTP_HOST"])) . '|cv1|cv2|cv3\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
122 echo '<td><input type="text" name="ws_plugin__s2member_profile_s2member_custom" id="ws-plugin--s2member-profile-s2member-custom" value="' . format_to_edit (get_user_option ("s2member_custom", $user_id)) . '" class="regular-text" /></td>' . "\n";
123 echo '</tr>' . "\n";
124 /**/
125 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
126 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_custom", get_defined_vars ());
127 unset ($__refs, $__v); /* Unset defined __refs, __v. */
128 /**/
129 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
130 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_registration_ip", get_defined_vars ());
131 unset ($__refs, $__v); /* Unset defined __refs, __v. */
132 /**/
133 echo '<tr>' . "\n";
134 echo '<th><label for="ws-plugin--s2member-profile-s2member-registration-ip">Registration IP:</label> <a href="#" onclick="alert(\'This is the IP Address the User had at the time of registration. If you don\\\'t know the User\\\'s IP Address, just leave this blank. If this is left empty, s2Member will make attempts in the future to grab the User\\\'s IP Address.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
135 echo '<td><input type="text" name="ws_plugin__s2member_profile_s2member_registration_ip" id="ws-plugin--s2member-profile-s2member-registration-ip" value="' . format_to_edit (get_user_option ("s2member_registration_ip", $user_id)) . '" class="regular-text" /></td>' . "\n";
136 echo '</tr>' . "\n";
137 /**/
138 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
139 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_registration_ip", get_defined_vars ());
140 unset ($__refs, $__v); /* Unset defined __refs, __v. */
141 /**/
142 if (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ())
143 /* ^ Will change once Custom Capabilities are compatible with a Blog Farm. */
144 {
145 foreach ($user->allcaps as $cap => $cap_enabled)
146 if (preg_match ("/^access_s2member_ccap_/", $cap))
147 $ccaps[] = preg_replace ("/^access_s2member_ccap_/", "", $cap);
148 /**/
149 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
150 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_ccaps", get_defined_vars ());
151 unset ($__refs, $__v); /* Unset defined __refs, __v. */
152 /**/
153 echo '<tr>' . "\n";
154 echo '<th><label for="ws-plugin--s2member-profile-s2member-ccaps">Custom Capabilities:</label> <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member -> API Scripting -> Custom Capabilities.' . ((is_multisite ()) ? '\\n\\nCustom Capabilities are assigned on a per-Blog basis. So having a set of Custom Capabilities for one Blog, and having NO Custom Capabilities on another Blog - is very common. This is how permissions are designed to work.' : '') . '\'); return false;" tabindex="-1">[?]</a>' . ((is_multisite ()) ? '<br /><small>( for this Blog )</small>' : '') . '</th>' . "\n";
155 echo '<td><input type="text" name="ws_plugin__s2member_profile_s2member_ccaps" id="ws-plugin--s2member-profile-s2member-ccaps" value="' . format_to_edit (((!empty ($ccaps)) ? implode (",", $ccaps) : "")) . '" class="regular-text" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^A-Z_0-9,]/gi, \'\').toLowerCase ());" /></td>' . "\n";
156 echo '</tr>' . "\n";
157 /**/
158 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
159 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_ccaps", get_defined_vars ());
160 unset ($__refs, $__v); /* Unset defined __refs, __v. */
161 }
162 /**/
163 if (!$user->has_cap ("administrator")) /* Do NOT present these details for Administrator accounts. */
164 {
165 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
166 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_auto_eot_time", get_defined_vars ());
167 unset ($__refs, $__v); /* Unset defined __refs, __v. */
168 /**/
169 echo '<tr>' . "\n";
170 $auto_eot_time = get_user_option ("s2member_auto_eot_time", $user_id);
171 $auto_eot_time = ($auto_eot_time) ? date ("D M j, Y g:i a T", $auto_eot_time) : "";
172 echo '<th><label for="ws-plugin--s2member-profile-s2member-auto-eot-time">Automatic EOT Time:</label> <a href="#" onclick="alert(\'EOT = End Of Term. ( i.e. Account Expiration / Termination. ).\\n\\nIf you leave this empty, s2Member will configure an EOT Time automatically, based on the paid Subscription associated with this account. In other words, if a paid Subscription expires, is cancelled, terminated, refunded, reversed, or charged back to you; s2Member will deal with the EOT automatically.\\n\\nThat being said, if you would rather take control over this, you can. If you type in a date manually, s2Member will obey the Auto-EOT Time that you\\\'ve given, no matter what. In other words, you can force certain Members to expire automatically, at a time that you specify. s2Member will obey.\\n\\nValid formats for Automatic EOT Time:\\n\\nmm/dd/yyyy\\nyyyy-mm-dd\\n+1 year\\n+2 weeks\\n+2 months\\n+10 minutes\\nnext thursday\\ntomorrow\\ntoday\\n\\n* anything compatible with PHP\\\'s strtotime() function.\'); return false;" tabindex="-1">[?]</a>' . (($auto_eot_time) ? '<br /><small>( <a href="http://www.world-time-zones.org/zones/greenwich-mean-time.htm" target="_blank" rel="external">Universal Time / GMT</a> )</small>' : '') . '</th>' . "\n";
173 echo '<td><input type="text" name="ws_plugin__s2member_profile_s2member_auto_eot_time" id="ws-plugin--s2member-profile-s2member-auto-eot-time" value="' . format_to_edit ($auto_eot_time) . '" class="regular-text" /></td>' . "\n";
174 echo '</tr>' . "\n";
175 /**/
176 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
177 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_auto_eot_time", get_defined_vars ());
178 unset ($__refs, $__v); /* Unset defined __refs, __v. */
179 }
180 /**/
181 if (c_ws_plugin__s2member_list_servers::list_servers_integrated ()) /* Only if integrated with s2Member. */
182 {
183 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
184 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_opt_in", get_defined_vars ());
185 unset ($__refs, $__v); /* Unset defined __refs, __v. */
186 /**/
187 echo '<tr>' . "\n";
188 echo '<th><label for="ws-plugin--s2member-profile-opt-in">Re-process List Servers:</label> <a href="#" onclick="alert(\'You have at least one List Server integrated with s2Member. Would you like to re-process a confirmation request for this User? If not, just leave the box un-checked.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
189 echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_opt_in" id="ws-plugin--s2member-profile-opt-in" value="1" /> Yes, send a mailing list confirmation email to this User.</label></td>' . "\n";
190 echo '</tr>' . "\n";
191 /**/
192 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
193 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_opt_in", get_defined_vars ());
194 unset ($__refs, $__v); /* Unset defined __refs, __v. */
195 /**/
196 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_out_transitions"])
197 if (($custom_reg_auto_op_outs = c_ws_plugin__s2member_utils_strings::wrap_deep ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_outs"], "/", "/i")))
198 if (c_ws_plugin__s2member_utils_arrays::in_regex_array ("user-role-change", $custom_reg_auto_op_outs) || c_ws_plugin__s2member_utils_arrays::in_regex_array ("modification", $custom_reg_auto_op_outs))
199 {
200 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
201 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_auto_opt_out_transitions", get_defined_vars ());
202 unset ($__refs, $__v); /* Unset defined __refs, __v. */
203 /**/
204 echo '<tr>' . "\n";
205 echo '<th><label for="ws-plugin--s2member-custom-reg-auto-opt-out-transitions">Allow List Transitioning:</label> <a href="#" onclick="alert(\'You\\\'ve configured s2Member with List Transitions enabled. By leaving this box checked, s2Member will Transition the User\\\'s mailing list subscription(s) automatically. For example, if a Member is demoted from Level #2, down to Level #1; s2Member will add them to the Level #1 List(s) after it removes them from the Level #2 List(s).\\n\\nHowever, the transition will ONLY occur, if s2Member IS able to successfully remove them from an existing List. In other words, if they are currently NOT subscribed to any List(s), s2Member will NOT transition them to any new Lists ( intended behavior ).\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
206 echo '<td><label><input type="checkbox" name="ws_plugin__s2member_custom_reg_auto_opt_out_transitions" id="ws-plugin--s2member-custom-reg-auto-opt-out-transitions" value="1" checked="checked" /> Yes, automatically transition this User\'s mailing list subscription(s) when/if I change their Role.</label></td>' . "\n";
207 echo '</tr>' . "\n";
208 /**/
209 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
210 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_auto_opt_out_transitions", get_defined_vars ());
211 unset ($__refs, $__v); /* Unset defined __refs, __v. */
212 }
213 }
214 /**/
215 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
216 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_ip_restrictions", get_defined_vars ());
217 unset ($__refs, $__v); /* Unset defined __refs, __v. */
218 /**/
219 echo '<tr>' . "\n";
220 echo '<th><label for="ws-plugin--s2member-profile-ip-restrictions">Reset IP Restrictions:</label> <a href="#" onclick="alert(\'A single Username is only valid for a certain number of unique IP addresses ( as configured in your s2Member -> General Options ). Once that limit is reached, s2Member assumes there has been a security breach. At that time, s2Member will place a temporary ban ( preventing access ).\\n\\nIf you have spoken to a legitimate Customer that is receiving an error upon logging in ( ex: 503 / too many IP addresses ), you can remove this temporary ban by checking the box below. If the abusive behavior continues, s2Member will automatically re-instate IP Restrictions in the future. If you would like to gain further control over IP Restrictions, please check your General Options panel for s2Member.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
221 echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_ip_restrictions" id="ws-plugin--s2member-profile-ip-restrictions" value="1" /> Yes, delete/reset IP Restrictions associated with this Username.</label>' . ((c_ws_plugin__s2member_ip_restrictions::specific_ip_restriction_breached_security (strtolower ($user->user_login))) ? '<br /><em>*Note* this User HAS breached security through existing IP Restrictions.</em>' : '<br /><em>*Note* this User is NOT currently banned by any of your IP Restrictions.</em>') . '</td>' . "\n";
222 echo '</tr>' . "\n";
223 /**/
224 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
225 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_ip_restrictions", get_defined_vars ());
226 unset ($__refs, $__v); /* Unset defined __refs, __v. */
227 /**/
228 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"]) /* Only if configured. */
229 if ($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level ($level, "administrative"))
230 {
231 echo '<tr>' . "\n";
232 echo '<td colspan="2">' . "\n";
233 echo '<div style="height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
234 echo '</td>' . "\n";
235 echo '</tr>' . "\n";
236 /**/
237 $fields = get_user_option ("s2member_custom_fields", $user_id); /* Existing fields. */
238 /**/
239 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
240 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_custom_fields", get_defined_vars ());
241 unset ($__refs, $__v); /* Unset defined __refs, __v. */
242 /**/
243 foreach (json_decode ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
244 {
245 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
246 do_action ("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_before", get_defined_vars ());
247 unset ($__refs, $__v); /* Unset defined __refs, __v. */
248 /**/
249 if (in_array ($field["id"], $fields_applicable)) /* Field applicable? */
250 {
251 $field_var = preg_replace ("/[^a-z0-9]/i", "_", strtolower ($field["id"]));
252 $field_id_class = preg_replace ("/_/", "-", $field_var);
253 /**/
254 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
255 if (apply_filters ("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_display", true, get_defined_vars ()))
256 {
257 if (!empty ($field["section"]) && $field["section"] === "yes") /* Starts a new section? */
258 echo '<tr><td colspan="2"><div class="ws-plugin--s2member-profile-divider-section' . ((!empty ($field["sectitle"])) ? '-title' : '') . '">' . ((!empty ($field["sectitle"])) ? $field["sectitle"] : '') . '</div></td></tr>';
259 /**/
260 echo '<tr>' . "\n";
261 echo '<th><label for="ws-plugin--s2member-profile-' . esc_attr ($field_id_class) . '">' . ((preg_match ("/^(checkbox|pre_checkbox)$/", $field["type"])) ? ucwords (preg_replace ("/_/", " ", $field_var)) : $field["label"]) . ':</label></th>' . "\n";
262 echo '<td>' . c_ws_plugin__s2member_custom_reg_fields::custom_field_gen (__FUNCTION__, $field, "ws_plugin__s2member_profile_", "ws-plugin--s2member-profile-", "", ((preg_match ("/^(text|textarea|select|selects)$/", $field["type"])) ? "width:99%;" : ""), "", "", $fields, $fields[$field_var], "administrative") . '</td>' . "\n";
263 echo '</tr>' . "\n";
264 }
265 unset ($__refs, $__v); /* Unset defined __refs, __v. */
266 }
267 /**/
268 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
269 do_action ("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_after", 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_users_list_edit_cols_after_custom_fields", get_defined_vars ());
275 unset ($__refs, $__v); /* Unset defined __refs, __v. */
276 /**/
277 echo '<tr>' . "\n";
278 echo '<td colspan="2">' . "\n";
279 echo '<div style="height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
280 echo '</td>' . "\n";
281 echo '</tr>' . "\n";
282 }
283 /**/
284 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
285 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_notes", get_defined_vars ());
286 unset ($__refs, $__v); /* Unset defined __refs, __v. */
287 /**/
288 echo '<tr>' . "\n";
289 echo '<th><label for="ws-plugin--s2member-profile-s2member-notes">Administrative Notes:</label> <a href="#" onclick="alert(\'This is for Administrative purposes. You can keep a list of Notations about this account. These Notations are private; Users/Members will never see these.\\n\\n*Note* The s2Member software may `append` Notes to this field occasionally, under special circumstances. For example, when/if s2Member demotes a paid Member to a Free Subscriber, s2Member will leave a Note in this field.\'); return false;" tabindex="-1">[?]</a><br /><br /><small>These Notations are private; Users/Members will never see any of these notes.</small></th>' . "\n";
290 echo '<td><textarea name="ws_plugin__s2member_profile_s2member_notes" id="ws-plugin--s2member-profile-s2member-notes" rows="5" wrap="off" spellcheck="false" style="width:99%;">' . format_to_edit (get_user_option ("s2member_notes", $user_id)) . '</textarea></td>' . "\n";
291 echo '</tr>' . "\n";
292 /**/
293 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
294 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_notes", get_defined_vars ());
295 unset ($__refs, $__v); /* Unset defined __refs, __v. */
296 /**/
297 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
298 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after", get_defined_vars ());
299 unset ($__refs, $__v); /* Unset defined __refs, __v. */
300 /**/
301 echo '</table>' . "\n";
302 /**/
303 echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
304 }
305 /**/
306 else if ($current_user->ID === $user->ID) /* Otherwise, a User can always edit their own Profile. */
307 {
308 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"]) /* Only if configured. */
309 if ($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level ($level, "profile"))
310 {
311 echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
312 /**/
313 echo '<h3>Additional Profile Fields' . ((is_multisite ()) ? ' ( for this Blog )' : '') . '</h3>' . "\n";
314 /**/
315 echo '<table class="form-table">' . "\n";
316 /**/
317 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
318 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before", get_defined_vars ());
319 unset ($__refs, $__v); /* Unset defined __refs, __v. */
320 /**/
321 $fields = get_user_option ("s2member_custom_fields", $user_id); /* Existing fields. */
322 /**/
323 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
324 do_action ("ws_plugin__s2member_during_users_list_edit_cols_before_custom_fields", get_defined_vars ());
325 unset ($__refs, $__v); /* Unset defined __refs, __v. */
326 /**/
327 foreach (json_decode ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
328 {
329 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
330 do_action ("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_before", get_defined_vars ());
331 unset ($__refs, $__v); /* Unset defined __refs, __v. */
332 /**/
333 if (in_array ($field["id"], $fields_applicable)) /* Field applicable? */
334 {
335 $field_var = preg_replace ("/[^a-z0-9]/i", "_", strtolower ($field["id"]));
336 $field_id_class = preg_replace ("/_/", "-", $field_var);
337 /**/
338 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
339 if (apply_filters ("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_display", true, get_defined_vars ()))
340 {
341 if (!empty ($field["section"]) && $field["section"] === "yes") /* Starts a new section? */
342 echo '<tr><td colspan="2"><div class="ws-plugin--s2member-profile-divider-section' . ((!empty ($field["sectitle"])) ? '-title' : '') . '">' . ((!empty ($field["sectitle"])) ? $field["sectitle"] : '') . '</div></td></tr>';
343 /**/
344 echo '<tr>' . "\n";
345 echo '<th><label for="ws-plugin--s2member-profile-' . esc_attr ($field_id_class) . '">' . ((preg_match ("/^(checkbox|pre_checkbox)$/", $field["type"])) ? ucwords (preg_replace ("/_/", " ", $field_var)) : $field["label"]) . ':</label></th>' . "\n";
346 echo '<td>' . c_ws_plugin__s2member_custom_reg_fields::custom_field_gen (__FUNCTION__, $field, "ws_plugin__s2member_profile_", "ws-plugin--s2member-profile-", "", ((preg_match ("/^(text|textarea|select|selects)$/", $field["type"])) ? "width:99%;" : ""), "", "", $fields, $fields[$field_var], "profile") . '</td>' . "\n";
347 echo '</tr>' . "\n";
348 }
349 unset ($__refs, $__v); /* Unset defined __refs, __v. */
350 }
351 /**/
352 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
353 do_action ("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_after", get_defined_vars ());
354 unset ($__refs, $__v); /* Unset defined __refs, __v. */
355 }
356 /**/
357 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
358 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after_custom_fields", get_defined_vars ());
359 unset ($__refs, $__v); /* Unset defined __refs, __v. */
360 /**/
361 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
362 do_action ("ws_plugin__s2member_during_users_list_edit_cols_after", get_defined_vars ());
363 unset ($__refs, $__v); /* Unset defined __refs, __v. */
364 /**/
365 echo '</table>' . "\n";
366 /**/
367 echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
368 }
369 }
370 }
371 /**/
372 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
373 do_action ("ws_plugin__s2member_after_users_list_edit_cols", get_defined_vars ());
374 unset ($__refs, $__v); /* Unset defined __refs, __v. */
375 /**/
376 return; /* Return for uniformity. */
377 }
378 /**
379 * Saves Custom Fields after an admin updates Profile.
380 *
381 * @package s2Member\Users_List
382 * @since 3.5
383 *
384 * @attaches-to: ``add_action("edit_user_profile_update");``
385 * @attaches-to: ``add_action("personal_options_update");``
386 *
387 * @param int|str $user_id Expects a numeric WordPress® User ID passed in by the Action Hook.
388 * @return null
389 */
390 public static function users_list_update_cols ($user_id = FALSE)
391 {
392 global $current_site, $current_blog; /* Multisite Networking. */
393 /**/
394 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
395 do_action ("ws_plugin__s2member_before_users_list_update_cols", get_defined_vars ());
396 unset ($__refs, $__v); /* Unset defined __refs, __v. */
397 /**/
398 $user = new WP_User ($user_id); /* We need both of these objects. $user and $current_user. */
399 $current_user = (is_user_logged_in ()) ? wp_get_current_user () : false; /* Current User. */
400 /**/
401 if (is_object ($user) && ($user_id = $user->ID) && is_object ($current_user) && $current_user->ID)
402 {
403 if (current_user_can ("edit_users") && (!is_multisite () || is_super_admin () || is_user_member_of_blog ($user_id)))
404 {
405 if (!empty ($_POST) && is_array ($_p = c_ws_plugin__s2member_utils_strings::trim_deep (stripslashes_deep ($_POST))))
406 {
407 $old_role = c_ws_plugin__s2member_user_access::user_access_role ($user);
408 $role = (isset ($_p["role"]) && $_p["role"] !== $old_role) ? $_p["role"] : $old_role;
409 $level = c_ws_plugin__s2member_user_access::user_access_role_to_level ($role);
410 /**/
411 $user->user_email = (isset ($_p["email"]) && is_email ($_p["email"]) && $_p["email"] !== $user->user_email) ? $_p["email"] : $user->user_email;
412 $user->first_name = (isset ($_p["first_name"]) && $_p["first_name"] !== $user->first_name) ? $_p["first_name"] : $user->first_name;
413 $user->last_name = (isset ($_p["last_name"]) && $_p["last_name"] !== $user->last_name) ? $_p["last_name"] : $user->last_name;
414 /**/
415 $auto_eot_time = (!empty ($_p["ws_plugin__s2member_profile_s2member_auto_eot_time"])) ? strtotime ($_p["ws_plugin__s2member_profile_s2member_auto_eot_time"]) : "";
416 /**/
417 if ($role !== $old_role) /* In this case, we need to fire a Hook on `ws_plugin__s2member_during_collective_mods`. */
418 do_action ("ws_plugin__s2member_during_collective_mods", $user_id, get_defined_vars (), "user-role-change", "modification", $role, $old_role, $user);
419 /**/
420 if (isset ($_p["ws_plugin__s2member_profile_s2member_originating_blog"]) && is_multisite () && is_super_admin ())
421 update_user_meta ($user_id, "s2member_originating_blog", $_p["ws_plugin__s2member_profile_s2member_originating_blog"]);
422 /**/
423 if (isset ($_p["ws_plugin__s2member_profile_s2member_subscr_gateway"]))
424 update_user_option ($user_id, "s2member_subscr_gateway", $_p["ws_plugin__s2member_profile_s2member_subscr_gateway"]);
425 /**/
426 if (isset ($_p["ws_plugin__s2member_profile_s2member_subscr_id"]))
427 update_user_option ($user_id, "s2member_subscr_id", $_p["ws_plugin__s2member_profile_s2member_subscr_id"]);
428 /**/
429 if (isset ($_p["ws_plugin__s2member_profile_s2member_custom"]))
430 update_user_option ($user_id, "s2member_custom", $_p["ws_plugin__s2member_profile_s2member_custom"]);
431 /**/
432 if (isset ($_p["ws_plugin__s2member_profile_s2member_registration_ip"]))
433 update_user_option ($user_id, "s2member_registration_ip", $_p["ws_plugin__s2member_profile_s2member_registration_ip"]);
434 /**/
435 if (isset ($_p["ws_plugin__s2member_profile_s2member_notes"]))
436 update_user_option ($user_id, "s2member_notes", $_p["ws_plugin__s2member_profile_s2member_notes"]);
437 /**/
438 if (isset ($_p["ws_plugin__s2member_profile_s2member_auto_eot_time"]) && isset ($auto_eot_time))
439 update_user_option ($user_id, "s2member_auto_eot_time", $auto_eot_time);
440 /**/
441 if (isset ($_p["ws_plugin__s2member_profile_s2member_ccaps"]))
442 {
443 foreach ($user->allcaps as $cap => $cap_enabled)
444 if (preg_match ("/^access_s2member_ccap_/", $cap))
445 $user->remove_cap ($ccap = $cap);
446 /**/
447 foreach (preg_split ("/[\r\n\t\s;,]+/", $_p["ws_plugin__s2member_profile_s2member_ccaps"]) as $ccap)
448 if (strlen ($ccap)) /* Don't add empty Capabilities. */
449 $user->add_cap ("access_s2member_ccap_" . trim (strtolower ($ccap)));
450 }
451 /**/
452 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
453 {
454 foreach (json_decode ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
455 {
456 $field_var = preg_replace ("/[^a-z0-9]/i", "_", strtolower ($field["id"]));
457 $field_id_class = preg_replace ("/_/", "-", $field_var);
458 /**/
459 if (isset ($_p["ws_plugin__s2member_profile_" . $field_var]))
460 {
461 if ((is_array ($_p["ws_plugin__s2member_profile_" . $field_var]) && !empty ($_p["ws_plugin__s2member_profile_" . $field_var])) || strlen ($_p["ws_plugin__s2member_profile_" . $field_var]))
462 $fields[$field_var] = $_p["ws_plugin__s2member_profile_" . $field_var];
463 else /* Else unset. */
464 unset($fields[$field_var]);
465 }
466 else /* Else ``unset()``. */
467 unset($fields[$field_var]);
468 }
469 }
470 /**/
471 if (!empty ($fields))
472 update_user_option ($user_id, "s2member_custom_fields", $fields);
473 else /* Else delete their Custom Fields? */
474 delete_user_option ($user_id, "s2member_custom_fields");
475 /**/
476 if ($level > 0) /* We ONLY process this if they are higher than Level #0. */
477 {
478 $pr_times = get_user_option ("s2member_paid_registration_times", $user_id);
479 $pr_times["level"] = (!$pr_times["level"]) ? time () : $pr_times["level"]; /* Preserve. */
480 $pr_times["level" . $level] = (!$pr_times["level" . $level]) ? time () : $pr_times["level" . $level];
481 update_user_option ($user_id, "s2member_paid_registration_times", $pr_times); /* Update now. */
482 }
483 /**/
484 if (!empty ($_p["ws_plugin__s2member_profile_opt_in"])) /* Should we process List Servers for this User? */
485 c_ws_plugin__s2member_list_servers::process_list_servers ($role, $level, $user->user_login, ((!empty ($_p["pass1"])) ? $_p["pass1"] : ""), $user->user_email, $user->first_name, $user->last_name, false, true, true, $user_id);
486 /**/
487 if (!empty ($_p["ws_plugin__s2member_profile_ip_restrictions"])) /* Delete/reset IP Restrictions? */
488 c_ws_plugin__s2member_ip_restrictions::delete_reset_specific_ip_restrictions (strtolower ($user->user_login));
489 /**/
490 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
491 do_action ("ws_plugin__s2member_during_users_list_update_cols", get_defined_vars ());
492 unset ($__refs, $__v); /* Unset defined __refs, __v. */
493 }
494 }
495 /**/
496 else if ($current_user->ID === $user->ID) /* Otherwise, a User can always edit their own Profile. */
497 {
498 if (!empty ($_POST) && is_array ($_p = c_ws_plugin__s2member_utils_strings::trim_deep (stripslashes_deep ($_POST))))
499 {
500 $role = c_ws_plugin__s2member_user_access::user_access_role ($user);
501 $level = c_ws_plugin__s2member_user_access::user_access_role_to_level ($role);
502 /**/
503 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
504 if ($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level ($level, "profile"))
505 {
506 $_existing_fields = get_user_option ("s2member_custom_fields", $user_id);
507 /**/
508 foreach (json_decode ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
509 {
510 $field_var = preg_replace ("/[^a-z0-9]/i", "_", strtolower ($field["id"]));
511 $field_id_class = preg_replace ("/_/", "-", $field_var);
512 /**/
513 if (!in_array ($field["id"], $fields_applicable) || preg_match ("/^no/", $field["editable"]))
514 {
515 if (isset ($_existing_fields[$field_var]) && ((is_array ($_existing_fields[$field_var]) && !empty ($_existing_fields[$field_var])) || strlen ($_existing_fields[$field_var])))
516 $fields[$field_var] = $_existing_fields[$field_var];
517 else /* Else unset. */
518 unset($fields[$field_var]);
519 }
520 else if ($field["required"] === "yes" && (!isset ($_p["ws_plugin__s2member_profile_" . $field_var]) || (is_array ($_p["ws_plugin__s2member_profile_" . $field_var]) && empty ($_p["ws_plugin__s2member_profile_" . $field_var])) || !strlen ($_p["ws_plugin__s2member_profile_" . $field_var])))
521 {
522 if (isset ($_existing_fields[$field_var]) && ((is_array ($_existing_fields[$field_var]) && !empty ($_existing_fields[$field_var])) || strlen ($_existing_fields[$field_var])))
523 $fields[$field_var] = $_existing_fields[$field_var];
524 else /* Else unset. */
525 unset($fields[$field_var]);
526 }
527 else if (isset ($_p["ws_plugin__s2member_profile_" . $field_var]))
528 {
529 if ((is_array ($_p["ws_plugin__s2member_profile_" . $field_var]) && !empty ($_p["ws_plugin__s2member_profile_" . $field_var])) || strlen ($_p["ws_plugin__s2member_profile_" . $field_var]))
530 $fields[$field_var] = $_p["ws_plugin__s2member_profile_" . $field_var];
531 else /* Else unset. */
532 unset($fields[$field_var]);
533 }
534 else /* Else ``unset()``. */
535 unset($fields[$field_var]);
536 }
537 /**/
538 if (!empty ($fields))
539 update_user_option ($user_id, "s2member_custom_fields", $fields);
540 else /* Else delete their Custom Fields? */
541 delete_user_option ($user_id, "s2member_custom_fields");
542 }
543 /**/
544 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
545 do_action ("ws_plugin__s2member_during_users_list_update_cols", get_defined_vars ());
546 unset ($__refs, $__v); /* Unset defined __refs, __v. */
547 }
548 }
549 }
550 /**/
551 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
552 do_action ("ws_plugin__s2member_after_users_list_update_cols", get_defined_vars ());
553 unset ($__refs, $__v); /* Unset defined __refs, __v. */
554 /**/
555 return; /* Return for uniformity. */
556 }
557 }
558 }
559 ?>