zpid = $zpid; $this->scrapper = new LFZW_Fr_Scrapper(); } /** * Fetch main property details. * * @return array */ private function fetch_property_data(): array { try { $url = "https://private-zillow.p.rapidapi.com/pro/byzpid?zpid=" . $this->zpid; $response = $this->scrapper->make_request( $url ); $data = json_decode( $response, true ); if(isset($data['zillowURL'])) { $this->zillow_url = $data['zillowURL']; } if(isset($data['propertyDetails'])) { return $data['propertyDetails']; } } catch(Exception $e) { error_log("Unable to fetch property data - " . $this->zpid . " - " . $e->getMessage()); } return []; } /** * Public method to return formatted listing data. * * @return array */ public function get_data(): array { $property_data = $this->fetch_property_data(); $formatted = []; // General info $formatted['beds'] = isset($property_data['bedrooms']) ? absint($property_data['bedrooms']) : ''; $formatted['baths'] = isset($property_data['bathrooms']) ? absint($property_data['bathrooms']) : ''; $formatted['lat'] = isset($property_data['latitude']) ? floatval($property_data['latitude']) : ''; $formatted['long'] = isset($property_data['longitude']) ? floatval($property_data['longitude']) : ''; $formatted['address'] = isset($property_data['streetAddress']) ? sanitize_text_field($property_data['streetAddress']) : ''; $formatted['city'] = isset($property_data['city']) ? sanitize_text_field($property_data['city']) : ''; $formatted['state'] = isset($property_data['state']) ? sanitize_text_field($property_data['state']) : ''; $formatted['zip'] = isset($property_data['zipcode']) ? sanitize_text_field($property_data['zipcode']) : ''; $formatted['desc'] = isset($property_data['description']) ? wp_kses_post($property_data['description']) : ''; $formatted['price'] = isset($property_data['price']) ? sanitize_text_field($property_data['price']) : 'N/A'; $formatted['details_url'] = $this->zillow_url ? esc_url_raw($this->zillow_url) : ''; $formatted['area'] = isset($property_data['livingArea']) ? sanitize_text_field($property_data['livingArea']) : ''; if(!$formatted['area']) { $formatted['area'] = isset($property_data['lotSize']) ? sanitize_text_field($property_data['lotSize']) : ''; } // Contact info $contact_info = []; if (isset($property_data['attributionInfo'])) { $attributionInfo = $property_data['attributionInfo']; $contact_info['agentName'] = isset($attributionInfo['agentName']) ? sanitize_text_field($attributionInfo['agentName']) : ''; $contact_info['brokerName'] = isset($attributionInfo['brokerName']) ? sanitize_text_field($attributionInfo['brokerName']) : ''; $contact_info['phoneNumber'] = isset($attributionInfo['agentPhoneNumber']) ? sanitize_text_field($attributionInfo['agentPhoneNumber']) : ''; } $formatted['contact_info'] = $contact_info; $metadata = []; // Zillow Facts $fact_info = []; if (isset($property_data['resoFacts'])) { $resoFacts = $property_data['resoFacts']; $facts = $resoFacts['atAGlanceFacts'] ?? []; foreach ($facts as $fact) { if (!empty($fact['factLabel']) && $fact['factLabel'] !== 'Days on Zillow') { $fact_info[] = [ 'key' => sanitize_text_field($fact['factLabel']), 'value' => isset($fact['factValue']) ? sanitize_text_field($fact['factValue']) : 'N/A' ]; } } $fact_info[] = [ 'key' => 'Appliances', 'value' => isset($resoFacts['appliances']) && is_array($resoFacts['appliances']) ? sanitize_text_field(implode(', ', $resoFacts['appliances'])) : 'N/A' ]; $fact_info[] = [ 'key' => 'Storage', 'value' => isset($resoFacts['interiorFeatures']) && is_array($resoFacts['interiorFeatures']) ? sanitize_text_field(implode(', ', $resoFacts['interiorFeatures'])) : 'N/A' ]; $fact_info[] = [ 'key' => 'Flooring', 'value' => isset($resoFacts['flooring']) && is_array($resoFacts['flooring']) ? sanitize_text_field(implode(', ', $resoFacts['flooring'])) : 'N/A' ]; // Rooms $rooms_info = []; $rooms = $resoFacts['rooms'] ?? []; foreach ($rooms as $room) { if (!empty($room['roomArea'])) { $rooms_info[] = [ 'roomType' => sanitize_text_field($room['roomType'] ?? ''), 'roomArea' => sanitize_text_field($room['roomArea']), 'roomDimensions' => sanitize_text_field($room['roomDimensions'] ?? ''), 'roomFeatures' => isset($room['roomFeatures']) && is_array($room['roomFeatures']) ? sanitize_text_field(implode(', ', $room['roomFeatures'])) : '' ]; } } $metadata['rooms_info'] = $rooms_info; $metadata['parking_info'] = [ 'totalCapacity' => sanitize_text_field($resoFacts['parkingCapacity'] ?? 'N/A'), 'coveredCapacity' => sanitize_text_field($resoFacts['coveredParkingCapacity'] ?? 'N/A'), 'openCapacity' => sanitize_text_field($resoFacts['openParkingCapacity'] ?? 'N/A'), 'garageCapacity' => sanitize_text_field($resoFacts['garageParkingCapacity'] ?? 'N/A'), 'features' => isset($resoFacts['parkingFeatures']) && is_array($resoFacts['parkingFeatures']) ? sanitize_text_field(implode(', ', $resoFacts['parkingFeatures'])) : 'N/A' ]; $metadata['accessibilty_info'] = [ 'features' => isset($resoFacts['accessibilityFeatures']) && is_array($resoFacts['accessibilityFeatures']) ? sanitize_text_field(implode(', ', $resoFacts['accessibilityFeatures'])) : 'N/A' ]; $metadata['construction_info'] = [ 'homeType' => sanitize_text_field($resoFacts['homeType'] ?? 'N/A'), 'propertySubType' => isset($resoFacts['propertySubType']) && is_array($resoFacts['propertySubType']) ? sanitize_text_field(implode(', ', $resoFacts['propertySubType'])) : 'N/A', 'material' => isset($resoFacts['constructionMaterials']) && is_array($resoFacts['constructionMaterials']) ? sanitize_text_field(implode(', ', $resoFacts['constructionMaterials'])) : 'N/A' ]; $metadata['utils'] = [ 'sewer' => isset($resoFacts['sewer']) && is_array($resoFacts['sewer']) ? sanitize_text_field(implode(', ', $resoFacts['sewer'])) : 'N/A', 'electric' => isset($resoFacts['electric']) && is_array($resoFacts['electric']) ? sanitize_text_field(implode(', ', $resoFacts['electric'])) : 'N/A', 'waterSource' => isset($resoFacts['waterSource']) && is_array($resoFacts['waterSource']) ? sanitize_text_field(implode(', ', $resoFacts['waterSource'])) : 'N/A', ]; $metadata['community_info'] = [ 'ammenities' => isset($resoFacts['associationAmenities']) && is_array($resoFacts['associationAmenities']) ? sanitize_text_field(implode(', ', $resoFacts['associationAmenities'])) : 'N/A', 'services' => isset($resoFacts['associationFeeIncludes']) && is_array($resoFacts['associationFeeIncludes']) ? sanitize_text_field(implode(', ', $resoFacts['associationFeeIncludes'])) : 'N/A', 'hoaFee' => sanitize_text_field($resoFacts['hoaFee'] ?? 'N/A') ]; } $metadata['fact_info'] = $fact_info; // Nearby Schools $nearby_schools = []; if (!empty($property_data['schools'])) { foreach ($property_data['schools'] as $schl) { if (!empty($schl['name'])) { $nearby_schools[] = [ 'name' => sanitize_text_field($schl['name']), 'grades' => sanitize_text_field($schl['grades'] ?? ''), 'distance' => sanitize_text_field($schl['distance'] ?? ''), 'rating' => sanitize_text_field($schl['rating'] ?? ''), 'link' => esc_url_raw($schl['link'] ?? ''), ]; } } } $metadata['nearby_schools'] = $nearby_schools; $formatted['metadata'] = $metadata; // Images $images_data = []; if(isset($property_data['originalPhotos'])) { $images_data = $property_data['originalPhotos']; } // [0] -d_d --> 800 width // [1] -o_a --> 1024 width // [2] -uncropped_scaled_within_1344_1008 --> 1344 width // [3] -uncropped_scaled_within_1536_1152 --> 1536 width $images = []; foreach ($images_data as $img) { if(isset($img['mixedSources']) && isset($img['mixedSources']['webp'])) { if (!empty($img['mixedSources']['webp'])) { $images[] = esc_url_raw($img['mixedSources']['webp'][0]['url']); } } } $formatted['images'] = $images; return $formatted; } }