public function __construct()
 {
     parent::__construct();
     $this->runkitExt = false;
     if (function_exists("runkit_constant_redefine")) {
         $this->runkitExt = true;
     }
     $this->apdExt = false;
     if (function_exists("rename_function")) {
         $this->apdExt = true;
     }
     if ($this->apdExt && !$GLOBALS['test_header']) {
         // using apd extension to overriding header and headers_sent functions for test purposes
         $GLOBALS['test_header'] = 1;
         // rename_function() of header and headers_sent may cause CLI error report in Windows XP
         rename_function('header', 'test_header');
         rename_function('headers_sent', 'test_headers_sent');
         // solution from: http://unixwars.com/2008/11/29/override_function-in-php/ to overriding more than one function
         $substs = array('header' => 'if (isset($GLOBALS["header"])) $GLOBALS["header"] .= $a; else $GLOBALS["header"] = $a;', 'headers_sent' => 'return false;');
         $args = array('header' => '$a', 'headers_sent' => '');
         foreach ($substs as $func => $ren_func) {
             if (function_exists("__overridden__")) {
                 rename_function("__overridden__", str_replace(array('.', ' '), array('', ''), microtime()));
             }
             override_function($func, $args[$func], $substs[$func]);
             rename_function("__overridden__", str_replace(array('.', ' '), array('', ''), microtime()));
         }
     }
 }
Example #2
0
    /**
     * Override a given function with a mock
     *
     * @param string $sFunction     required=true
     * @param object $oOverrider    required=true
     * @return string name by which the original mocked function can be called
     */
    public static function override($sFunction, $oOverrider)
    {
        $sDefinition = <<<DEFINITION
\$aArgs = func_get_args();
return call_user_func_array(array('BuiltinMock', 'callOverride'), array('{$sFunction}', \$aArgs));
DEFINITION;
        self::restore($sFunction);
        $sRenamedFunction = self::getRenamedFunction($sFunction);
        rename_function($sFunction, $sRenamedFunction);
        override_function($sFunction, '', $sDefinition);
        rename_function("__overridden__", uniqid("__overridden__"));
        $oOverrider->setOriginalName($sRenamedFunction);
        self::$aOverrides[$sFunction] = $oOverrider;
        return $sRenamedFunction;
    }
