function amr_get_alluserdata($list) { /* get all user data and attempt to extract out any object values into arrays for listing */ global $excluded_nicenames, $amain, $aopt, $orig_mk, $amr_current_list; $amr_current_list = $list; $main_fields = amr_get_usermasterfields(); // mainwpuser fields less any excluded in nice names // maybe use, but no major improvement for normal usage add_filter( 'pre_user_query', 'amr_add_where'); if (!($orig_mk = ausers_get_option('amr-users-original-keys'))) { $orig_mk = array(); } // // track_progress ('Meta fields we could use to improve selection: '.print_r($orig_mk, true)); $combofields = amr_get_combo_fields($list); $role = ''; $mkeys = array(); if (!empty($aopt['list'][$list]['included'])) { // if we have fields that are in main user table, we could add - but unliket as selection criteria - more in search foreach ($aopt['list'][$list]['included'] as $newk => $choose) { if (isset($orig_mk[$newk])) { $keys[$orig_mk[$newk]] = true; } if ($newk == 'first_role') { if (is_array($choose)) { $role = array_pop($choose); } else { $role = $choose; } } if (isset($orig_mk[$newk]) and $newk == $orig_mk[$newk]) { // ie it is an original meta field if (is_array($choose)) { if (count($choose) == 1) { $choose = array_pop($choose); $compare = '='; } else { $compare = 'IN'; } } else { $compare = '='; } $meta_query[] = array('key' => $newk, 'value' => $choose, 'compare' => $compare); } } } // now try for exclusions if (!empty($aopt['list'][$list]['excluded'])) { foreach ($aopt['list'][$list]['excluded'] as $newk => $choose) { if (isset($orig_mk[$newk])) { $keys[$orig_mk[$newk]] = true; // we need to fetch a meta value if ($newk == $orig_mk[$newk]) { // ie it is an original meta field 1 to 1 if (is_array($choose)) { if (count($choose) == 1) { $choose = array_pop($choose); $compare = '!='; } else { $compare = 'NOT IN'; } } else { $compare = '!='; } $meta_query[] = array('key' => $newk, 'value' => $choose, 'compare' => $compare); } } } // end for each } // now need to make sure we find all the meta keys we need foreach (array('selected', 'excludeifblank', 'includeonlyifblank', 'sortby') as $v) { if (!empty($aopt['list'][$list][$v])) { foreach ($aopt['list'][$list][$v] as $newk => $choose) { if (isset($orig_mk[$newk])) { // ie it is FROM an original meta field $keys[$orig_mk[$newk]] = true; } } } } if (!empty($aopt['list'][$list]['grouping'])) { foreach ($aopt['list'][$list]['grouping'] as $i => $newk) { if (isset($orig_mk[$newk])) { // ie it is FROM an original meta field $keys[$orig_mk[$newk]] = true; } } } $args = array(); $users = array(); // to handle in weird situation of no users - eg if db corrupt! if (!empty($role)) { $args['role'] = $role; } if (!empty($meta_query)) { $args['meta_query'] = $meta_query; } //if (!empty ($fields) ) $args['fields'] = $fields; //$args['fields'] = 'all_with_meta'; //might be too huge , but fast - DOES NOT GET META DATA ?? and/or only gets single values //track_progress ('Simple meta selections to pass to query: '.print_r($args, true)); if (is_network_admin() or amr_is_network_admin()) { //if (WP_DEBUG) {echo '<br/>';if (is_network_admin()) echo 'network admin'; else echo 'NOT network admin but treating as is';} $args['blog_id'] = '0'; } if (isset($amain['use_wp_query'])) { //hmm always doing this $all = get_users($args); // later - add selection if possible here to reduce memory requirements //if (WP_DEBUG) {echo '<br/>Fetched with wordpress query. No. of records found: <b>'.count($all).'</b><br /> using args: '; var_dump($args); } } else { //if (WP_DEBUG) echo '<br/>if WP_DEBUG: Fetching with own query '; $all = amru_get_users($args); // later - add selection if possible here to reduce memory requirements //if (WP_DEBUG) {echo '<br/>Fetched with own query. No. of records found: <b>'.count($all).'</b><br /> using args: '; var_dump($args); } } //track_progress('after get wp users, we have '.count($all)); foreach ($all as $i => $userobj) { // build our user array and add any missing meta // save the main data, toss the rest foreach ($main_fields as $i2 => $v2) { //$users[$i][$v2] = $userobj->$v2; if (!empty($userobj->{$v2})) { $users[$userobj->ID][$v2] = $userobj->{$v2}; } //OBJECT_K does not always seem to key the array correctly } // ------------------------------------------------------------------- // we just need to expand the meta data if (!empty($keys)) { // - the list of metadata keys. If we have some meta data requested, and most of the time we will foreach ($keys as $i2 => $v2) { //if (!isset($userobj->$i2)) { // in some versions the overloading does not work - only fetches 1 //$userobj->$i2 = get_user_meta($userobj->ID, $i2, false); //wordpress does some kind of overloading to fetch meta data BUT above only fetches single $test = get_user_meta($userobj->ID, $i2, false); // get as array in case there are multiple values if (!empty($test)) { //if (WP_DEBUG) echo 'i2='.$i2;var_dump($test); if (is_array($test)) { // because we are now checking for multiple values so it returns an array if (count($test) == 1) { // one record, single value returned $temp = current($test); // there is only one - get it without taking it out of array //$temp = array_pop($test); // get that one record //if (WP_DEBUG) {var_dump($temp);} // oh dear next code broke those nasty complex s2membercustom fields // but it's the way to deal with non associative arrays if (is_array($temp)) { // if that one record is an array - hope to hell that's the end of the nested arrays, but now it wont be if (!amr_is_assoc($temp)) { // if it is a numeric keyed array, cannot handle as per associative array // ideally no spaces here BUT if there is no custom formatting routine to explode and re-implode, then folks complain about lack of space between. NB Check impact on filter values. (explode with spaces perhaps?) //$temp = implode (',',$temp); // 20140305 space sinformatting only - not here $temp = implode(', ', $temp); // must be a list of values ? implode here or later? // or should we force it into a mulit meta array ? } // else leave as is for further processing //else var_dump($temp); } $userobj->{$i2} = $temp; // save it as our value //$userobj->$i2 = array_pop($test); // cannot indirectly update an overloaded value //if (WP_DEBUG) {echo '<br />save obj: ';var_dump($userobj->$i2);} } else { // we got multple meta records - ASSUME for now it is a good implementation and the values are 'simple' // otherwise they really should create their meta data a better way. Can't solve everyones problems. $userobj->{$i2} = implode(', ', $test); } } else { $userobj->{$i2} = $test; } $temp = maybe_unserialize($userobj->{$i2}); // in case anyone done anything weird //gravity forms has weird serialised nested array - argghh $temp = objectToArray($temp); /* must do all so can cope with incomplete objects eg: if the creating plugin has been uninstalled*/ $key = str_replace(' ', '_', $i2); /* html does not like spaces in the names*/ if (is_array($temp)) { if (count($temp) == 1) { // one record, single value returned - will fix that annoying gravity form emergency contact thing // oh dear but broke the single capability thing if (!current($temp) == true and !current($temp) == '1') { // ie not a capability thing $temp = array_pop($temp); } // its a usable value and } } if (is_array($temp)) { // if it is still an array inside //if (WP_DEBUG) {echo '<br/>Got an array'; var_dump($temp);} foreach ($temp as $i3 => $v3) { $key = $i2 . '-' . str_replace(' ', '_', $i3); /* html does not like spaces in the names*/ //if (WP_DEBUG) {echo '<br/>Got an array - key'; var_dump($key);} if (is_array($v3)) { //if (WP_DEBUG) {echo '<br/>Got an nested array'; } // code just in case another plugin nests deeper, until we know tehre is one, let us be more efficient if (amr_is_assoc($v3)) { // does not yet handle, just dump values for now // really shouldn't be nested this deep associativey - bad $users[$i][$key] = implode(", ", $v3); //if (WP_DEBUG) {echo '<br/>Got associative array:'.$i2.' '.$i3; var_dump($users[$i][$key]);} } else { // is numeric array eg s2member custom multi choice $users[$userobj->ID][$key] = implode(", ", $v3); } } else { $users[$userobj->ID][$key] = $v3; } } } else { $users[$userobj->ID][$key] = $temp; //if (WP_DEBUG) {echo '<br/>Not an array'; var_dump($temp);} } unset($temp); // we could add some include / exclude checking here? //if (WP_DEBUG) var_dump($users[$userobj->ID]); } } /// end for each keys } // unset($all[$i]); } // end for each all unset($all); $users = apply_filters('amr_get_users', $users); // allow addition or removal of normal wp users who will have userid, and /or any other data //track_progress('after get users meta check '.(count($users))); $post_types = get_post_types(); /* get the extra count data */ if (amr_need_the_field($list, 'comment_count')) { $c = get_commentnumbers_by_author(); } else { $c = array(); } //track_progress('after get comments check'); if (!empty($users)) { foreach ($users as $iu => $u) { // do the comments if (isset($u['ID']) and isset($c[$u['ID']])) { $users[$iu]['comment_count'] = $c[$u['ID']]++; /*** would like to cope with situation of no userid, but awkward here */ } // do the post counts foreach ($post_types as $post_type) { if (amr_need_the_field($list, $post_type . '_count')) { $users[$iu][$post_type . '_count'] = amr_count_user_posts($u['ID'], $post_type); // if ()WP_DEBUG) echo '<br />**'.$post_type.' '.$list[$iu][$post_type.'_count']; // $list[$iu]['post_count'] = get_usernumposts($u['ID']); /* wordpress function */ if ($users[$iu][$post_type . '_count'] == 0) { unset($users[$iu][$post_type . '_count']); } } } if (amr_need_the_field($list, 'first_role')) { $user_object = new WP_User($u['ID']); if (!empty($user_object->roles)) { $users[$iu]['first_role'] = amr_which_role($user_object); } if (empty($users[$iu]['first_role'])) { unset($users[$iu]['first_role']); } } } } //track_progress('after post types and roles:'.count($users)); unset($c); $users = apply_filters('amr_get_users_with_meta', $users); // allow addition of users from other tables with own meta data //track_progress('after user filter, have'.count($users)); if (empty($users)) { return false; } return $users; }
function amr_get_alluserdata($list) { /* get all user data and attempt to extract out any object values into arrays for listing */ global $excluded_nicenames, $amain, $aopt, $orig_mk, $amr_current_list; $amr_current_list = $list; $main_fields = amr_get_usermasterfields(); // mainwpuser fields less any excluded in nice names // maybe use, but no major improvement for normal usage add_filter( 'pre_user_query', 'amr_add_where'); if (!($orig_mk = ausers_get_option('amr-users-original-keys'))) { $orig_mk = array(); } // // track_progress ('Meta fields we could use to improve selection: '.print_r($orig_mk, true)); $combofields = amr_get_combo_fields($list); $role = ''; $mkeys = array(); if (!empty($aopt['list'][$list]['included'])) { // if we have fields that are in main user table, we could add - but unliket as selection criateria - more in search foreach ($aopt['list'][$list]['included'] as $newk => $choose) { if (isset($orig_mk[$newk])) { $keys[$orig_mk[$newk]] = true; } if ($newk == 'first_role') { if (is_array($choose)) { $role = array_pop($choose); } else { $role = $choose; } } if (isset($orig_mk[$newk]) and $newk == $orig_mk[$newk]) { // ie it is an original meta field if (is_array($choose)) { if (count($choose) == 1) { $choose = array_pop($choose); $compare = '='; } else { $compare = 'IN'; } } else { $compare = '='; } $meta_query[] = array('key' => $newk, 'value' => $choose, 'compare' => $compare); } } } // now try for exclusions if (!empty($aopt['list'][$list]['excluded'])) { foreach ($aopt['list'][$list]['excluded'] as $newk => $choose) { if (isset($orig_mk[$newk])) { $keys[$orig_mk[$newk]] = true; // we need to fetch a meta value if ($newk == $orig_mk[$newk]) { // ie it is an original meta field 1 to 1 if (is_array($choose)) { if (count($choose) == 1) { $choose = array_pop($choose); $compare = '!='; } else { $compare = 'NOT IN'; } } else { $compare = '!='; } $meta_query[] = array('key' => $newk, 'value' => $choose, 'compare' => $compare); } } } // end for each } // now need to make sure we find all the meta keys we need foreach (array('selected', 'excludeifblank', 'includeifblank', 'sortby') as $v) { if (!empty($aopt['list'][$list][$v])) { foreach ($aopt['list'][$list][$v] as $newk => $choose) { if (isset($orig_mk[$newk])) { // ie it is FROM an original meta field $keys[$orig_mk[$newk]] = true; } } } } if (!empty($aopt['list'][$list]['grouping'])) { foreach ($aopt['list'][$list]['grouping'] as $i => $newk) { if (isset($orig_mk[$newk])) { // ie it is FROM an original meta field $keys[$orig_mk[$newk]] = true; } } } $args = array(); if (!empty($role)) { $args['role'] = $role; } if (!empty($meta_query)) { $args['meta_query'] = $meta_query; } //if (!empty ($fields) ) $args['fields'] = $fields; //$args['fields'] = 'all_with_meta'; //might be too huge , but fast - DOES NOT GET META DATA ?? and/or only gets single values //track_progress ('Simple meta selections to pass to query: '.print_r($args, true)); if (is_network_admin() or amr_is_network_admin()) { //if (WP_DEBUG) {echo '<br/>';if (is_network_admin()) echo 'network admin'; else echo 'NOT network admin but treating as is';} $args['blog_id'] = '0'; } if (isset($amain['use_wp_query'])) { $all = get_users($args); // later - add selection if possible here to reduce memory requirements if (WP_DEBUG) { echo '<br/>Fetched with wordpress query '; } } else { if (WP_DEBUG) { echo '<br/>if WP_DEBUG: Fetching with own query '; } $all = amru_get_users($args); // later - add selection if possible here to reduce memory requirements } //track_progress('after get wp users, we have '.count($all)); foreach ($all as $i => $userobj) { // build our user array and add any missing meta // save the main data, toss the rest foreach ($main_fields as $i2 => $v2) { //$users[$i][$v2] = $userobj->$v2; if (!empty($userobj->{$v2})) { $users[$userobj->ID][$v2] = $userobj->{$v2}; } //OBJECT_K does not always seem to key the array correctly } // we just need to expand the meta data if (!empty($keys)) { // if some meta request foreach ($keys as $i2 => $v2) { //if (WP_DEBUG) {echo '<br /> Key:'.$i2;} //if (!isset($userobj->$i2)) { // in some versions the overloading does not work - only fetches 1 //$userobj->$i2 = get_user_meta($userobj->ID, $i2, false); //wordpress does some kind of overloading to fetch meta data BUT above only fetches single // $userobj->$i2 = get_user_meta($userobj->ID, $i2, false); // get as array in case there are multiple values $test = get_user_meta($userobj->ID, $i2, false); // get as array in case there are multiple values if (!empty($test)) { if (is_array($test)) { if (count($test) == 1) { // single value returned $userobj->{$i2} = array_pop($test); // cannot indirectly update an overloaded value //if (WP_DEBUG) {echo '<br /> convert array to 1 value '.$i2.' ='; var_dump($userobj->$i2);} } else { // we got multple meta records - ASSUME for now it is a good implementation and the values are 'simple' $userobj->{$i2} = implode(',', $test); //if (WP_DEBUG) {echo '<br /> convert array to strings for display '.$i2.' ='; var_dump($userobj->$i2);} } } else { $userobj->{$i2} = $test; } $temp = maybe_unserialize($userobj->{$i2}); // in case anyone done anything weird $temp = objectToArray($temp); /* must do all so can cope with incomplete objects eg: if creatingplugin has been uninstalled*/ $key = str_replace(' ', '_', $i2); /* html does not like spaces in the names*/ if (is_array($temp)) { //if (WP_DEBUG) echo '<br/>It is an array now - maybe was object'; foreach ($temp as $i3 => $v3) { $key = $i2 . '-' . str_replace(' ', '_', $i3); /* html does not like spaces in the names*/ if (is_array($v3)) { // code just in case another plugin nests deeper, until we know tehre is one, let us be more efficient // if (amr_is_assoc($v3)) { // does not yet handle, just dump values for now // $users[$i][$key] = implode(", ", $v3); // } // else { // is numeric array eg s2member custom multi choice $users[$userobj->ID][$key] = implode(", ", $v3); // } } else { $users[$userobj->ID][$key] = $v3; } } } else { $users[$userobj->ID][$key] = $temp; //if (WP_DEBUG) {echo '<br/>Not an array'; var_dump($temp);} } unset($temp); // we could add some include / exclude checking here? } } /// end for each keys } // unset($all[$i]); } // end for each all unset($all); $users = apply_filters('amr_get_users', $users); // allow addition or removal of normal wp users who will have userid, and /or any other data //track_progress('after get users meta check '.(count($users))); $post_types = get_post_types(); /* get the extra count data */ if (amr_need_the_field($list, 'comment_count')) { $c = get_commentnumbers_by_author(); } else { $c = array(); } //track_progress('after get comments check'); if (!empty($users)) { foreach ($users as $iu => $u) { // do the comments //if (WP_DEBUG) {echo '<br />user='******'ID']])) { $users[$iu]['comment_count'] = $c[$u['ID']]; /*** would like to cope with situation of no userid */ } // do the post counts foreach ($post_types as $post_type) { if (amr_need_the_field($list, $post_type . '_count')) { $users[$iu][$post_type . '_count'] = amr_count_user_posts($u['ID'], $post_type); // if ()WP_DEBUG) echo '<br />**'.$post_type.' '.$list[$iu][$post_type.'_count']; // $list[$iu]['post_count'] = get_usernumposts($u['ID']); /* wordpress function */ if ($users[$iu][$post_type . '_count'] == 0) { unset($users[$iu][$post_type . '_count']); } } } if (amr_need_the_field($list, 'first_role')) { $user_object = new WP_User($u['ID']); if (!empty($user_object->roles)) { $users[$iu]['first_role'] = amr_which_role($user_object); } if (empty($users[$iu]['first_role'])) { unset($users[$iu]['first_role']); } } } } //track_progress('after post types and roles:'.count($users)); unset($c); $users = apply_filters('amr_get_users_with_meta', $users); // allow addition of users from other tables with own meta data //track_progress('after user filter, have'.count($users)); if (empty($users)) { return false; } return $users; }