PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 260814
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v260814
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 / src / includes / classes / users-list.inc.php

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

323 lines 14.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // @codingStandardsIgnoreFile
3 /**
4 * Users list.
5 *
6 * Copyright: © 2009-2011
7 * {@link http://websharks-inc.com/ WebSharks, Inc.}
8 * (coded in the USA)
9 *
10 * Released under the terms of the GNU General Public License.
11 * You should have received a copy of the GNU General Public License,
12 * along with this software. In the main directory, see: /licensing/
13 * If not, see: {@link http://www.gnu.org/licenses/}.
14 *
15 * @package s2Member\Users_List
16 * @since 3.5
17 */
18 if(!defined('WPINC')) // MUST have WordPress.
19 exit ("Do not access this file directly.");
20
21 if(!class_exists("c_ws_plugin__s2member_users_list"))
22 {
23 /**
24 * Users list.
25 *
26 * @package s2Member\Users_List
27 * @since 3.5
28 */
29 class c_ws_plugin__s2member_users_list
30 {
31 /**
32 * Adds Custom Fields to the admin Profile editing page.
33 *
34 * @package s2Member\Users_List
35 * @since 3.5
36 *
37 * @attaches-to ``add_action("edit_user_profile");``
38 * @attaches-to ``add_action("show_user_profile");``
39 *
40 * @param WP_User $user Expects a `WP_User` object passed in by the Action Hook.
41 */
42 public static function users_list_edit_cols($user = NULL)
43 {
44 c_ws_plugin__s2member_users_list_in::users_list_edit_cols($user);
45 }
46
47 /**
48 * Saves Custom Fields after an admin updates Profile.
49 *
50 * @package s2Member\Users_List
51 * @since 3.5
52 *
53 * @attaches-to ``add_action("edit_user_profile_update");``
54 * @attaches-to ``add_action("personal_options_update");``
55 *
56 * @param int|string $user_id Expects a numeric WordPress User ID passed in by the Action Hook.
57 */
58 public static function users_list_update_cols($user_id = NULL)
59 {
60 return c_ws_plugin__s2member_users_list_in::users_list_update_cols($user_id);
61 }
62
63 /**
64 * Modifies the search query.
65 *
66 * Affects searches performed in the list of Users.
67 *
68 * @package s2Member\Users_List
69 * @since 3.5
70 *
71 * @attaches-to ``add_action("pre_user_query");``
72 *
73 * @param WP_User_Query $query Expects a `WP_User_Query` object, by reference.
74 */
75 public static function users_list_query(&$query = NULL)
76 {
77 global $wpdb;
78 /** @var $wpdb wpdb */
79
80 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
81 do_action("ws_plugin__s2member_before_users_list_search", get_defined_vars());
82 unset($__refs, $__v);
83
84 if(is_admin() && !empty($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'users.php')
85 if(isset ($query->query_vars) && !is_network_admin()) // NOT in Network admin panels.
86 if(is_array($qv = $query->query_vars) && ($s = trim($qv["search"], "* \t\n\r\0\x0B")) && ($s = "%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape($s))."%"))
87 {
88 $query->query_fields = "SQL_CALC_FOUND_ROWS DISTINCT(`".$wpdb->users."`.`ID`)";
89 $query->query_from = " FROM `".$wpdb->users."`, `".$wpdb->usermeta."`"; // Include meta table also.
90 $query->query_where = " WHERE `".$wpdb->users."`.`ID` = `".$wpdb->usermeta."`.`user_id`"; // Join w/ meta table.
91 $query->query_where .= " AND (".apply_filters("ws_plugin__s2member_before_users_list_search_where_or_before", "", get_defined_vars());
92 $query->query_where .= " (`".$wpdb->users."`.`user_login` LIKE '".$s."' OR `".$wpdb->users."`.`user_nicename` LIKE '".$s."' OR `".$wpdb->users."`.`display_name` LIKE '".$s."' OR `".$wpdb->users."`.`user_email` LIKE '".$s."' OR `".$wpdb->users."`.`user_url` LIKE '".$s."')";
93 $query->query_where .= " OR ((`".$wpdb->usermeta."`.`meta_key` = 'first_name' OR `".$wpdb->usermeta."`.`meta_key` = 'last_name') AND `".$wpdb->usermeta."`.`meta_value` LIKE '".$s."')";
94 $query->query_where .= " OR (`".$wpdb->usermeta."`.`meta_key` = '".$wpdb->base_prefix."s2member_subscr_id' AND `".$wpdb->usermeta."`.`meta_value` LIKE '".$s."')";
95 $query->query_where .= " OR (`".$wpdb->usermeta."`.`meta_key` = '".$wpdb->base_prefix."s2member_custom' AND `".$wpdb->usermeta."`.`meta_value` LIKE '".$s."')";
96 $query->query_where .= " OR (`".$wpdb->usermeta."`.`meta_key` = '".$wpdb->base_prefix."s2member_custom_fields' AND `".$wpdb->usermeta."`.`meta_value` LIKE '".$s."')";
97 if(apply_filters("ws_plugin__s2member_users_list_search_admin_notes", FALSE, get_defined_vars())) // Off by default; this can get very slow on large sites.
98 $query->query_where .= " OR (`".$wpdb->usermeta."`.`meta_key` = '".$wpdb->base_prefix."s2member_notes' AND `".$wpdb->usermeta."`.`meta_value` LIKE '".$s."')";
99 $query->query_where .= apply_filters("ws_plugin__s2member_before_users_list_search_where_or_after", "", get_defined_vars()).")"; // Leaving room for additional searches here.
100
101 if(is_multisite()) // On a Multisite Network we need to make sure we're searching only users w/ capabilities on this blog.
102 $query->query_where .= " AND `".$wpdb->users."`.`ID` IN(SELECT DISTINCT(`user_id`) FROM `".$wpdb->usermeta."` WHERE `meta_key` = '".$wpdb->prefix."capabilities')";
103
104 $query->query_from = apply_filters("ws_plugin__s2member_before_users_list_search_from", $query->query_from, get_defined_vars());
105 $query->query_where = apply_filters("ws_plugin__s2member_before_users_list_search_where", $query->query_where, get_defined_vars());
106 }
107 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
108 do_action("ws_plugin__s2member_after_users_list_search", get_defined_vars());
109 unset($__refs, $__v);
110 }
111
112 /**
113 * Adds columns to the list of Users.
114 *
115 * @package s2Member\Users_List
116 * @since 3.5
117 *
118 * @attaches-to ``add_filter ("manage_users_columns");``
119 *
120 * @param array $cols Expects an array of columns to be passed through by the Filter.
121 *
122 * @return array Array of columns, merged with columns introduced by this routine.
123 */
124 public static function users_list_cols($cols = array())
125 {
126 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
127 do_action("ws_plugin__s2member_before_users_list_cols", get_defined_vars());
128 unset($__refs, $__v);
129
130 $cols["s2member_registration_time"] = "Registration Date";
131
132 if(apply_filters("ws_plugin__s2member_users_list_cols_display_paid_registration_times", FALSE))
133 $cols["s2member_paid_registration_times"] = "Paid Registr. Date";
134
135 $cols["s2member_subscr_id"] = "Paid Subscr. ID";
136
137 if(!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site())
138 $cols["s2member_ccaps"] = "Custom Capabilities";
139
140 $cols["s2member_auto_eot_time"] = "EOT Time";
141
142 if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
143 foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], TRUE) as $field)
144 {
145 $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
146 $field_id_class = preg_replace("/_/", "-", $field_var);
147
148 $field_title = ucwords(preg_replace("/_/", " ", $field_var));
149 $cols["s2member_custom_field_".$field_var] = $field_title;
150 }
151
152 $cols["s2member_login_counter"] = "# Of Logins";
153 $cols["s2member_last_login_time"] = "Last Login Time";
154
155 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
156 do_action("ws_plugin__s2member_during_users_list_cols", get_defined_vars());
157 unset($__refs, $__v);
158
159 return apply_filters("ws_plugin__s2member_users_list_cols", $cols, get_defined_vars());
160 }
161
162 /**
163 * Displays column data in the row of details.
164 *
165 * @package s2Member\Users_List
166 * @since 3.5
167 *
168 * @attaches-to ``add_filter ("manage_users_custom_column");``
169 *
170 * @param string $val A value for this column, passed through by the Filter.
171 * @param string $col The name of the column for which we might need to supply data for.
172 * @param int|string $user_id Expects a WordPress User ID, passed through by the Filter.
173 *
174 * @return string A column value introduced by this routine, or existing value, or, if empty, a dash.
175 */
176 public static function users_list_display_cols($val = '', $col = '', $user_id = '')
177 {
178 static $user, $last_user_id; // Used internally for optimization.
179 static $fields, $last_fields_id; // Used for optimization.
180
181 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
182 do_action("ws_plugin__s2member_before_users_list_display_cols", get_defined_vars());
183 unset($__refs, $__v);
184
185 $user = (is_object($user) && $user_id === $last_user_id) ? $user : new WP_User ($user_id);
186
187 if($col === "s2member_registration_time")
188 $val = (($time = strtotime(get_date_from_gmt($user->user_registered)))) ? esc_html(date("D M jS, Y", $time)).'<br /><small>@ precisely '.esc_html(date("g:i a", $time)).'</small>' : "";
189
190 else if($col === "s2member_paid_registration_times")
191 {
192 $val = ""; // Initialize $val before we begin.
193 if(is_array($v = get_user_option("s2member_paid_registration_times", $user_id)))
194 foreach($v as $level => $time) // Go through each Paid Registration Time.
195 {
196 $time = strtotime(get_date_from_gmt(date("Y-m-d H:i:s", $time)));
197
198 if($level === "level") // First Payment Time, regardless of Level.
199 $val .= (($val) ? "<br />" : "").'<span title="'.esc_attr(date("D M jS, Y", $time)).' @ precisely '.esc_attr(date("g:i a", $time)).'">'.esc_html(date("D M jS, Y", $time)).'</span>';
200 else if(preg_match("/^level([0-9]+)$/i", $level) && ($level = preg_replace("/^level/", "", $level)))
201 $val .= (($val) ? "<br />" : "").'<small><em>@Level '.esc_html($level).': <span title="'.esc_attr(date("D M jS, Y", $time)).' @ precisely '.esc_attr(date("g:i a", $time)).'">'.esc_html(date("D M jS, Y", $time)).'</span></em></small>';
202 }
203 }
204 else if($col === "s2member_subscr_id")
205 $val = ($v = get_user_option("s2member_subscr_id", $user_id)) ? esc_html($v) : "";
206
207 else if($col === "s2member_ccaps") // Custom Capabilities.
208 {
209 foreach($user->allcaps as $cap => $cap_enabled)
210 if(preg_match("/^access_s2member_ccap_/", $cap))
211 $ccaps[] = preg_replace("/^access_s2member_ccap_/", "", $cap);
212
213 $val = (!empty($ccaps)) ? implode("<br />", $ccaps) : "";
214 }
215 else if($col === "s2member_auto_eot_time")
216 $val = ($v = get_user_option("s2member_auto_eot_time", $user_id)) ? date("D M jS, Y", (integer)$v)."<br /><small>@ precisely ".date("g:i a", (integer)$v)."</small>" : "";
217
218 else if(preg_match("/^s2member_custom_field_/", $col))
219 {
220 if(!$last_fields_id || $last_fields_id !== $user_id)
221 $fields = get_user_option("s2member_custom_fields", $user_id);
222
223 $field_var = preg_replace("/^s2member_custom_field_/", "", $col);
224
225 if(isset ($fields[$field_var]) && is_string($fields[$field_var]) && preg_match("/^http(s?)\:/i", $fields[$field_var]))
226 $val = '<a href="'.esc_attr($fields[$field_var]).'" target="_blank">'.esc_html(substr($fields[$field_var], strpos($fields[$field_var], ":") + 3, 25)."...").'</a>';
227
228 else if(isset ($fields[$field_var]) && is_array($fields[$field_var]) && !empty($fields[$field_var]))
229 $val = preg_replace("/-\|br\|-/", "<br />", esc_html(implode("-|br|-", $fields[$field_var])));
230
231 else if(isset ($fields[$field_var]) && is_string($fields[$field_var]) && strlen($fields[$field_var]))
232 $val = esc_html($fields[$field_var]);
233
234 $last_fields_id = $user_id; // Record this.
235 }
236 else if($col === "s2member_login_counter")
237 $val = ($v = get_user_option("s2member_login_counter", $user_id)) ? esc_html($v) : "";
238
239 else if($col === "s2member_last_login_time")
240 {
241 if(($time = get_user_option("s2member_last_login_time", $user_id)))
242 {
243 $time = strtotime(get_date_from_gmt(date("Y-m-d H:i:s", $time)));
244 $val = esc_html(date("D M jS, Y", $time)).'<br /><small>@ precisely '.esc_html(date("g:i a", $time)).'</small>';
245 }
246 else $val = ""; // Not applicable (we've never recorded them logging into the site).
247 }
248 $last_user_id = $user_id; // Record this for internal optimizations.
249
250 return apply_filters("ws_plugin__s2member_users_list_display_cols", ((strlen((string) $val)) ? $val : ""), get_defined_vars());
251 }
252
253 /**
254 * Tells WordPress certain fields s2Member adds are sortable
255 *
256 * @package s2Member\Users_List
257 * @since 140518
258 *
259 * @attaches-to ``add_filter ("manage_users_sortable_columns");``
260 *
261 * @param array $columns An array of sortable user list columns.
262 *
263 * @return array The input array after having been filtered here.
264 */
265 public static function users_list_add_sortable($columns = array())
266 {
267 if(!empty($_REQUEST['s']))
268 return $columns;
269
270 $columns['s2member_registration_time'] = 's2member_registration_time';
271 $columns['s2member_subscr_id'] = 's2member_subscr_id';
272 $columns['s2member_auto_eot_time'] = 's2member_auto_eot_time';
273 $columns['s2member_login_counter'] = 's2member_login_counter';
274 $columns['s2member_last_login_time'] = 's2member_last_login_time';
275
276 return $columns;
277 }
278
279 /**
280 * Alters WP_Query object to make custom columns sortable
281 *
282 * @package s2Member\Users_List
283 * @since 140518
284 *
285 * @attaches-to ``add_filter ("pre_user_query");``
286 *
287 * @param WP_User_Query $query `WP_Query` Object passed from WordPress
288 */
289 public static function users_list_make_sortable($query)
290 {
291 if(!is_admin()
292 || empty($GLOBALS['pagenow']) || $GLOBALS['pagenow'] !== 'users.php'
293 || !isset ($query->query_vars) || !empty($_REQUEST['s'])
294 ) return;
295
296 global $wpdb;
297 /** @var $wpdb wpdb */
298 $vars = $query->query_vars;
299
300 switch($vars['orderby'])
301 {
302 // This isn't a usermeta value, so we don't need to `LEFT JOIN` here.
303 case 's2member_registration_time':
304 $query->query_orderby = "ORDER BY CAST(`user_registered` AS UNSIGNED) ".$vars['order'];
305 break;
306
307 // s2Member Subscription ID can contain non-integer characters. We don't `CAST` this value as `UNSIGNED`
308 case 's2member_subscr_id':
309 $query->query_from .= " LEFT JOIN `".$wpdb->usermeta."` `___m` ON (`".$wpdb->users."`.`ID` = `___m`.`user_id` AND `___m`.`meta_key` = '".esc_sql($wpdb->prefix.$vars['orderby'])."')";
310 $query->query_orderby = "ORDER BY `___m`.`meta_value` ".$vars['order'];
311 break;
312
313 case 's2member_auto_eot_time':
314 case 's2member_login_counter':
315 case 's2member_last_login_time':
316 $query->query_from .= " LEFT JOIN `".$wpdb->usermeta."` `___m` ON (`".$wpdb->users."`.`ID` = `___m`.`user_id` AND `___m`.`meta_key` = '".esc_sql($wpdb->prefix.$vars['orderby'])."')";
317 $query->query_orderby = "ORDER BY CAST(`___m`.`meta_value` AS UNSIGNED) ".$vars['order'];
318 break;
319 }
320 }
321 }
322 }
323