Skip to content

Instantly share code, notes, and snippets.

@riccoski
Created January 13, 2019 21:08
Show Gist options
  • Save riccoski/09ded8bc8aa7d24b2f0673ad7a95df22 to your computer and use it in GitHub Desktop.
Save riccoski/09ded8bc8aa7d24b2f0673ad7a95df22 to your computer and use it in GitHub Desktop.
<?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