Example #3
0
Zend_Registry::set('app', $app);
if (isset($app["timezone"])) {
    date_default_timezone_set($app["timezone"]);
} else {
    date_default_timezone_set('UTC');
}
$vouser_sync = $this->getOption("vouser_sync");
Zend_Registry::set('vouser_sync', $vouser_sync);
$_SERVER["validation_period"] = $app["invalid"];
$_SERVER['APILatestVersion'] = $api["latestVersion"];
$_SERVER['Repository_Enabled'] = isset($app["enableRepository"]) && $app["enableRepository"] == 'true' ? "true" : "false";
$_SERVER['Repository_Api'] = isset($app["repositoryApi"]) ? $app["repositoryApi"] : "";
list($php_major, $php_minor, $php_bug) = explode(".", phpversion(), 3);
if ($php_major <= 5) {
    if (function_exists('override_function')) {
        override_function('mysql_real_escape_string', '$s,$r = null', 'if (is_null($r)) { $r = Zend_Registry::get("repository")->getConnection(); } $s = preg_replace("/^\'/", "", preg_replace("/\'$/", "", $r->quote($s))); return $s;');
    } else {
        error_log("Warning: function 'override_function' does not exist. Has the 'php-pecl-apd' package been properly installed?");
    }
} else {
    if (function_exists('mysql_real_escape_string')) {
        error_log("Warning: ext/mysql has been officially removed in PHP 7.0; please remove obsolete extension");
    } else {
        function mysql_real_escape_string($s, $r = null)
        {
            if (is_null($r)) {
                $r = Zend_Registry::get("repository")->getConnection();
            }
            $s = preg_replace("/^\\'/", "", preg_replace("/\\'\$/", "", $r->quote($s)));
            return $s;
        }
Example #4
0
function _dbslayer_map()
{
    $substs = array('is_resource' => 'cherokee_is_resource($link)', 'mysql_affected_rows' => 'cherokee_mysql_affected_rows($link)', 'mysql_client_encoding' => 'cherokee_mysql_client_encoding ($link)', 'mysql_close' => 'cherokee_mysql_close($link)', 'mysql_connect' => 'cherokee_mysql_connect($host, $user, $pass, $new_link, $client_flags)', 'mysql_create_db' => 'cherokee_mysql_create_db($database_name, $link)', 'mysql_data_seek' => 'cherokee_mysql_data_seek($result, $row_number)', 'mysql_db_name' => 'cherokee_mysql_db_name($result, $row, $field)', 'mysql_db_query' => 'cherokee_mysql_db_query($database, $query, $link)', 'mysql_drop_db' => 'cherokee_mysql_drop_db($database_name, $link)', 'mysql_errno' => 'cherokee_mysql_errno($link)', 'mysql_error' => 'cherokee_mysql_error($link)', 'mysql_escape_string' => 'cherokee_mysql_escape_string($unescaped_string)', 'mysql_fetch_array' => 'cherokee_mysql_fetch_array($result, $result_type)', 'mysql_fetch_assoc' => 'cherokee_mysql_fetch_assoc($result)', 'mysql_fetch_field' => 'cherokee_mysql_fetch_field($result, $field_offset)', 'mysql_fetch_lengths' => 'cherokee_mysql_fetch_lengths($result)', 'mysql_fetch_num' => 'cherokee_mysql_fetch_num($result)', 'mysql_fetch_object' => 'cherokee_mysql_fetch_object (&$result, $class_name, $params)', 'mysql_field_flags' => 'cherokee_mysql_field_flags ($result, $field_offset)', 'mysql_field_name' => 'cherokee_mysql_field_name ($result, $field_offset)', 'mysql_field_seek' => 'cherokee_mysql_field_seek (&$result, $field_offset)', 'mysql_field_type' => 'cherokee_mysql_field_type ($result, $field_offset)', 'mysql_free_result' => 'cherokee_mysql_free_result($result)', 'mysql_get_client_info' => 'cherokee_mysql_get_client_info()', 'mysql_get_host_info' => 'cherokee_mysql_get_host_info ($link)', 'mysql_get_proto_info' => 'cherokee_mysql_get_proto_info ($link)', 'mysql_get_server_info' => 'cherokee_mysql_get_server_info($link)', 'mysql_info' => 'cherokee_mysql_info ($link)', 'mysql_insert_id' => 'cherokee_mysql_insert_id($link)', 'mysql_list_dbs' => 'cherokee_mysql_list_dbs($link)', 'mysql_list_fields' => 'cherokee_mysql_list_fields ($database, $table_name, $link)', 'mysql_list_processes' => 'cherokee_mysql_list_processes ($link)', 'mysql_list_tables' => 'cherokee_mysql_list_tables  ($database, $link)', 'mysql_num_fields' => 'cherokee_mysql_num_fields ($result)', 'mysql_num_rows' => 'cherokee_mysql_num_rows($result)', 'mysql_pconnect' => 'cherokee_mysql_pconnect($host, $user, $pass, $client_flags)', 'mysql_ping' => 'cherokee_mysql_ping ($link)', 'mysql_query' => 'cherokee_mysql_query($query, $link)', 'mysql_real_escape_string' => 'cherokee_mysql_real_escape_string($unescaped_string, $link)', 'mysql_result' => 'cherokee_mysql_result($result, $row, $field)', 'mysql_select_db' => 'cherokee_mysql_select_db($database_name, &$link)', 'mysql_set_charset' => 'cherokee_mysql_set_charset($charset, $link)', 'mysql_stat' => 'cherokee_mysql_stat($link)', 'mysql_tablename' => 'cherokee_mysql_tablename($result, $i)', 'mysql_thread_id' => 'cherokee_mysql_thread_id ($link)', 'mysql_unbuffered_query' => 'cherokee_mysql_unbuffered_query($query, $link)');
    $args = array('is_resource' => '$link', 'mysql_affected_rows' => '$link = NULL', 'mysql_client_encoding' => '$link = NULL', 'mysql_close' => '$link = NULL', 'mysql_connect' => '$host = NULL, $user = NULL, $pass = NULL, $new_link = false, $client_flags = 0', 'mysql_create_db' => '$database_name, $link = NULL', 'mysql_data_seek' => '&$result, $row_number', 'mysql_db_name' => '$result, $row, $field = NULL', 'mysql_db_query' => '$database, $query, $link = NULL', 'mysql_drop_db' => '$database_name, $link = NULL', 'mysql_errno' => '$link = NULL', 'mysql_error' => '$link = NULL', 'mysql_escape_string' => '$unescaped_string', 'mysql_fetch_array' => '&$result, $result_type = MYSQL_BOTH', 'mysql_fetch_assoc' => '&$result', 'mysql_fetch_field' => '&$result, $field_offset = -1', 'mysql_fetch_lengths' => '$result', 'mysql_fetch_num' => '&$result', 'mysql_fetch_object' => '&$result, $class_name = "stdClass", $params = NULL', 'mysql_field_flags' => '$result, $field_offset', 'mysql_field_name' => '$result, $field_offset', 'mysql_field_seek' => '&$result, $field_offset', 'mysql_field_type' => '$result, $field_offset', 'mysql_free_result' => '&$result', 'mysql_get_client_info' => '', 'mysql_get_host_info' => '$link = NULL', 'mysql_get_proto_info' => '$link = NULL', 'mysql_get_server_info' => '$link = NULL', 'mysql_info' => '$link = NULL', 'mysql_insert_id' => '$link = NULL', 'mysql_list_dbs' => '$link = NULL', 'mysql_list_fields' => '$database, $table_name, $link = NULL', 'mysql_list_processes' => '$link = NULL', 'mysql_list_tables' => '$database, $link = NULL', 'mysql_num_fields' => '$result', 'mysql_num_rows' => '$result', 'mysql_pconnect' => '$host = NULL, $user = NULL, $pass = NULL, $client_flags = 0', 'mysql_ping' => '$link = NULL', 'mysql_query' => '$query, $link = NULL', 'mysql_real_escape_string' => '$unescaped_string, $link = NULL', 'mysql_result' => '&$result, $row, $field = 0', 'mysql_select_db' => '$database_name, $link = NULL', 'mysql_set_charset' => '$charset , $link = NULL', 'mysql_stat' => '$link = NULL', 'mysql_tablename' => '$result, $i', 'mysql_thread_id' => '$link = NULL', 'mysql_unbuffered_query' => '$query, $link = NULL');
    foreach ($substs as $func => $ren_func) {
        $ret = override_function($func, $args[$func], "return {$substs[$func]};");
        $ret &= rename_function("__overridden__", "_{$ren_func}");
        if ($ret == FALSE) {
            return FALSE;
        }
    }
    return TRUE;
}
 /**
  * Process content of CSV file
  *
  * @since 0.1
  **/
 public function generate_data()
 {
     // This function runs before we display the admin page, so we need to skip
     // the rest of this function if the user didn't click on the
     // Save, Load, or Delete Settings buttons
     if (!isset($_POST['_wpnonce-q-eud-export-user-page_export']) || isset($_POST['load_export']) || isset($_POST['save_export']) || isset($_POST['delete_export'])) {
         return false;
     }
     // check admin referer ##
     check_admin_referer('q-eud-export-user-page_export', '_wpnonce-q-eud-export-user-page_export');
     // build argument array ##
     $args = array('fields' => 'all', 'role' => sanitize_text_field($_POST['role']));
     // did they request a specific program ? ##
     if (isset($_POST['program']) && $_POST['program'] != '') {
         $args['meta_key'] = 'member_of_club';
         $args['meta_value'] = (int) $_POST['program'];
         $args['meta_compare'] = '=';
     }
     // is there a range limit in place for the export ? ##
     if (isset($_POST['limit_offset']) && $_POST['limit_offset'] != '' && isset($_POST['limit_total']) && $_POST['limit_total'] != '') {
         // let's just make sure they are integer values ##
         $limit_offset = (int) $_POST['limit_offset'];
         $limit_total = (int) $_POST['limit_total'];
         if (is_int($limit_offset) && is_int($limit_total)) {
             $args['offset'] = $limit_offset;
             /* cwjordan codex says:
              *     number - Limit the total number of users returned
              * so don't subtract the offset, like as not 
              * that will give us a negative number for $args['number']
              * e.g. offset of 1000 total of 100 */
             $args['number'] = $limit_total;
             //                    $args['number'] = $limit_total - $limit_offset;
             #wp_die(pr($args));
         }
     }
     /* pre_user query */
     add_action('pre_user_query', array($this, 'pre_user_query'));
     $users = get_users($args);
     remove_action('pre_user_query', array($this, 'pre_user_query'));
     /* no users found, so chuck an error into the args array and exit the export */
     if (!$users) {
         $referer = add_query_arg('error', 'empty', wp_get_referer());
         wp_redirect($referer);
         exit;
     }
     /* get sitename and clean it up */
     $sitename = sanitize_key(get_bloginfo('name'));
     if (!empty($sitename)) {
         $sitename .= '.';
     }
     // export method ? ##
     $export_method = 'excel';
     // default to Excel export ##
     if (isset($_POST['format']) && $_POST['format'] != '') {
         $export_method = sanitize_text_field($_POST['format']);
     }
     // set export filename structure ##
     $filename = $sitename . 'users.' . date('Y-m-d-H-i-s');
     switch ($export_method) {
         case "csv":
             // to csv ##
             header('Content-Description: File Transfer');
             header('Content-Disposition: attachment; filename=' . $filename . '.csv');
             header('Content-Type: text/csv; charset=' . get_option('blog_charset'), true);
             // set a csv check flag
             $is_csv = true;
             // nothing here
             $doc_begin = '';
             //preformat
             $pre = '';
             // how to seperate data ##
             $seperator = ',';
             // comma for csv ##
             // line break ##
             $breaker = "\n";
             // nothing here
             $doc_end = '';
             break;
         case 'excel':
             // to xls ##
             header('Content-Description: File Transfer');
             header("Content-Type: application/vnd.ms-excel");
             header("Content-Disposition: attachment; filename={$filename}.xls");
             header("Pragma: no-cache");
             header("Expires: 0");
             // set a csv check flag
             $is_csv = false;
             //grab the template file (for tidy formatting)
             include 'xml-template.php';
             // open xml
             $doc_begin = $xml_doc_begin;
             //preformat
             $pre = $xml_pre;
             // how to seperate data ##
             $seperator = $xml_seperator;
             // line break ##
             $breaker = $xml_breaker;
             // close xml
             $doc_end = $xml_doc_end;
             break;
     }
     // function to exclude data ##
     $exclude_data = apply_filters('q_eud_exclude_data', array());
     // check for selected usermeta fields ##
     $usermeta = isset($_POST['usermeta']) ? $_POST['usermeta'] : '';
     $usermeta_fields = array();
     if ($usermeta && is_array($usermeta)) {
         foreach ($usermeta as $field) {
             $usermeta_fields[] = sanitize_text_field($field);
         }
     }
     #pr($usermeta_fields);
     #exit;
     // check for selected x profile fields ##
     $bp_fields = isset($_POST['bp_fields']) ? $_POST['bp_fields'] : '';
     $bp_fields_passed = array();
     if ($bp_fields && is_array($bp_fields)) {
         foreach ($bp_fields as $field) {
             // reverse tidy ##
             $field = str_replace('__', ' ', sanitize_text_field($field));
             // add to array ##
             $bp_fields_passed[] = $field;
         }
     }
     // cwjordan: check for x profile fields we want update time for ##
     $bp_fields_update = isset($_POST['bp_fields_update_time']) ? $_POST['bp_fields_update_time'] : '';
     $bp_fields_update_passed = array();
     if ($bp_fields_update && is_array($bp_fields_update)) {
         foreach ($bp_fields_update as $field) {
             // reverse tidy ##
             $field = str_replace('__', ' ', sanitize_text_field($field));
             // add to array ##
             $bp_fields_update_passed[] = $field . " Update Date";
         }
     }
     // global wpdb object ##
     global $wpdb;
     // exportable user data ##
     $data_keys = array('ID', 'user_login', 'user_nicename', 'user_email', 'user_url', 'user_registered', 'display_name');
     // compile final fields list ##
     $fields = array_merge($data_keys, $usermeta_fields, $bp_fields_passed, $bp_fields_update_passed);
     // build the document headers ##
     $headers = array();
     foreach ($fields as $key => $field) {
         // rename programs field ##
         if ($field == 'member_of_club') {
             $field = 'Program';
         }
         if (in_array($field, $exclude_data)) {
             unset($fields[$key]);
         } else {
             if ($is_csv) {
                 $headers[] = '"' . $field . '"';
             } else {
                 $headers[] = $field;
                 #echo '<script>console.log("Echoing header cell: '.$field.'")</script>';
             }
         }
     }
     // no more buffering while spitting back the export data ##
     ob_end_flush();
     // get the value in bytes allocated for Memory via php.ini ##
     // @link http://wordpress.org/support/topic/how-to-exporting-a-lot-of-data-out-of-memory-issue?replies=2
     $memory_limit = $this->return_bytes(ini_get('memory_limit')) * 0.75;
     // we need to disable caching while exporting because we export so much data that it could blow the memory cache
     // if we can't override the cache here, we'll have to clear it later...
     if (function_exists('override_function')) {
         override_function('wp_cache_add', '$key, $data, $group="", $expire=0', '');
         override_function('wp_cache_set', '$key, $data, $group="", $expire=0', '');
         override_function('wp_cache_replace', '$key, $data, $group="", $expire=0', '');
         override_function('wp_cache_add_non_persistent_groups', '$key, $data, $group="", $expire=0', '');
     } elseif (function_exists('runkit_function_redefine')) {
         runkit_function_redefine('wp_cache_add', '$key, $data, $group="", $expire=0', '');
         runkit_function_redefine('wp_cache_set', '$key, $data, $group="", $expire=0', '');
         runkit_function_redefine('wp_cache_replace', '$key, $data, $group="", $expire=0', '');
         runkit_function_redefine('wp_cache_add_non_persistent_groups', '$key, $data, $group="", $expire=0', '');
     }
     // open doc wrapper.. ##
     echo $doc_begin;
     // echo headers ##
     echo $pre . implode($seperator, $headers) . $breaker;
     // build row values for each user ##
     foreach ($users as $user) {
         // check if we're hitting any Memory limits, if so flush them out ##
         // per http://wordpress.org/support/topic/how-to-exporting-a-lot-of-data-out-of-memory-issue?replies=2
         if (memory_get_usage(true) > $memory_limit) {
             wp_cache_flush();
         }
         // open up a new empty array ##
         $data = array();
         // BP loaded ? ##
         if (function_exists('bp_is_active')) {
             $bp_data = BP_XProfile_ProfileData::get_all_for_user($user->ID);
         }
         // loop over each field ##
         foreach ($fields as $field) {
             // check if this is a BP field ##
             if (isset($bp_data) && isset($bp_data[$field]) && in_array($field, $bp_fields_passed)) {
                 $value = $bp_data[$field];
                 if (is_array($value)) {
                     $value = maybe_unserialize($value['field_data']);
                     // suggested by @grexican ##
                     #$value = $value['field_data'];
                     /**
                      * cwjordan
                      * after unserializing it we then 
                      * need to implode it so 
                      * that we have something readable?
                      * Going to use :: as a separator
                      * because that's what Buddypress Members Import
                      * expects, but we might want to make that 
                      * configurable. 
                      */
                     if (is_array($value)) {
                         $value = implode("::", $value);
                     }
                 }
                 $value = $this->sanitize($value);
                 // check if this is a BP field we want the updated date for ##
             } elseif (in_array($field, $bp_fields_update_passed)) {
                 global $bp;
                 $real_field = str_replace(" Update Date", "", $field);
                 $field_id = xprofile_get_field_id_from_name($real_field);
                 $value = $wpdb->get_var($wpdb->prepare("\n                                            SELECT last_updated \n                                            FROM {$bp->profile->table_name_data} \n                                            WHERE user_id = %d AND field_id = %d\n                                        ", $user->ID, $field_id));
                 // include the user's role in the export ##
             } elseif (isset($_POST['q_eud_role']) && $_POST['q_eud_role'] != '' && $field == 'role') {
                 // add "Role" as $value ##
                 $value = $user->roles[0] ? $user->roles[0] : '';
                 // empty value if no role found - note: we only take the first role assigned to the user ##
                 // user data or usermeta ##
             } else {
                 $value = isset($user->{$field}) ? $user->{$field} : '';
                 #$value = is_array( $value ) ? serialize( $value ) : $value; // maybe serialize the value ##
                 $value = is_array($value) ? implode(", ", $value) : $value;
                 // maybe serialize the value - suggested by @nicmare ##
             }
             // correct program value to Program Name ##
             if ($field == 'member_of_club') {
                 $value = get_the_title($value);
             }
             if ($is_csv) {
                 $data[] = '"' . str_replace('"', '""', $value) . '"';
             } else {
                 $data[] = $value;
             }
         }
         // echo row data ##
         echo $pre . implode($seperator, $data) . $breaker;
     }
     // close doc wrapper..
     echo $doc_end;
     // stop PHP, so file can export correctly ##
     exit;
 }
 /**
  * Process content of CSV file
  *
  * @since 0.1
  **/
 public function generate_data()
 {
     // Check if the user clicked on the Save, Load, or Delete Settings buttons ##
     if (!isset($_POST['_wpnonce-q-eud-export-user-page_export']) || isset($_POST['load_export']) || isset($_POST['save_export']) || isset($_POST['delete_export'])) {
         return false;
     }
     // check admin referer ##
     check_admin_referer('q-eud-export-user-page_export', '_wpnonce-q-eud-export-user-page_export');
     // build argument array ##
     $args = array('fields' => isset($_POST['user_fields']) && '1' == $_POST['user_fields'] ? 'all' : array('ID'), 'role' => sanitize_text_field($_POST['role']));
     // did they request a specific program ? ##
     if (isset($_POST['program']) && $_POST['program'] != '') {
         $args['meta_key'] = 'member_of_club';
         $args['meta_value'] = (int) $_POST['program'];
         $args['meta_compare'] = '=';
     }
     // is there a range limit in place for the export ? ##
     if (isset($_POST['limit_total']) && $_POST['limit_total'] != '') {
         // let's just make sure they are integer values ##
         $limit_offset = isset($_POST['limit_offset']) ? (int) $_POST['limit_offset'] : 0;
         $limit_total = (int) $_POST['limit_total'];
         if (is_int($limit_offset) && is_int($limit_total)) {
             $args['offset'] = $limit_offset;
             $args['number'] = $limit_total;
             // number - Limit the total number of users returned ##
             // test it ##
             #wp_die( $this->pr( $args ) );
         }
     }
     // pre_user query ##
     add_action('pre_user_query', array($this, 'pre_user_query'));
     $users = get_users($args);
     remove_action('pre_user_query', array($this, 'pre_user_query'));
     // test args ##
     #wp_die( $this->pr ( $users ) );
     // no users found, so chuck an error into the args array and exit the export ##
     if (!$users) {
         wp_redirect(add_query_arg('error', 'empty', wp_get_referer()));
         exit;
     }
     // get sitename and clean it up ##
     $sitename = sanitize_key(get_bloginfo('name'));
     if (!empty($sitename)) {
         $sitename .= '.';
     }
     // export method ? ##
     $export_method = 'excel';
     // default to Excel export ##
     if (isset($_POST['format']) && $_POST['format'] != '') {
         $export_method = sanitize_text_field($_POST['format']);
     }
     // set export filename structure ##
     $filename = $sitename . 'users.' . date('Y-m-d-H-i-s');
     switch ($export_method) {
         case 'csv':
             // to csv ##
             header('Content-Description: File Transfer');
             header('Content-Disposition: attachment; filename=' . $filename . '.csv');
             header('Content-Type: text/csv; charset=' . get_option('blog_charset'), true);
             // set a csv check flag
             $is_csv = true;
             // nothing here
             $doc_begin = '';
             //preformat
             $pre = '';
             // how to seperate data ##
             $seperator = ',';
             // comma for csv ##
             // line break ##
             $breaker = "\n";
             // nothing here
             $doc_end = '';
             break;
         case 'excel':
             // to xls ##
             header('Content-Description: File Transfer');
             header("Content-Type: application/vnd.ms-excel");
             header("Content-Disposition: attachment; filename={$filename}.xls");
             header("Pragma: no-cache");
             header("Expires: 0");
             // set a csv check flag
             $is_csv = false;
             //grab the template file (for tidy formatting)
             include 'xml-template.php';
             // open xml
             $doc_begin = $xml_doc_begin;
             //preformat
             $pre = $xml_pre;
             // how to seperate data ##
             $seperator = $xml_seperator;
             // line break ##
             $breaker = $xml_breaker;
             // close xml
             $doc_end = $xml_doc_end;
             break;
     }
     // check for selected usermeta fields ##
     $usermeta = isset($_POST['usermeta']) ? $_POST['usermeta'] : '';
     #$this->pr( $usermeta );
     $usermeta_fields = array();
     if ($usermeta && is_array($usermeta)) {
         foreach ($usermeta as $field) {
             $usermeta_fields[] = sanitize_text_field($field);
         }
     }
     #$this->pr( $usermeta_fields );
     #exit;
     // check for selected x profile fields ##
     $bp_fields = isset($_POST['bp_fields']) ? $_POST['bp_fields'] : '';
     $bp_fields_passed = array();
     if ($bp_fields && is_array($bp_fields)) {
         foreach ($bp_fields as $field) {
             // reverse tidy ##
             $field = str_replace('__', ' ', sanitize_text_field($field));
             // add to array ##
             $bp_fields_passed[] = $field;
         }
     }
     // cwjordan: check for x profile fields we want update time for ##
     $bp_fields_update = isset($_POST['bp_fields_update_time']) ? $_POST['bp_fields_update_time'] : '';
     $bp_fields_update_passed = array();
     if ($bp_fields_update && is_array($bp_fields_update)) {
         foreach ($bp_fields_update as $field) {
             // reverse tidy ##
             $field = str_replace('__', ' ', sanitize_text_field($field));
             // add to array ##
             $bp_fields_update_passed[] = $field . " Update Date";
         }
     }
     // global wpdb object ##
     global $wpdb;
     // debug ##
     if (self::debug) {
         self::log('generate_data(): merging array');
     }
     // compile final fields list ##
     $fields = array_merge(self::get_user_fields(), self::get_special_fields(), $usermeta_fields, $bp_fields_passed, $bp_fields_update_passed);
     // test field array ##
     #self::pr( $fields );
     // build the document headers ##
     $headers = array();
     foreach ($fields as $key => $field) {
         // rename programs field ##
         if ($field == 'member_of_club') {
             $field = 'Program';
         }
         // grab fields to exclude from exports ##
         if (in_array($field, $this->get_exclude_fields())) {
             // ditch 'em ##
             unset($fields[$key]);
         } else {
             if ($is_csv) {
                 $headers[] = '"' . $field . '"';
             } else {
                 $headers[] = $field;
                 #echo '<script>console.log("Echoing header cell: '.$field.'")</script>';
             }
         }
     }
     // quick check ##
     #if ( self::debug ) self::log( 'All Fields: '. var_dump( $fields ) );
     #if ( self::debug ) self::log( '$bp_fields_passed: '. var_dump( $bp_fields_passed ) );
     // no more buffering while spitting back the export data ##
     ob_end_flush();
     // get the value in bytes allocated for Memory via php.ini ##
     // @link http://wordpress.org/support/topic/how-to-exporting-a-lot-of-data-out-of-memory-issue
     $memory_limit = $this->return_bytes(ini_get('memory_limit')) * 0.75;
     // we need to disable caching while exporting because we export so much data that it could blow the memory cache
     // if we can't override the cache here, we'll have to clear it later...
     if (function_exists('override_function')) {
         override_function('wp_cache_add', '$key, $data, $group="", $expire=0', '');
         override_function('wp_cache_set', '$key, $data, $group="", $expire=0', '');
         override_function('wp_cache_replace', '$key, $data, $group="", $expire=0', '');
         override_function('wp_cache_add_non_persistent_groups', '$key, $data, $group="", $expire=0', '');
     } elseif (function_exists('runkit_function_redefine')) {
         runkit_function_redefine('wp_cache_add', '$key, $data, $group="", $expire=0', '');
         runkit_function_redefine('wp_cache_set', '$key, $data, $group="", $expire=0', '');
         runkit_function_redefine('wp_cache_replace', '$key, $data, $group="", $expire=0', '');
         runkit_function_redefine('wp_cache_add_non_persistent_groups', '$key, $data, $group="", $expire=0', '');
     }
     // open doc wrapper.. ##
     echo $doc_begin;
     // echo headers ##
     echo $pre . implode($seperator, $headers) . $breaker;
     #wp_die( self::pr( $users ) );
     // build row values for each user ##
     foreach ($users as $user) {
         #wp_die( self::pr( $user ) );
         // check if we're hitting any Memory limits, if so flush them out ##
         // per http://wordpress.org/support/topic/how-to-exporting-a-lot-of-data-out-of-memory-issue?replies=2
         if (memory_get_usage(true) > $memory_limit) {
             wp_cache_flush();
         }
         // open up a new empty array ##
         $data = array();
         #wp_die( self::pr( $GLOBALS['bp'] ) );
         // BP loaded ? ##
         if (function_exists('bp_is_active') && bp_is_active('xprofile')) {
             // grab all user data ##
             $bp_data = BP_XProfile_ProfileData::get_all_for_user($user->ID);
         }
         // single query method - get all user_meta data ##
         $get_user_meta = (array) get_user_meta($user->ID);
         #wp_die( self::pr( $get_user_meta ) );
         // Filter out empty meta data ##
         #$get_user_meta = array_filter( array_map( function( $a ) {
         #    return $a[0];
         #}, $get_user_meta ) );
         // loop over each field ##
         foreach ($fields as $field) {
             // check if this is a BP field ##
             if (isset($bp_data) && isset($bp_data[$field]) && in_array($field, $bp_fields_passed)) {
                 // old way from single BP query ##
                 $value = $bp_data[$field];
                 if (is_array($value)) {
                     $value = maybe_unserialize($value['field_data']);
                     // suggested by @grexican ##
                     #$value = $value['field_data'];
                     /**
                      * cwjordan
                      * after unserializing it we then 
                      * need to implode it so 
                      * that we have something readable?
                      * Going to use :: as a separator
                      * because that's what Buddypress Members Import
                      * expects, but we might want to make that 
                      * configurable. 
                      */
                     if (is_array($value)) {
                         $value = implode("::", $value);
                     }
                 }
                 $value = self::sanitize($value);
                 // check if this is a BP field we want the updated date for ##
             } elseif (in_array($field, $bp_fields_update_passed)) {
                 global $bp;
                 $real_field = str_replace(" Update Date", "", $field);
                 $field_id = xprofile_get_field_id_from_name($real_field);
                 $value = $wpdb->get_var($wpdb->prepare("\n                                            SELECT last_updated \n                                            FROM {$bp->profile->table_name_data} \n                                            WHERE user_id = %d AND field_id = %d\n                                        ", $user->ID, $field_id));
                 // include the user's role in the export ##
             } elseif (isset($_POST['roles']) && '1' == $_POST['roles'] && $field == 'roles') {
                 // add "Role" as $value ##
                 $value = isset($user->roles[0]) ? implode($user->roles, '|') : '';
                 // empty value if no role found - or flat array of user roles ##
                 // include the user's BP group in the export ##
             } elseif (isset($_POST['groups']) && '1' == $_POST['groups'] && $field == 'groups') {
                 if (function_exists('groups_get_user_groups')) {
                     // check if user is a member of any groups ##
                     $group_ids = groups_get_user_groups($user->ID);
                     #self::pr( $group_ids );
                     #wp_die( pr( 'loaded group data.' ));
                     if (!$group_ids || $group_ids == '') {
                         $value = '';
                     } else {
                         // new empty array ##
                         $groups = array();
                         // loop over all groups ##
                         foreach ($group_ids["groups"] as $group_id) {
                             $groups[] = groups_get_group(array('group_id' => $group_id))->name . (end($group_ids["groups"]) == $group_id ? '' : '');
                         }
                         // implode it ##
                         $value = implode($groups, '|');
                     }
                 } else {
                     $value = '';
                 }
             } elseif ($field == 'bp_latest_update') {
                 // https://bpdevel.wordpress.com/2014/02/21/user-last_activity-data-and-buddypress-2-0/ ##
                 $value = bp_get_user_last_activity($user->ID);
                 // user or usermeta field ##
             } else {
                 // the user_meta key isset ##
                 if (isset($get_user_meta[$field])) {
                     // take from the bulk get_user_meta call - this returns an array in all cases, so we take the first key ##
                     $value = $get_user_meta[$field][0];
                     // standard WP_User value ##
                 } else {
                     // use the magically assigned value from WP_Users
                     $value = $user->{$field};
                 }
                 // the $value might be serialized ##
                 $value = self::unserialize($value);
                 // the value is an array ##
                 if (is_array($value)) {
                     // recursive implode it ##
                     $value = self::recursive_implode($value);
                 }
             }
             // correct program value to Program Name ##
             if ($field == 'member_of_club') {
                 $value = get_the_title($value);
             }
             // wrap values in quotes and add to array ##
             if ($is_csv) {
                 $data[] = '"' . str_replace('"', '""', self::special_characters($value)) . '"';
                 // just add to array ##
             } else {
                 $data[] = self::special_characters($value);
             }
         }
         // echo row data ##
         echo $pre . implode($seperator, $data) . $breaker;
     }
     // close doc wrapper..
     echo $doc_end;
     // stop PHP, so file can export correctly ##
     exit;
 }