Created
January 13, 2019 21:08
-
-
Save riccoski/09ded8bc8aa7d24b2f0673ad7a95df22 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
$response = array(); // Define empty response object | |
$filterArr = $_GET; | |
// var_dump(json_decode(stripslashes($filterArr['gender']))); | |
// var_dump($filterArr['gender']); | |
// == QUERY: SUBJECT | |
$subjectString = (!empty($_GET['subject']) && $_GET['subject'] != "any" ? "subject.name LIKE '%" . $_GET['subject'] . "%' AND " : "" ); | |
// == QUERY: LIMIT | |
$limit_query = 'LIMIT 30'; | |
// == QUERY: LOCATION | |
if ( isset($filterArr['location']) ): | |
$post_code = $filterArr['location']; | |
elseif ( is_user_logged_in() && !empty(get_user_meta(get_current_user_id(), 'post_code', true)) ): | |
$post_code = get_user_meta(get_current_user_id(), 'post_code', true); | |
endif; | |
// == QUERY: GENDER | |
$gender_query = ''; | |
if ( isset($filterArr['gender']) ): | |
$_gender = json_decode(stripslashes($filterArr['gender'])); | |
// var_dump($_gender->male); | |
$_gender->male = ( isset($_gender->male) ? $_gender->male : false ); | |
$_gender->female = ( isset($_gender->female) ? $_gender->female : false ); | |
if ( $_gender->male && !$_gender->female ) | |
$gender_query = "AND gender.meta_value = 'male'"; | |
elseif ( $_gender->female && !$_gender->male ) | |
$gender_query = "AND gender.meta_value = 'female'"; | |
endif; | |
// == QUERY: TUTORING TYPE | |
$tutoring_type_query = ''; | |
if ( isset($filterArr['tutoring_type']) ) { | |
$_tutoring_type = json_decode(stripslashes($filterArr['tutoring_type'])); | |
$_tutoring_type->person = ( isset($_tutoring_type->person) ? $_tutoring_type->person: false ); | |
$_tutoring_type->online = ( isset($_tutoring_type->online) ? $_tutoring_type->online: false ); | |
if ( $_tutoring_type->person && !$_tutoring_type->online ): | |
$tutoring_type_query = "AND usermeta.meta_value = 'person'"; | |
elseif ( $_tutoring_type->online && !$_tutoring_type->person ): | |
$tutoring_type_query = "AND usermeta.meta_value = 'online'"; | |
endif; | |
} | |
// == QUERY: AVERAGE RATING | |
if ( isset($filterArr['minRating']) ) { | |
$min_rating_query = "AND usermeta.meta_value = " . $filterArr['minRating']; | |
} | |
// == QUERY: MIN RATE | |
if ( isset($filterArr['minRate']) && !empty($filterArr['minRate']) ) { | |
$min_rate_query = " AND t.rate >= " . $filterArr['minRate']; | |
} else { | |
$min_rate_query = ""; | |
} | |
// == QUERY: MAX RATE | |
if ( isset($filterArr['maxRate']) && !empty($filterArr['maxRate']) ) { | |
$max_rate_query = " AND t.rate <= " . $filterArr['maxRate']; | |
} else { | |
$max_rate_query = ""; | |
} | |
// == QUERY: DISTANCE | |
if ( isset($post_code)): | |
// == QUERY: DISTANCE LIMIT | |
$distanceLimit = ( isset($filterArr['distance']) && $filterArr['distance'] != 'any' ? | |
'HAVING distance <= ' . $filterArr['distance'] : '' ); | |
$geoCoordinates = postalToCoordinates($post_code); | |
// Update the user lat and long | |
$lat = $geoCoordinates['lat']; | |
$lng = $geoCoordinates['lng']; | |
global $wpdb; | |
$results = $wpdb->get_results( "SELECT *, GROUP_CONCAT(t.rate) AS tutor_rates, ((ACOS(SIN($lat * PI() / 180) * SIN(mtlat.meta_value * PI() / 180) + COS($lat * PI() / 180) * COS(mtlat.meta_value * PI() / 180) * COS(($lng - mtlng.meta_value) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance | |
FROM | |
ts_pods_usersubject AS t | |
LEFT JOIN ts_podsrel AS rel_author ON rel_author.field_id = 143 AND rel_author.item_id = t.id | |
LEFT JOIN ts_users AS author ON author.ID = rel_author.related_item_id | |
LEFT JOIN ts_podsrel AS rel_subject ON rel_subject.field_id = 145 AND rel_subject.item_id = t.id | |
LEFT JOIN ts_pods_subject AS subject ON subject.id = rel_subject.related_item_id | |
LEFT JOIN ts_usermeta AS usermeta ON usermeta.user_id = author.ID | |
INNER JOIN ts_usermeta AS gender ON (author.ID = gender.user_id AND gender.meta_key = 'user_gender') | |
INNER JOIN ts_usermeta AS home_tutoring ON (author.ID = home_tutoring.user_id AND home_tutoring.meta_key = 'home_tutoring') | |
INNER JOIN ts_usermeta AS online_tutoring ON (author.ID = online_tutoring.user_id AND online_tutoring.meta_key = 'online_tutoring') | |
INNER JOIN ts_usermeta AS mtlat ON (author.ID = mtlat.user_id AND mtlat.meta_key = 'latitude') | |
INNER JOIN ts_usermeta AS mtlng ON (author.ID = mtlng.user_id AND mtlng.meta_key = 'longtitude') | |
WHERE (" . $subjectString . "usermeta.meta_key = 'ts_capabilities' $min_rate_query $max_rate_query AND usermeta.meta_value LIKE '%" . (is_tutor() ? 'student' : 'tutor') . "%') $gender_query GROUP BY author.ID $distanceLimit $limit_query", OBJECT ); | |
else: | |
global $wpdb; | |
$results = $wpdb->get_results( "SELECT author.ID, GROUP_CONCAT(t.rate) AS tutor_rates | |
FROM | |
ts_pods_usersubject AS t | |
LEFT JOIN ts_podsrel AS rel_author ON rel_author.field_id = 143 AND rel_author.item_id = t.id | |
LEFT JOIN ts_users AS author ON author.ID = rel_author.related_item_id | |
LEFT JOIN ts_podsrel AS rel_subject ON rel_subject.field_id = 145 AND rel_subject.item_id = t.id | |
LEFT JOIN ts_pods_subject AS subject ON subject.id = rel_subject.related_item_id | |
LEFT JOIN ts_usermeta AS usermeta ON usermeta.user_id = author.ID | |
INNER JOIN ts_usermeta AS gender ON (author.ID = gender.user_id AND gender.meta_key = 'user_gender') | |
WHERE ($subjectString usermeta.meta_key = 'ts_capabilities' $min_rate_query $max_rate_query AND usermeta.meta_value LIKE '%" . (is_tutor() ? 'student' : 'tutor') . "%') $gender_query GROUP BY author.ID $limit_query", OBJECT ); | |
endif; | |
$response = array(); // JSON array empty | |
foreach ( $results as $result ): | |
$_user = get_user_by( 'id', $result->ID ); | |
$_userReviews = reviews_summary($_user->ID); | |
$user_subjects = function($tutorId) { | |
$subjects_arr = array(); //Create empty array for JSON subjects | |
// Set the properties to get the user's subject | |
$params = array( | |
'orderby' => 'subject.name DESC', | |
'limit' => -1, | |
'where' => 'author.ID != "' . $tutorId . '"' | |
); | |
$subjects = pods( 'usersubject', $params ); | |
while ( $subjects->fetch() ): | |
$subjects_arr[] = $subjects->field('subject.name'); | |
endwhile; | |
return $subjects_arr; | |
}; | |
// echo $result->tutor_rates; | |
//Create user object | |
$tutor['id'] = $_user->ID; | |
$tutor['firstname'] = ucwords(strtolower($_user->first_name)); | |
$tutor['lastname'] = ''; //ucwords(substr($_user->last_name , 0, 1)); | |
$tutor['url'] = get_site_url() . "/" . (is_tutor($_user->ID) ? 'tutor': 'student') . "/" . $_user->user_login; | |
$tutor['avatar'] = get_avatar_url($_user->ID, 512); | |
$tutor['badges'] = get_user_badges($_user->ID); | |
$tutor['subjects'] = get_user_subjects($_user->ID); | |
$tutor['tutorType'] = array('online' => $_user->online_tutoring, 'person' => $_user->home_tutoring); | |
$tutor['distance'] = ( isset($result->distance) ? round($result->distance, 1) : null ); | |
$tutor['rate'] = get_final_rate($result->tutor_rates); // TODO: Get the rate of the searched subject | |
$tutor['reviews']['count'] = $_userReviews['count']; | |
$tutor['reviews']['averageRating'] = (is_tutor($_user->ID) ? $_userReviews['averageRating'] : null); //TODO: Calculate the user rating | |
$tutor['gender'] = $_user->gender; | |
$tutor['verified'] = (is_tutor($_user->ID) ? $_user->is_verified : false); | |
$tutor['headline'] = $_user->headline; | |
$tutor['type'] = (is_tutor($_user->ID) ? 'tutor': 'student'); | |
$response[] = $tutor; //Append to the JSON object | |
endforeach; | |
echo json_encode($response); | |
?> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment