/** * Address validation function * * Since 1.37.2 extracted from save_property and revalidate_all_addresses to make same functionality * * @global array $wp_properties * * @param integer $post_id * @param array $args * * @return array * @since 1.37.2 * @author odokienko@UD */ public static function revalidate_address($post_id, $args = array()) { global $wp_properties; $args = wp_parse_args($args, array('skip_existing' => 'false', 'return_geo_data' => false)); extract($args, EXTR_SKIP); $skip_existing = isset($skip_existing) ? $skip_existing : 'false'; $return_geo_data = isset($return_geo_data) ? $return_geo_data : false; $return = array(); $geo_data = false; $geo_data_coordinates = false; $latitude = get_post_meta($post_id, 'latitude', true); $longitude = get_post_meta($post_id, 'longitude', true); $current_coordinates = $latitude . $longitude; $address_is_formatted = get_post_meta($post_id, 'address_is_formatted', true); $address = get_post_meta($post_id, $wp_properties['configuration']['address_attribute'], true); $coordinates = empty($latitude) || empty($longitude) ? false : array('lat' => get_post_meta($post_id, 'latitude', true), 'lng' => get_post_meta($post_id, 'longitude', true)); if ($skip_existing == 'true' && !empty($current_coordinates) && in_array($address_is_formatted, array('1', 'true'))) { $return['status'] = 'skipped'; return $return; } if (!(empty($coordinates) && empty($address))) { /* will be true if address is empty and used manual_coordinates and coordinates is not empty */ $manual_coordinates = get_post_meta($post_id, 'manual_coordinates', true); $manual_coordinates = $manual_coordinates != 'true' && $manual_coordinates != '1' ? false : true; $address_by_coordinates = !empty($coordinates) && $manual_coordinates && empty($address); if (!empty($coordinates) && $manual_coordinates) { $geo_data_coordinates = WPP_F::geo_locate_address($address, $wp_properties['configuration']['google_maps_localization'], true, $coordinates); } elseif (!empty($address)) { $geo_data = WPP_F::geo_locate_address($address, $wp_properties['configuration']['google_maps_localization'], true); } /** if Address was invalid or empty but we have valid $coordinates we use them */ if (!empty($geo_data_coordinates->formatted_address) && ($address_by_coordinates || empty($geo_data->formatted_address))) { $geo_data = $geo_data_coordinates; /** clean up $address to remember that addres was empty or invalid*/ $address = ''; } if (empty($geo_data)) { $return['status'] = 'empty_address'; } } if (!empty($geo_data->formatted_address)) { foreach ((array) $wp_properties['geo_type_attributes'] + array('display_address') as $meta_key) { delete_post_meta($post_id, $meta_key); } update_post_meta($post_id, 'address_is_formatted', true); if (!empty($wp_properties['configuration']['address_attribute']) && (!$manual_coordinates || $address_by_coordinates)) { update_post_meta($post_id, $wp_properties['configuration']['address_attribute'], $geo_data->formatted_address); } foreach ($geo_data as $geo_type => $this_data) { if (in_array($geo_type, (array) $wp_properties['geo_type_attributes']) && !in_array($geo_type, array('latitude', 'longitude'))) { update_post_meta($post_id, $geo_type, $this_data); } } update_post_meta($post_id, 'wpp::last_address_validation', time()); if ($manual_coordinates) { $lat = !empty($coordinates['lat']) ? $coordinates['lat'] : 0; $lng = !empty($coordinates['lng']) ? $coordinates['lng'] : 0; } else { $lat = $geo_data->latitude; $lng = $geo_data->longitude; } update_post_meta($post_id, 'latitude', $lat); update_post_meta($post_id, 'longitude', $lng); if ($return_geo_data) { $return['geo_data'] = $geo_data; } $return['status'] = 'updated'; } //** Logs the last validation status for better troubleshooting */ update_post_meta($post_id, 'wpp::google_validation_status', isset($geo_data->status) ? $geo_data->status : 'success'); // Try to figure out what went wrong if (!empty($geo_data->status) && ($geo_data->status == 'OVER_QUERY_LIMIT' || $geo_data->status == 'REQUEST_DENIED')) { $return['status'] = 'over_query_limit'; } elseif (empty($address) && empty($geo_data)) { foreach ((array) $wp_properties['geo_type_attributes'] + array('display_address') as $meta_key) { delete_post_meta($post_id, $meta_key); } $return['status'] = 'empty_address'; update_post_meta($post_id, 'address_is_formatted', false); } elseif (empty($return['status'])) { $return['status'] = 'failed'; update_post_meta($post_id, 'address_is_formatted', false); } //** Neccessary meta data which is required by Supermap Premium Feature. Should be always set even the Supermap disabled. peshkov@UD */ if (!metadata_exists('post', $post_id, 'exclude_from_supermap')) { add_post_meta($post_id, 'exclude_from_supermap', 'false'); } return $return; }