get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" ); return apply_filters('get_usernumposts', $count, $userid); } function amr_allow_count () { //used to allow the counting function to cost posts return ('read_private_posts'); //will allows us to count the taxonmies then } function amr_need_the_field($ulist,$field) { global $aopt; $l = $aopt['list'][$ulist]; /* *get the config */ if ((isset ($l['selected'][$field])) or (isset ($l['included'][$field])) or (isset ($l['excluded'][$field])) or (isset ($l['includeonlyifblank'][$field])) or (isset ($l['excludeifblank'][$field])) or (isset ($l['sortby'][$field])) or ($field == 'ID') or // always need the id ($field == 'index') or (isset ($l['grouping'][1]) and ($l['grouping'][1] == $field)) ) { return true; } else return false; } function amr_rptid ($ulist) { if ($ulist < 10) $rptid = 'user-0'.$ulist; else $rptid = 'user-'.$ulist; return $rptid; } function amr_check_use_transient ($ulist, $options) { // may no longer need if removing trasient html 20170906 global $post; if (is_admin() ) return false; if (!amr_first_showing ()) // can only use transient if no dynamic filters, no search, no sort, nothing special happening return false; if (!empty($post) ) {//we are in a page, BUT might be widget if (!empty($options['widget'])) // not in our widget anyway return ($ulist); // just use the ulist for the transient else return ($ulist.'-'.$post->ID); // since we can now pass shortcode parameters, the html can differ per page for same list } return ($ulist); } function amr_first_showing() { // use GET not REQUEST to be sure it is dynamic input ? if ((!isset($_REQUEST['filter'])) and (!isset($_REQUEST['su'])) and (!isset($_REQUEST['clear_filtering'])) and (!isset($_REQUEST['listpage'])) and (!isset($_REQUEST['rows_per_page'])) and (!isset($_REQUEST['refresh'] ))and (!isset($_REQUEST['dir'])) and (!isset($_REQUEST['sort'])) ) return true; // ie then we can try using the transient else { return false; } } function amr_undo_csv (&$value) { // for front end display // for historical reasons, cached data stored in csv format // until this is revised, we need to uncsv some values // eg those with double double quotes $value = str_replace('""', '"', $value); } function amr_get_lines_to_array ( $c, $rptid, $start, $rows, $icols, /* the controlling array */ $shuffle=false ) { if (!empty($_REQUEST['su'])) { // check for search request $s = filter_var ($_REQUEST['su'], FILTER_SANITIZE_STRING ); $lines = $c->search_cache_report_lines ($rptid, $start, $rows, $s, $shuffle); //$amr_search_result_count = count($lines); } else { $lines = $c->get_cache_report_lines ($rptid, $start, $rows, $shuffle ); } if (!($lines>0)) {// amr_flag_error($c->get_error('norecords')); //20170531 do better message later as line in html return (false); } foreach ($lines as $il =>$l) { if (!defined('str_getcsv')) { $lineitems = amr_str_getcsv( ($l['csvcontent']), '","','"','\\'); /* break the line into the cells */ } else { $lineitems = str_getcsv( $l['csvcontent'], ',','"','\\'); /* break the line into the cells */ } array_walk ($lineitems,'amr_undo_csv'); $linehtml = ''; $linessaved[$il] = amr_convert_indices ($lineitems, $icols); } unset($lines); return ($linessaved); } function amr_convert_indices ($lineitems, $icols) { //if (WP_DEBUG) {echo '
before convert csv:
'; var_dump($icols);} foreach ($icols as $ic => $c) { /* use the icols as our controlling array, so that we have the internal field names */ if (isset($lineitems[$ic])) { $w = $lineitems[$ic]; } else $w = ''; $line[$c] = stripslashes($w); } return ($line); } function amr_check_for_sort_request ($list, $cols=null) { /* check for any sort request and then sort our cache by those requests */ $dir=SORT_ASC; if ((!empty($_REQUEST['dir'])) and ($_REQUEST['dir'] === 'SORT_DESC' )) $dir=SORT_DESC; //20111214 /* if (!empty($_REQUEST['lastsort'])) { $lastsort = esc_attr($_REQUEST['lastsort']); } else $lastsort = 'ID'; if (!empty($_REQUEST['lastdir'])) { $lastdir = esc_attr($_REQUEST['lastdir']); } else $lastdir = $dir; //SORT_ASC; // 20171104 */ //..20111214 if (!empty($_REQUEST['sort'])) { //$cols = array($_REQUEST['sort'] => array($dir), 'ID' => array($dir) ); 20111214 $cols = array($_REQUEST['sort'] => $dir /*, $lastsort => $lastdir */); $list = auser_multisort($list, $cols ); return($list); } else return($list); } function alist_one_widget ($type='user', $i=1, $do_headings=false, $do_csv=false, $max=10){ /* a widget version of alist one*/ /* Get the fields to use for the chosen list type */ global $aopt; global $amain; $c = new adb_cache(); $rptid = $c->reportid($i, $type); $lines = $c->get_column_headings ($rptid); /* get the internal heading names for internal plugin use only */ /* get the user defined heading names */ $line = $lines['0']; if (!defined('str_getcsv')) $icols = amr_str_getcsv( $line[0]['csvcontent'], ',','"','\\'); else $icols = str_getcsv( $line[0]['csvcontent'], ',','"','\\'); // if (!defined('str_getcsv')) $cols = amr_str_getcsv( $line[1]['csvcontent'], '","','"','\\'); // else $cols = str_getcsv( $line[1]['csvcontent'], ',','"','\\'); foreach ($icols as $ic => $cv) { /* use the icols as our controlling array, so that we have the internal field names */ $v = $cols[$ic]; $html .= ''.$v.''; } $hhtml = ''.$html.''; /* setup the html for the table headings */ $fhtml = ''.$html.'' .''; /* setup the html for the table headings */ $html=''; $totalitems = $c->get_cache_totallines($rptid); $lines = $c->get_cache_report_lines ($rptid, $start+1, $max ); if (!($lines>0)) { amr_flag_error($c->get_error('numoflists')); return (false); } foreach ($lines as $il => $lineitems) { //if (WP_DEBUG) var_dump($lineitems); $id = $lineitems[0]; /* *** pop the first one - this should always be the id */ $user = amr_get_userdata($id); unset($linehtml); foreach ($icols as $ic => $c) { /* use the icols as our controlling array, so that we have the internal field names */ $v = $lineitems[$ic]; $linehtml .= ''.amr_format_user_cell($c, $v, $user, $l). ''; } $html .= PHP_EOL.''.$linehtml.''; } $html = ''.$hhtml.$fhtml.''.$html.'
'; return ($html); } function amr_handle_the_doubleescaped_ulist () { // can't do add_query_arg for submenus when adding lists to user menu - sigh // and somehow it gets double escaped and so we have to check for ulist manually if (isset($_REQUEST['page'])) { /* somehow needs to be ? instead of & in wordpress admin, so we don't get as separate */ $param = 'ulist%3D'; if (stristr( $_REQUEST['page'], $param)) { $l = substr (stristr( $_REQUEST['page'], $param), strlen($param)); //echo '
we gotescaped =?'.$param.' l='.$l; } else { $param = 'ulist='; if (stristr( $_REQUEST['page'], $param)) { $l = substr (stristr( $_REQUEST['page'], $param), strlen($param)); //echo '
we got =?'.$l; } else { //var_dump($_REQUEST); } } } return $l; } function amr_list_user_meta(){ /* Echos out the paginated version of the requested list */ global $aopt; global $amain; global $amr_nicenames; global $thiscache; ameta_options(); if (!isset ($aopt['list'])) { _e ("No lists Defined", 'amr-users'); return false; } $l = amr_handle_the_doubleescaped_ulist (); if (isset ($_REQUEST['csv'])) { amr_meta_handle_export_request (); return; } $thiscache = new adb_cache(); // nlr? amr_list_user_admin_headings($l); // will only do if in_admin echo ausers_form_start(); if (empty($_REQUEST['filtering']) and (empty($_REQUEST['headings'])) and empty ($_REQUEST['csvsubset'])) ausers_bulk_actions(); // will check capabilities echo alist_one('user',$l, array()); /* list the user list with the explanatory headings */ if (empty($_REQUEST['filtering']) and (empty($_REQUEST['headings'])) and empty ($_REQUEST['csvsubset'])) ausers_bulk_actions(); // will check capabilities echo ausers_form_end(); return; } function amr_try_build_cache_now ($c, $i, $rptid) { // the cache object, the report id, the list number global $amain; if ($c->cache_in_progress($rptid)) { echo ( '
'.$amain['names'][$i].' ('.$rptid.') '.$c->get_error('inprogress').'
'); return (false); } else { return amr_build_user_data_maybe_cache($i); return true; } } function amr_does_filter_match_data_array ($filtervalue, $data_arr) { if (is_array($filtervalue)) { foreach ($data_arr as $data) { // only need 1 match for truth if (in_array($data, $filtervalue)) return true; } return false; } else { // filtervalue not an array if (!in_array($filtervalue, $data_arr)) return false; else return true; } } function amr_does_filter_match ($filtervalue, $datavalue) { // datavalue might be a comma separated set of multiple values // data value may or may not have &s; ??? // filtervalue might be an array, and might be '-' for blanks, or '*' for all - these should be weeded out earlier // if asking for blanks and a value, then if blank it's a yes if (empty($datavalue) and (is_array($filtervalue) and in_array('-',$filtervalue))) return true; if (stristr($datavalue, ', ')) { //might be a csv string $data_arr = explode (', ',$datavalue); return (amr_does_filter_match_data_array ($filtervalue, $data_arr)); } elseif (stristr($datavalue, ',')) { //might be a csv string $data_arr = explode (',',$datavalue); return (amr_does_filter_match_data_array ($filtervalue, $data_arr)); } else { // datavalue is not array if (is_array($filtervalue)) { if (!in_array($datavalue,$filtervalue)) return false; // array of filter values 20141121 } else { // 2014 12 07 - handle ampersdands that may or may not be in data if ($filtervalue == ($datavalue)) return true; if ($filtervalue == html_entity_decode($datavalue)) return true; return false; } } return true; } /** * Remove slashes from strings, arrays and objects * * @param mixed input data * @return mixed cleaned input data */ function amr_stripslashesFull($input) { if (is_array($input)) { $input = array_map('amr_stripslashesFull', $input); } elseif (is_object($input)) { $vars = get_object_vars($input); foreach ($vars as $k=>$v) { $input->{$k} = amr_stripslashesFull($v); } } else { $input = stripslashes($input); } return $input; } function alist_one($type='user', $ulist=1 ,$options) { //options can be headings, csv, show_search, show_perpage /* Get the fields to use for the chosen list type */ global $aopt, $amain, $amrusers_fieldfiltering, $amr_current_list, $amr_search_result_count; global $amr_refreshed_heading, $totalitems; if (empty ($aopt['list'][$ulist])) { printf(__('No such list: %s','amr-users'),$ulist); $ulist = amr_debug_no_such_list (); // issue debug messages and use first list found } else $l = $aopt['list'][$ulist]; /* *get the config */ do_action('amr-add-criteria-to-list', $ulist); // allows one to force criteria into the request field for example (eg: show only logged in user) /* 20170906 - remove transient html $transient_suffix = amr_check_use_transient ($ulist, $options) ; if ($transient_suffix) { // no filters, no search, no sort, nothing special happening //if (WP_DEBUG) echo '
using transient: '.$transient_suffix.'
'; $html = get_transient('amr-users-html-for-list-'.$transient_suffix); if (!empty($html)) { if (current_user_can('administrator')) { echo '
!'; } return( $html); } } */ $caption = ''; $sortedbynow = ''; if (empty($amain['list_rows_per_page'][$ulist])) $amain['list_rows_per_page'][$ulist] = $amain['rows_per_page']; $rowsperpage = amr_rows_per_page($amain['list_rows_per_page'][$ulist]); // will check request // use $options as our 'request' input so shortcode parameters will work. // allow _REQUEST to override $options /*$request_override_allowed = array( 'filter', 'fieldvaluefilter', 'fieldnamefilter', 'sort'); */ // figure out what we are doing - searching, filtering ------------------------------------------------------- $search = ''; if (isset($_REQUEST['clear_filtering'])) { // we do not need these then unset($_REQUEST['fieldnamefilter']); unset($_REQUEST['fieldvaluefilter']); unset($_REQUEST['filter']); unset($_REQUEST['su']); //do we need to unset the individual cols? maybe not foreach ($_REQUEST as $i => $r) { if (strpos($i,'_from') or (strpos($i,'_to'))) { unset ($_REQUEST[$i]); } } } else { if (!empty($_REQUEST['su'])) { //if (WP_DEBUG) echo '
We got search too:'.$_REQUEST['su']; $search = strip_tags ($_REQUEST['su']); } foreach ($_REQUEST as $param => $value) { // we do not know the column names, so just transfer all? // some might be an array //skip some obvious ones if (empty($value)) continue; if (in_array( $param, array('page','action','action2','amr-meta','_wp_http_referer', 'dobulk'))) continue; if (is_array($value)) { foreach ($value as $i => $val) { if (!(is_array($val))) $options[$param][$i] = htmlspecialchars_decode(sanitize_text_field($val)); //else just ignore nested array in $_REQUEST experienced by someone using WPSEO 20180614 } } else { $options[$param] = htmlspecialchars_decode(sanitize_text_field($value)); } } } $amrusers_fieldfiltering = false; if (!empty($options['filter'])) { //if (amr_debug()) {echo '

Filtering

';} foreach (array('fieldnamefilter', 'fieldvaluefilter') as $i=> $filtertype) { if (isset($options[$filtertype])) { //if (WP_DEBUG) {echo '
doing: '.$filtertype; var_dump($options);} foreach ($options[$filtertype] as $i => $col) { if (empty($options[$col])) {//ie showing all unset($options[$filtertype][$i]); unset($options[$col]); } else $amrusers_fieldfiltering = true; // set as we are maybe doing realtime filtering flag }; } } } $c = new adb_cache(); $rptid = $c->reportid($ulist, $type); if ($amrusers_fieldfiltering) { $lines = amr_build_user_data_maybe_cache($ulist); // since we are filtering, we will run realtime, but not save, else we would lose the normal report if (empty($lines)) return; $totalitems = count($lines); //if (WP_DEBUG) echo '
field filtering & $totalitems='.$totalitems; } else { if ((!($c->cache_exists($rptid))) or (isset($options['refresh']))) { //if (amr_debug()) _e('If debug only: Either refresh requested OR no cache exists. A rebuild will be initiated .... ','amr-users'); $success = amr_try_build_cache_now ($c, $ulist, $rptid) ; //$lines = amr_build_user_data_maybe_cache($ulist); $totalitems = $c->get_cache_totallines($rptid); //now need the lines, but first, paging check will tell us how many $amrusers_fieldfiltering = false; // already done if it must be } else { $totalitems = $c->get_cache_totallines($rptid); } } //---------- setup paging variables if ($totalitems < 1) { _e('No lines found.','amr-users'); echo amr_users_get_refresh_link($ulist); return; } if ($rowsperpage > $totalitems) $rowsperpage = $totalitems; $lastpage = ceil($totalitems / $rowsperpage); if (!empty ($_REQUEST['listpage'])) // if we requested a page MUST use that $page = (int) $_REQUEST['listpage']; else { // is a random page stipulated ? if (isset($options['show_randompage'])) { // allows a random page $page = rand (1, $lastpage); } else {// else.....start at the very beginning, a very good place to start... $page=1; } } if ($page > $lastpage) $page = $lastpage; if ($page == 1) $start = 0; else $start = (($page - 1) * $rowsperpage); $shuffle = false; if (!empty($options['shuffle'])) { $shuffle = true; } $filtercol = array(); // get the data if (!$amrusers_fieldfiltering) { // because already have lines if were doing field level filtering $headinglines = $c->get_column_headings ($rptid); /* get the internal heading names for internal plugin use only */ /* get the user defined heading names */ if (!defined('str_getcsv')) $icols = amr_str_getcsv( ($headinglines[0]['csvcontent']), ',','"','\\'); else $icols = str_getcsv( $headinglines[0]['csvcontent'], ',','"','\\'); if (!defined('str_getcsv')) $cols = amr_str_getcsv( $headinglines[1]['csvcontent'], '","','"','\\'); else $cols = str_getcsv( $headinglines[1]['csvcontent'], ',','"','\\'); //var_dump($icols); // 20170201 //$icols = array_unique($icols); //since may end up with two indices, eg if filtering and grouping by same value // but loses the id if is being shown, so do the count comparision below, if cols has more, then they are the extra indices on the end. //20170217 BUT WE still need them ? so why did we do this? $ic = count($icols); $cc = count($cols); if ($cc < $ic) { // we have indices in icols //$icols = array_slice ($icols, 0, $cc); } $fetch_amount = $rowsperpage; // default if (isset($options['filter']) or (!empty($options['sort'])) or !empty($_REQUEST['su']) or isset($options['csvsubset'])) //20140718 - add csvsubset $fetch_amount = 0; //fetch all // if at initial display not searching or filtering if (isset($options['start_empty']) and empty($options['su']) and empty($options['filter']) and empty($options['sort'])) { $lines = array(); $totalitems = 0; } else { $lines = amr_get_lines_to_array( // also does search $c, $rptid, $start, $fetch_amount, $icols, $shuffle ); } } else { // we are field filtering unset ($lines[0]); // the tech lines and the headings line unset ($lines[1]); $totalitems = count($lines); // must be here, only reset for field filtering $s = $l['selected']; asort ($s); /* get the selected fields in the display order requested */ $cols = amr_build_col_headings($s); $icols = amr_build_cols ($s); foreach ($lines as $i => $j) { $lines[$i] = amr_convert_indices ($j, $icols); } } // display time filter check if ((!empty($lines)) and (isset($options['filter']) or isset ($options['csvsubset']))) { // then we are filtering // check for date range too - where foreach ($icols as $cindex => $col) { if (!empty ($options[$col]) ) { if ((!(isset ($options['fieldnamefilter']) and in_array($col, $options['fieldnamefilter']))) and (!(isset ($options['fieldvaluefilter']) and in_array($col, $options['fieldvaluefilter'])))) { $filtercol[$col] = amr_stripslashesFull($options[$col]); // 20140419 take out esc_attr // 2014 12 08 add stripslahes to force apostrophe s to match data } } else { if ( !empty($options[$col.'_fromdate']) ) {// has date range $from[$col] = $options[$col.'_fromdate']; } elseif ( !empty($options[$col.'_fromunix']) ) {// has date range $from[$col] = strtotime($options[$col.'_fromunix']); } elseif ( !empty($options[$col.'_from']) ) {// has date range $from[$col] = $options[$col.'_from']; } if ( !empty($options[$col.'_todate']) ) { $to[$col] = $options[$col.'_todate']; } elseif ( !empty($options[$col.'_tounix']) ) { $to[$col] = strtotime($options[$col.'_tounix']); } elseif ( !empty($options[$col.'_to']) ) { $to[$col] = $options[$col.'_to']; } } } if (!empty($options['index'])) { $filtercol['index'] = strip_tags($options['index']); } if (!empty($filtercol)) { // for each of the filter columns that are not field filters foreach ($filtercol as $fcol => $value) { if ((is_array($value) and in_array('*',$value) and in_array('-',$value) )) { //stupid, but show all, so don't use this filter // 201710 do nothing? continue; //we want all } else { foreach ($lines as $i=> $line) { if ((is_array($value) and in_array('*',$value)) or ($value == '*')) { // 201710 looking for all with values if (empty($line[$fcol]) ) {// don't want if empty unset ($lines[$i]); continue; // move on } else { // we want it continue; } } elseif (!is_array($value)) if ($value == '-') { // 201710 we only looking for all blanks if (!empty($line[$fcol]) ) { unset ($lines[$i]); continue; } else { // leave it for the next layer check continue; } } else {// leave it for the next layer check } else { // it is array if (!in_array('-', $value)) { // if dont want blanks if (empty($line[$fcol]) ) { //we want something unset ($lines[$i]); continue; } // else drop down to next check } //else next layer // we do want blanks too } //continue checking if haven't 'coninued' out! if ($fcol == 'ID') { // id can have filtering - allows link to profile page if (!($line[$fcol] == $value) ) {/// amr ?? unset ($lines[$i]); } } else { if (!amr_does_filter_match ($value, $line[$fcol]) ) { // 20140305 - GET RID OF Fuzzy matching, testted both comma separated and comma space separated - working!! //$instring = strpos($line[$fcol],$value ); // fuzzy filtering - hmm why - maybe not??? // *** definitely NOT - number values overmatch then // eg: filtering 4, then 41, 24 matches // BUT can we just explode from commas? // how do we know if we should explode or not? // will be better when we are using query mode down the track // is fuzzy filter to avoid situation where value may have spaces before/after ??? // used strstr before, but strpos faster //if ($instring === false) { // note strpos may return 0 if in front of string unset ($lines[$i]); } } //else if (!($line[$fcol] == $value)) { strisstr will catch these ? //} if ((!empty ($options['filter']) and $options['filter'] == 'hide') ) { unset($lines[$i][$fcol]); } } // if hiding, delete that column if (!empty ($options['filter']) and ($options['filter'] == 'hide') ) { foreach ($icols as $cindex=> $col) { if ($fcol == $col) { unset ($icols[$cindex]); unset ($cols[$cindex]); } } } // end delete col //if (amr_debug()) echo '
* Records found that meet criteria: '.count($lines); } } // since we filtered, if also trying to search then do search here. // cannot do at initial query like plain search because pagination gets messed } //20161207 //----------------------------------------------------------------------------- if (!empty($from)) { // for each of the filter columns that are not field filters foreach ($from as $col => $value) { foreach ($lines as $i=> $line) { if (empty($line[$col])) unset ($lines[$i]); elseif ($line[$col] < $value) { unset ($lines[$i]); //echo ' Less than from so unset'; } //else echo ' Not Less than from so keep'; } } } if (!empty($to)) { // for each of the filter columns that are not field filters foreach ($to as $col => $value) { foreach ($lines as $i=> $line) { if (empty($line[$col])) unset ($lines[$i]); elseif ($line[$col] > $value) { unset ($lines[$i]); //echo ' Greater than to, so unset'; } //else echo ' Not greater than to so keep'; } } } $lines = apply_filters('amr_add_custom_filter',$lines); //2016 12 06 $amr_search_result_count = count($lines); // of filtering $totalitems = $amr_search_result_count; // slice the right section of the returned values based on rowsperpage and currentpage // update the paging variables if (($amr_search_result_count > 0) and ($rowsperpage > $amr_search_result_count)) $rowsperpage = $amr_search_result_count; $lastpage = ceil($amr_search_result_count / $rowsperpage); if ($page > $lastpage) $page = $lastpage; if ($page == 1) { $start = 0; } else { $start = (($page - 1) * $rowsperpage); } //if (WP_DEBUG) echo '
count lines = '.$amr_search_result_count. ' start='.$start. ' rowspp='. $rowsperpage; // 20161207} } //end if //------------------------------------------------------------------------------ check for sort if (!empty($options['sort'])) { //if (WP_DEBUG) {echo '
before sort start:'.$start.' rows pp:'.$rowsperpage.' '.count($lines);} if ($lines) { $linesunsorted = amr_check_for_sort_request ($lines); $linesunsorted = array_values($linesunsorted); /* reindex as our indexing is stuffed and splice will not work properly */ //if (!empty($search)) $totalitems = count($linesunsorted); //save total here before splice $lines = $linesunsorted; //$lines = array_splice($linesunsorted, $start, $rowsperpage, true ); unset($linesunsorted); // free up memory? //if (WP_DEBUG) {echo '
after sort :'.$rowsperpage.' '.count($lines);} /* now fix the cache headings*/ $sortedbynow = ''; if (!empty($options['sort'])) { foreach ($icols as $i=>$t) { if ($t == $options['sort']) $sortedbynow = strip_tags($cols[$i]) ; } $sortedbynow = '
  • ' .__('Sorted by:','amr-users').''.$sortedbynow.'
  • '; } } } // do csv filter here ? if (!empty($_REQUEST['csvsubset'])) { $tofile = amr_is_tofile($ulist); $csvlines = amr_csvlines_to_csvbatch($lines, $ulist); $html = amr_lines_to_csv($csvlines, $ulist, true, false,'csv','"',',',chr(13).chr(10), $tofile ); //echo $html; return $html; } else { // if clean request, we may have the right number lines already - do not reslice if ((!empty($lines)) and ($rowsperpage < count($lines))) //** 2018 (change OR to AND) do we need this? should it not be right before $lines = array_slice($lines, $start, $rowsperpage, true); } // finished filtering and sorting //var_dump($ulist); $html = amr_display_final_list ( $lines, $icols, $cols, $page, $rowsperpage, $totalitems, $caption, $search, $ulist, $c, $filtercol, $sortedbynow, $options); /* 20170906 remove transient html if ($transient_suffix) { // ie no filters, no search, no sort, nothing special happening $expiration = (empty($amain['transient_expiration']) ? 60 : $amain['transient_expiration']); //allow setting later set_transient('amr-users-html-for-list-'.$transient_suffix, $html ,$expiration ); //track_progress('Transient set for html for list '.$transient_suffix); } */ return $html; }