function bps_set_request_data($form, $location) { global $bps_request_data; $meta = bps_meta($form); list($x, $fields) = bps_get_fields(); $request = stripslashes_deep($_REQUEST); $F = new stdClass(); $F->id = $form; $F->location = $location; $F->header = $meta['header']; $F->toggle = $meta['toggle'] == 'Enabled'; $F->toggle_text = $meta['button']; $F->action = get_page_link($meta['action']); $F->method = $meta['method']; $F->fields = array(); foreach ($meta['field_name'] as $k => $id) { if (empty($fields[$id])) { continue; } $field = $fields[$id]; $f = new stdClass(); $f->id = $id; $f->name = $field->name; $f->type = $field->type; $f->type = apply_filters('bps_field_criteria_type', $f->type, $field); // deprecated $f->type = apply_filters('bps_field_html_type', $f->type, $field); // deprecated $f->type = apply_filters('bps_field_request_data_type', $f->type, $field); // deprecated $f->type = apply_filters('bps_field_type_for_filters', $f->type, $field); $f->type = apply_filters('bps_field_type_for_search_form', $f->type, $field); $f->display = $f->type; $f->label = $custom_label = $meta['field_label'][$k]; if (empty($f->label)) { $f->label = $field->name; } $f->description = $meta['field_desc'][$k]; if (empty($f->description)) { $f->description = $field->description; } $range = isset($meta['field_range'][$k]); $f->code = 'field_' . $f->id; $f->value = ''; $f->values = array(); $f->options = array(); if ($range) { $f->display = 'range'; list($f->min, $f->max) = bps_minmax($request, $f->id, $f->type); } else { switch ($f->type) { case 'textbox': case 'number': case 'url': case 'textarea': $f->value = isset($request[$f->code]) ? $request[$f->code] : ''; break; case 'selectbox': case 'radio': case 'multiselectbox': case 'checkbox': $f->values = isset($request[$f->code]) ? (array) $request[$f->code] : array(); $f->options = bps_field_options($f->id); break; } } $f = apply_filters('bps_field_request_data', $f); $f = apply_filters('bps_field_data_for_filters', $f); $f = apply_filters('bps_field_data_for_search_form', $f); $F->fields[] = $f; if (!empty($custom_label)) { $cl = clone $f; $cl->display = 'hidden'; $cl->code = 'field_' . $f->id . '_label'; $cl->value = $custom_label; $F->fields[] = $cl; } } $bps_request_data = $F; return true; }
function bps_search($request) { global $bp, $wpdb; $done = array(); $results = array('users' => array(0), 'validated' => true); list($x, $fields) = bps_get_fields(); foreach ($request as $key => $value) { if ($value === '') { continue; } $split = explode('_', $key); if ($split[0] != 'field') { continue; } $id = $split[1]; $op = isset($split[2]) ? $split[2] : 'eq'; if (isset($done[$id]) || empty($fields[$id])) { continue; } $field = $fields[$id]; $field_type = $field->type; $field_type = apply_filters('bps_field_query_type', $field_type, $field); $field_type = apply_filters('bps_field_type_for_query', $field_type, $field); if (bps_custom_field($field_type)) { $found = apply_filters('bps_field_query', array(), $field, $key, $value); } else { $sql = $wpdb->prepare("SELECT user_id FROM {$bp->profile->table_name_data} WHERE field_id = %d ", $id); $sql = apply_filters('bps_field_sql', $sql, $field); if ($op == 'min' || $op == 'max') { if ($field_type == 'multiselectbox' || $field_type == 'checkbox') { continue; } list($min, $max) = bps_minmax($request, $id, $field_type); if ($min === '' && $max === '') { continue; } switch ($field_type) { case 'textbox': case 'number': case 'textarea': case 'selectbox': case 'radio': if ($min !== '') { $sql .= $wpdb->prepare("AND value >= %f", $min); } if ($max !== '') { $sql .= $wpdb->prepare("AND value <= %f", $max); } break; case 'datebox': $time = time(); $day = date("j", $time); $month = date("n", $time); $year = date("Y", $time); $ymin = $year - $max - 1; $ymax = $year - $min; if ($max !== '') { $sql .= $wpdb->prepare("AND DATE(value) > %s", "{$ymin}-{$month}-{$day}"); } if ($min !== '') { $sql .= $wpdb->prepare("AND DATE(value) <= %s", "{$ymax}-{$month}-{$day}"); } break; } } else { if ($op == 'eq') { if ($field_type == 'datebox') { continue; } switch ($field_type) { case 'textbox': case 'textarea': case 'url': $value = str_replace('&', '&', $value); $escaped = '%' . bps_esc_like($value) . '%'; $meta = bps_meta($request['bp_profile_search']); if ($meta['searchmode'] != 'EQUAL') { $sql .= $wpdb->prepare("AND value LIKE %s", $escaped); } else { $sql .= $wpdb->prepare("AND value LIKE %s", $value); } break; case 'number': $sql .= $wpdb->prepare("AND value = %d", $value); break; case 'selectbox': case 'radio': $values = (array) $value; $parts = array(); foreach ($values as $value) { $value = str_replace('&', '&', $value); $parts[] = $wpdb->prepare("value = %s", $value); } $sql .= 'AND (' . implode(' OR ', $parts) . ')'; break; case 'multiselectbox': case 'checkbox': $values = (array) $value; $parts = array(); foreach ($values as $value) { $value = str_replace('&', '&', $value); $escaped = '%:"' . bps_esc_like($value) . '";%'; $parts[] = $wpdb->prepare("value LIKE %s", $escaped); } $match = apply_filters('bps_field_checkbox_match_all', false, $id) ? ' AND ' : ' OR '; $sql .= 'AND (' . implode($match, $parts) . ')'; break; } } else { continue; } } $found = $wpdb->get_col($sql); } $users = isset($users) ? array_intersect($users, $found) : $found; if (count($users) == 0) { return $results; } $done[$id] = true; } if (count($done) == 0) { $results['validated'] = false; return $results; } $results['users'] = $users; return $results; }