Changeset 3366929
- Timestamp:
- 09/24/2025 06:27:49 AM (6 months ago)
- Location:
- mlsimport
- Files:
-
- 18 edited
- 1 copied
-
tags/6.1.2 (copied) (copied from mlsimport/trunk)
-
tags/6.1.2/README.MD (modified) (2 diffs)
-
tags/6.1.2/admin/class-mlsimport-admin.php (modified) (12 diffs)
-
tags/6.1.2/enviroment/EstateClass.php (modified) (1 diff)
-
tags/6.1.2/enviroment/HouzezClass.php (modified) (3 diffs)
-
tags/6.1.2/enviroment/RealHomesClass.php (modified) (2 diffs)
-
tags/6.1.2/enviroment/ResidenceClass.php (modified) (11 diffs)
-
tags/6.1.2/includes/ThemeImport.php (modified) (52 diffs)
-
tags/6.1.2/mlsimport.php (modified) (1 diff)
-
tags/6.1.2/readme.txt (modified) (2 diffs)
-
trunk/README.MD (modified) (2 diffs)
-
trunk/admin/class-mlsimport-admin.php (modified) (12 diffs)
-
trunk/enviroment/EstateClass.php (modified) (1 diff)
-
trunk/enviroment/HouzezClass.php (modified) (3 diffs)
-
trunk/enviroment/RealHomesClass.php (modified) (2 diffs)
-
trunk/enviroment/ResidenceClass.php (modified) (11 diffs)
-
trunk/includes/ThemeImport.php (modified) (52 diffs)
-
trunk/mlsimport.php (modified) (1 diff)
-
trunk/readme.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
mlsimport/tags/6.1.2/README.MD
r3357685 r3366929 5 5 Tested up to: 6.7.1 6 6 Requires PHP: 7.4 7 Stable Tag: 6.1. 17 Stable Tag: 6.1.2 8 8 License: GPLv3 9 9 License URI: https://www.gnu.org/licenses/gpl-3.0.html … … 84 84 85 85 == Changelog == 86 = 6.1.2 = 87 Fix for Realtor.ca on property room parsing 86 88 87 89 = 6.1.1 = -
mlsimport/tags/6.1.2/admin/class-mlsimport-admin.php
r3357653 r3366929 1042 1042 1043 1043 delete_option( 'mlsimport_mls_metadata_populated' ); 1044 //error_log('deleting '.$prev_mls.' - '.$mls_name);1045 1044 1046 1045 delete_option( 'mlsimport_admin_fields_select' ); … … 1183 1182 * @param WP_Post $post The post object. 1184 1183 */ 1185 public function mlsimport_saas_display_meta_options($post) {1184 public function mlsimport_saas_display_meta_options($post) { 1186 1185 wp_nonce_field(plugin_basename(__FILE__), 'estate_agent_noncename'); 1187 1186 global $mlsimport; … … 1250 1249 */ 1251 1250 private function generateMetaOptionsHtml($postId, $foundItems, $lastDate, $mlsimportItemHowMany, $mlsimportItemStatCron, $mlsimportMlsId, $fieldImport, $hasError = false) { 1251 1252 1252 1253 1253 ob_start(); … … 1588 1588 public function mlsimport_saas_start_cron_links_per_item( $item_id ) { 1589 1589 // Log memory before start 1590 //error_log("[MLSimport] Start $item_id, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");1591 1590 1592 1591 $last_date = $this->mlsimport_saas_get_last_date( $item_id ); … … 1597 1596 // Make request to MLS API 1598 1597 $mlsrequest = $this->mlsimport_make_listing_requests( $item_id, $last_date ); 1599 //error_log("[MLSimport] After mlsimport_make_listing_requests, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");1600 1598 1601 1599 $found_items = 0; … … 1619 1617 // Potentially large array, log memory before/after 1620 1618 $attachments_to_move = (array) $this->mlsimport_saas_generate_import_requests_per_item( $item_id_array, $last_date ); 1621 //error_log("[MLSimport] After generate_import_requests_per_item, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");1622 1619 1623 1620 // Store in post meta (beware if array is huge) … … 1641 1638 unset($attachments_to_move, $attachments_to_send, $mlsrequest, $item_id_array); 1642 1639 gc_collect_cycles(); 1643 //error_log("[MLSimport] End processing $item_id, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");1644 1640 } 1645 1641 } … … 2397 2393 ); 2398 2394 2399 //error_log(json_encode($item_id_array));2400 //error_log("starting post id ".$post_id);2401 2395 2402 2396 update_post_meta( $post_id, 'mlsimport_attach_to_move_' . $post_id, '' ); … … 2542 2536 $how_many = 10000; 2543 2537 } 2544 //error_log('updating for '.$prop_id.' with'. $how_many);2545 2538 update_post_meta($prop_id,'mlsimport_task_to_import', intval($how_many) ); 2546 2539 … … 2599 2592 2600 2593 $total_batches = count( $attachments_to_move ); 2601 2602 //error_log('$total_batches '. json_encode($total_batches) );2603 2604 2605 2594 2606 2595 // removed because $this … … 2631 2620 mlsimport_saas_single_write_import_custom_logs( $log ); 2632 2621 $log = 'Parsing import batch: ' . ( $key + 1 ) . ' of ' . $total_batches . '. Memory used: ' . $mem_usage_show . ' MB.' . PHP_EOL; 2633 //error_log($log);2634 2622 2635 2623 … … 2669 2657 //new stats 2670 2658 update_post_meta( $mlsimportItemId, 'mlsimport_progress_batches', $total_batches ); 2671 update_post_meta( $mlsimportItemId, 'mlsimport_progress_memory', $final_mem_usage_show );2659 update_post_meta( $mlsimportItemId, 'mlsimport_progress_memory', $final_mem_usage_show ); 2672 2660 2673 2661 -
mlsimport/tags/6.1.2/enviroment/EstateClass.php
r3357653 r3366929 46 46 * @var string $plugin_name 47 47 */ 48 public function enviroment_image_save( $property_id, $attach_id ) { 49 return; 50 } 48 public function enviroment_image_save( $property_id, $attach_id ) { 49 return; 50 } 51 52 /** 53 * Format extra meta values into a safe string representation. 54 */ 55 private function normalizeExtraMetaValue($meta_value) { 56 if (is_array($meta_value)) { 57 $normalized = array(); 58 59 foreach ($meta_value as $value) { 60 if (is_array($value)) { 61 $encoded = function_exists('wp_json_encode') ? wp_json_encode($value) : json_encode($value); 62 63 if (false !== $encoded && null !== $encoded) { 64 $normalized[] = $encoded; 65 } 66 } else { 67 $value = trim((string) $value); 68 if ('' !== $value) { 69 $normalized[] = $value; 70 } 71 } 72 } 73 74 if (empty($normalized)) { 75 return ''; 76 } 77 78 return implode(', ', $normalized); 79 } 80 81 return preg_replace('/\s*,\s*/', ', ', trim((string) $meta_value)); 82 } 83 84 /** 85 * Format Rooms extra meta entries into a single string. 86 */ 87 private function formatRoomsExtraMeta($rooms) { 88 if (!is_array($rooms) || empty($rooms)) { 89 return ''; 90 } 91 92 $formatted_rooms = array(); 93 94 foreach ($rooms as $room_details) { 95 if (!is_array($room_details)) { 96 continue; 97 } 98 99 $room_type = isset($room_details['RoomType']) ? trim((string) $room_details['RoomType']) : ''; 100 $room_level = isset($room_details['RoomLevel']) ? trim((string) $room_details['RoomLevel']) : ''; 101 $room_length = isset($room_details['RoomLength']) ? trim((string) $room_details['RoomLength']) : ''; 102 $room_width = isset($room_details['RoomWidth']) ? trim((string) $room_details['RoomWidth']) : ''; 103 $room_units = isset($room_details['RoomLengthWidthUnits']) ? trim((string) $room_details['RoomLengthWidthUnits']) : ''; 104 105 if ($room_type === '') { 106 continue; 107 } 108 109 $details = array(); 110 if ($room_level !== '') { 111 $details[] = $room_level; 112 } 113 114 $dimension = ''; 115 if ($room_length !== '' && $room_width !== '') { 116 $dimension = $room_length . ' x ' . $room_width; 117 } elseif ($room_length !== '') { 118 $dimension = $room_length; 119 } elseif ($room_width !== '') { 120 $dimension = $room_width; 121 } 122 123 if ($dimension !== '') { 124 if ($room_units !== '') { 125 $dimension .= ' ' . $room_units; 126 } 127 $details[] = $dimension; 128 } elseif ($room_units !== '') { 129 $details[] = $room_units; 130 } 131 132 $formatted_value = $room_type; 133 if (!empty($details)) { 134 $formatted_value .= ': ' . implode(', ', $details); 135 } 136 137 $formatted_rooms[] = $formatted_value; 138 } 139 140 return implode(' | ', $formatted_rooms); 141 } 51 142 52 143 /** 53 144 * Deal with extra meta 54 145 */ 55 public function mlsimportSaasSetExtraMeta( $property_id, $property ) { 56 $property_history = ''; 57 $extra_meta_log = ''; 58 $answer = array(); 59 $options = get_option( 'mlsimport_admin_fields_select' ); 60 $permited_meta = $options['mls-fields']; 61 62 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 63 $meta_properties = $property['extra_meta']; 64 foreach ( $meta_properties as $meta_name => $meta_value ) : 65 // check if extra meta is set to import 66 if ( ! isset( $permited_meta[ $meta_name ] ) ) { 67 // we do not have the extra meta 68 continue; 69 } elseif ( isset( $permited_meta[ $meta_name ] ) && intval( $permited_meta[ $meta_name ] ) === 0 ) { 70 // meta exists but is set to no 71 continue; 72 } 73 74 $meta_name = strtolower( $meta_name ); 75 if ( is_array( $meta_value ) ) { 76 $meta_value = implode( ', ', array_map( 'trim', $meta_value ) ); 77 } else { 78 $meta_value = preg_replace( '/\s*,\s*/', ', ', trim( $meta_value ) ); 79 } 80 update_post_meta( $property_id, $meta_name, $meta_value ); 81 82 if( isset( $options['mls-fields-map-postmeta'][ $meta_name ]) && $options['mls-fields-map-postmeta'][ $meta_name ]!=='' ){ 83 $new_post_meta_key=$options['mls-fields-map-postmeta'][ $meta_name ]; 84 update_post_meta( $property_id, $new_post_meta_key, $meta_value ); 85 $property_history .= 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name . ' and value ' . $meta_value . '</br>'; 86 } 87 88 89 $property_history .= 'Updated EXTRA Meta ' . $meta_name . ' with meta_value ' . $meta_value . '</br>'; 90 $extra_meta_log .= 'Property with ID ' . $property_id . ' Updated EXTRA Meta ' . $meta_name . ' with value ' . $meta_value . PHP_EOL; 91 endforeach; 92 93 $answer['property_history'] = $property_history; 94 $answer['extra_meta_log'] = $extra_meta_log; 95 } 96 97 $answer = $this->mlsimport_saas_set_extra_meta_features( $property_id, $property, $answer ); 98 99 return $answer; 100 } 146 public function mlsimportSaasSetExtraMeta( $property_id, $property ) { 147 $property_history = ''; 148 $extra_meta_log = ''; 149 $answer = array(); 150 $options = get_option( 'mlsimport_admin_fields_select' ); 151 $permited_meta = isset( $options['mls-fields'] ) ? $options['mls-fields'] : array(); 152 153 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 154 $meta_properties = $property['extra_meta']; 155 156 foreach ( $meta_properties as $meta_name => $meta_value ) { 157 if ( ! isset( $permited_meta[ $meta_name ] ) || intval( $permited_meta[ $meta_name ] ) === 0 ) { 158 continue; 159 } 160 161 if ( 'Rooms' === $meta_name && is_array( $meta_value ) ) { 162 $formatted_rooms = $this->formatRoomsExtraMeta( $meta_value ); 163 if ( '' !== $formatted_rooms ) { 164 update_post_meta( $property_id, 'rooms', $formatted_rooms ); 165 $property_history .= 'Updated EXTRA Meta rooms</br>'; 166 $extra_meta_log .= 'Property with ID ' . $property_id . ' Updated EXTRA Meta rooms with value ' . $formatted_rooms . PHP_EOL; 167 } 168 continue; 169 } 170 171 $normalized_value = $this->normalizeExtraMetaValue( $meta_value ); 172 $meta_key = strtolower( $meta_name ); 173 174 update_post_meta( $property_id, $meta_key, $normalized_value ); 175 176 if ( isset( $options['mls-fields-map-postmeta'][ $meta_key ] ) && $options['mls-fields-map-postmeta'][ $meta_key ] !== '' ) { 177 $new_post_meta_key = $options['mls-fields-map-postmeta'][ $meta_key ]; 178 update_post_meta( $property_id, $new_post_meta_key, $normalized_value ); 179 $property_history .= 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_key . ' and value ' . $normalized_value . '</br>'; 180 } 181 182 $property_history .= 'Updated EXTRA Meta ' . $meta_key . ' with meta_value ' . $normalized_value . '</br>'; 183 $extra_meta_log .= 'Property with ID ' . $property_id . ' Updated EXTRA Meta ' . $meta_key . ' with value ' . $normalized_value . PHP_EOL; 184 } 185 186 $answer['property_history'] = $property_history; 187 $answer['extra_meta_log'] = $extra_meta_log; 188 } 189 190 $answer = $this->mlsimport_saas_set_extra_meta_features( $property_id, $property, $answer ); 191 192 return $answer; 193 } 101 194 102 195 public function mlsimport_saas_set_extra_meta_features( $property_id, $property, $answer ) { -
mlsimport/tags/6.1.2/enviroment/HouzezClass.php
r3357653 r3366929 50 50 */ 51 51 public function enviroment_image_save( $property_id, $attach_id ) { 52 ////error_log(' for '.$property_id.' adding '.$attach_id);53 52 add_post_meta( $property_id, 'fave_property_images', intval( $attach_id ) ); 54 53 } … … 61 60 * @var string $plugin_name 62 61 */ 63 public function enviroment_image_save_gallery( $property_id, $post_attachments ) {62 public function enviroment_image_save_gallery( $property_id, $post_attachments ) { 64 63 return; 65 } 66 67 68 public function return_extra_fields( $property_id ) { 64 } 65 66 67 /** 68 * Format extra meta values into a safe string representation. 69 */ 70 private function normalizeExtraMetaValue($meta_value) { 71 if (is_array($meta_value)) { 72 $normalized = array(); 73 74 foreach ($meta_value as $value) { 75 if (is_array($value)) { 76 $encoded = function_exists('wp_json_encode') ? wp_json_encode($value) : json_encode($value); 77 78 if (false !== $encoded && null !== $encoded) { 79 $normalized[] = $encoded; 80 } 81 } else { 82 $value = trim((string) $value); 83 if ('' !== $value) { 84 $normalized[] = $value; 85 } 86 } 87 } 88 89 if (empty($normalized)) { 90 return ''; 91 } 92 93 return implode(', ', $normalized); 94 } 95 96 return preg_replace('/\s*,\s*/', ', ', trim((string) $meta_value)); 97 } 98 99 /** 100 * Format Rooms extra meta entries into a single string. 101 */ 102 private function formatRoomsExtraMeta($rooms) { 103 if (!is_array($rooms) || empty($rooms)) { 104 return ''; 105 } 106 107 $formatted_rooms = array(); 108 109 foreach ($rooms as $room_details) { 110 if (!is_array($room_details)) { 111 continue; 112 } 113 114 $room_type = isset($room_details['RoomType']) ? trim((string) $room_details['RoomType']) : ''; 115 $room_level = isset($room_details['RoomLevel']) ? trim((string) $room_details['RoomLevel']) : ''; 116 $room_length = isset($room_details['RoomLength']) ? trim((string) $room_details['RoomLength']) : ''; 117 $room_width = isset($room_details['RoomWidth']) ? trim((string) $room_details['RoomWidth']) : ''; 118 $room_units = isset($room_details['RoomLengthWidthUnits']) ? trim((string) $room_details['RoomLengthWidthUnits']) : ''; 119 120 if ($room_type === '') { 121 continue; 122 } 123 124 $details = array(); 125 if ($room_level !== '') { 126 $details[] = $room_level; 127 } 128 129 $dimension = ''; 130 if ($room_length !== '' && $room_width !== '') { 131 $dimension = $room_length . ' x ' . $room_width; 132 } elseif ($room_length !== '') { 133 $dimension = $room_length; 134 } elseif ($room_width !== '') { 135 $dimension = $room_width; 136 } 137 138 if ($dimension !== '') { 139 if ($room_units !== '') { 140 $dimension .= ' ' . $room_units; 141 } 142 $details[] = $dimension; 143 } elseif ($room_units !== '') { 144 $details[] = $room_units; 145 } 146 147 $formatted_value = $room_type; 148 if (!empty($details)) { 149 $formatted_value .= ': ' . implode(', ', $details); 150 } 151 152 $formatted_rooms[] = $formatted_value; 153 } 154 155 return implode(' | ', $formatted_rooms); 156 } 157 158 public function return_extra_fields 159 ( $property_id ) { 69 160 return get_post_meta( $property_id, 'additional_features', true ); 70 161 } … … 74 165 * Deal with extra meta 75 166 */ 76 public function mlsimportSaasSetExtraMeta( $property_id, $property ) {77 $property_history = '';78 $extra_meta_log = '';79 $answer = array();80 $extra_fields = array();81 $options = get_option('mlsimport_admin_fields_select');82 $permited_meta = isset($options['mls-fields']) ? $options['mls-fields'] : array();83 84 // Log input data 85 86 87 88 // save geo coordinates 89 if ( isset( $property['meta']['houzez_geolocation_long'] ) && isset( $property['meta']['houzez_geolocation_lat'] ) ) { 90 $savingx = $property['meta']['houzez_geolocation_lat'] . ',' . $property['meta']['houzez_geolocation_long']; 91 update_post_meta( $property_id, 'fave_property_location', $savingx );92 update_post_meta( $property_id, 'property_location', $savingx );93 $property_history .= 'Update Coordinates Meta (having houzez_geolocation_long ) with ' . $savingx . '</br>';94 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL;95 //error_log($extra_meta_log);96 } elseif ( isset( $property['meta']['property_longitude'] ) && isset( $property['meta']['property_latitude'] ) ) { 97 $savingx = $property['meta']['property_latitude'] . ',' . $property['meta']['property_longitude']; 98 update_post_meta( $property_id, 'fave_property_location', $savingx ); 99 update_post_meta( $property_id, 'property_location', $savingx );100 $property_history .= 'Update Coordinates Meta (having property_longitude) with ' . $savingx . '</br>'; 101 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL; 102 //error_log($extra_meta_log); 103 } 104 105 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 106 $meta_properties = $property['extra_meta']; 107 foreach ( $meta_properties as $meta_name => $meta_value ) : 108 $orignal_meta_name = $meta_name; 109 110 //error_log('doing meta_name: '.$meta_name.' with '.$meta_value); 111 112 if ( ! isset( $permited_meta[ $meta_name ] ) || intval( $permited_meta[ $meta_name ] ) === 0 ) { 113 114 continue; 115 } 116 117 if ( is_array( $meta_value ) ) {118 $meta_value = implode( ', ', array_map( 'trim', $meta_value ) ); 119 } else {120 $meta_value = preg_replace( '/\s*,\s*/', ', ', trim( $meta_value ) );121 } 122 123 if ( '' !== $meta_value 124 && isset( $options['mls-fields'][ $meta_name ] ) 125 && 1 === intval( $options['mls-fields'][ $meta_name ] ) 126 ) {127 $feature_name = isset( $options['mls-fields-label'][ $meta_name ] ) && '' !== $options['mls-fields-label'][ $meta_name ] ? $options['mls-fields-label'][ $meta_name ] : $meta_name;128 if( isset( $options['mls-fields-map-postmeta'][ $orignal_meta_name ]) && $options['mls-fields-map-postmeta'][ $orignal_meta_name ]!=='' ){129 $new_post_meta_key=$options['mls-fields-map-postmeta'][ $orignal_meta_name ];130 131 //if ( isset( $options['mls-fields-map-postmeta'][ $meta_name ]) && $options['mls-fields-map-postmeta'][ $meta_name ] !== '' ) { 132 $new_post_meta_key = $options['mls-fields-map-postmeta'][ $orignal_meta_name ];133 update_post_meta( $property_id, $new_post_meta_key, $meta_value ); 134 $log_msg = 'Property with ID ' . $property_id . ' Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name . ' with value ' . $meta_value; 135 $property_history .= $log_msg . '</br>'; 136 $extra_meta_log .= $log_msg . PHP_EOL;137 //error_log($log_msg);138 } elseif ( isset( $options['mls-fields-map-taxonomy'][ $orignal_meta_name ]) && $options['mls-fields-map-taxonomy'][ $orignal_meta_name ] !== '') {139 $ new_taxonomy = $options['mls-fields-map-taxonomy'][ $orignal_meta_name ];140 $custom_label = $options['mls-fields-label'][ $orignal_meta_name ];141 if ( $custom_label === 'none' ) {142 $custom_label = '';143 }144 $meta_value_with_label = array( trim( $custom_label . ' ' . $meta_value ) );167 public function mlsimportSaasSetExtraMeta( $property_id, $property ) { 168 $property_history = ''; 169 $extra_meta_log = ''; 170 $answer = array(); 171 $extra_fields = array(); 172 $options = get_option('mlsimport_admin_fields_select'); 173 $permited_meta = isset($options['mls-fields']) ? $options['mls-fields'] : array(); 174 175 if ( isset( $property['meta']['houzez_geolocation_long'] ) && isset( $property['meta']['houzez_geolocation_lat'] ) ) { 176 $savingx = $property['meta']['houzez_geolocation_lat'] . ',' . $property['meta']['houzez_geolocation_long']; 177 update_post_meta( $property_id, 'fave_property_location', $savingx ); 178 update_post_meta( $property_id, 'property_location', $savingx ); 179 $property_history .= 'Update Coordinates Meta (having houzez_geolocation_long ) with ' . $savingx . '</br>'; 180 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL; 181 } elseif ( isset( $property['meta']['property_longitude'] ) && isset( $property['meta']['property_latitude'] ) ) { 182 $savingx = $property['meta']['property_latitude'] . ',' . $property['meta']['property_longitude']; 183 update_post_meta( $property_id, 'fave_property_location', $savingx ); 184 update_post_meta( $property_id, 'property_location', $savingx ); 185 $property_history .= 'Update Coordinates Meta (having property_longitude) with ' . $savingx . '</br>'; 186 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL; 187 } 188 189 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 190 $meta_properties = $property['extra_meta']; 191 192 foreach ( $meta_properties as $meta_name => $meta_value ) { 193 if ( ! isset( $permited_meta[ $meta_name ] ) || intval( $permited_meta[ $meta_name ] ) === 0 ) { 194 continue; 195 } 196 197 if ( 'Rooms' === $meta_name && is_array( $meta_value ) ) { 198 $formatted_rooms = $this->formatRoomsExtraMeta( $meta_value ); 199 if ( '' === $formatted_rooms ) { 200 continue; 201 } 202 203 // Save the formatted value on the dedicated meta key and 204 // reuse the string for the rest of the processing pipeline 205 // (custom mappings, additional features, etc.). 206 update_post_meta( $property_id, 'rooms', $formatted_rooms ); 207 $property_history .= 'Updated EXTRA Meta rooms</br>'; 208 $extra_meta_log .= 'Property with ID ' . $property_id . ' Updated EXTRA Meta rooms with value ' . $formatted_rooms . PHP_EOL; 209 210 $meta_value = $formatted_rooms; 211 } 212 213 $meta_value = $this->normalizeExtraMetaValue( $meta_value ); 214 $orignal_meta_name = $meta_name; 215 $feature_name = isset( $options['mls-fields-label'][ $meta_name ] ) && '' !== $options['mls-fields-label'][ $meta_name ] ? $options['mls-fields-label'][ $meta_name ] : $meta_name; 216 217 if ( isset( $options['mls-fields-map-postmeta'][ $orignal_meta_name ] ) && $options['mls-fields-map-postmeta'][ $orignal_meta_name ] !== '' ) { 218 $new_post_meta_key = $options['mls-fields-map-postmeta'][ $orignal_meta_name ]; 219 update_post_meta( $property_id, $new_post_meta_key, $meta_value ); 220 $log_msg = 'Property with ID ' . $property_id . ' Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name . ' with value ' . $meta_value; 221 $property_history .= $log_msg . '</br>'; 222 $extra_meta_log .= $log_msg . PHP_EOL; 223 continue; 224 } 225 226 if ( isset( $options['mls-fields-map-taxonomy'][ $orignal_meta_name ] ) && $options['mls-fields-map-taxonomy'][ $orignal_meta_name ] !== '' ) { 227 $new_taxonomy = $options['mls-fields-map-taxonomy'][ $orignal_meta_name ]; 228 $custom_label = isset( $options['mls-fields-label'][ $orignal_meta_name ] ) ? $options['mls-fields-label'][ $orignal_meta_name ] : ''; 229 if ( 'none' === $custom_label ) { 230 $custom_label = ''; 231 } 232 $term_value = trim( $custom_label . ' ' . $meta_value ); 233 $meta_value_with_label = array(); 234 if ( '' !== $term_value ) { 235 $meta_value_with_label[] = $term_value; 145 236 wp_set_object_terms( $property_id, $meta_value_with_label, $new_taxonomy, true ); 146 237 clean_term_cache( $property_id, $new_taxonomy ); 147 $log_msg = 'Updated CUSTOM TAX: ' . $new_taxonomy . '<-- original '.$orignal_meta_name.'/' . $meta_name . '/' . $custom_label . ' value ' . json_encode($meta_value_with_label); 148 $property_history .= $log_msg;149 //error_log($log_msg);150 } else { 151 if ( isset( $options['mls-fields-admin'][ $meta_name ] ) && intval( $options['mls-fields-admin'][ $meta_name ] ) === 0 ) { 152 // Determine correct field order regardless of storage format 153 if ( isset( $options['field_order'][ $orignal_meta_name ] ) ) { 154 $order = intval( $options['field_order'][ $orignal_meta_name ] ); 155 } else { 156 $index = array_search( $orignal_meta_name, $options['field_order'], true ); 157 $order = ( false !== $index ) ? intval( $index ) : 9999; 158 } 159 $element = array( 160 'meta_name' => $orignal_meta_name, 161 'fave_additional_feature_title' => $feature_name, 162 'fave_additional_feature_value' => $meta_value, 163 'order' => $order, 164 );165 $extra_fields[] = $element;166 } elseif ( isset( $options['mls-fields-admin'][ $meta_name ] ) && intval( $options['mls-fields-admin'][ $meta_name ] ) === 1 ) { 167 update_post_meta( $property_id, strtolower( $feature_name ), $meta_value ); 168 $log_msg = 'Property with ID ' . $property_id . ' Updated EXTRA Meta ' . $meta_name . ' label ' . $feature_name . ' with value ' . $meta_value; 169 $property_history .= $log_msg . '</br>'; 170 $extra_meta_log .= $log_msg . PHP_EOL; 171 //error_log($log_msg); 172 } 173 } 174 } 175 endforeach; 176 177 usort( 178 $extra_fields, 179 function ( $a, $b ) { 180 $orderA = isset( $a['order'] ) ? intval( $a['order'] ) : 9999;181 $orderB = isset( $b['order'] ) ? intval( $b['order'] ) : 9999; 182 return $orderA <=> $orderB; 183 }184 ); 185 186 // Remove helper keys before saving 187 $ordered_extra_fields = array(); 188 foreach ( $extra_fields as $field ) { 189 $ordered_extra_fields[] = array( 190 'fave_additional_feature_title' => $field['fave_additional_feature_title'], 191 'fave_additional_feature_value' => $field['fave_additional_feature_value'], 192 );193 } 194 195 196 197 update_post_meta( $property_id, 'additional_features', $ordered_extra_fields ); 198 199 200 $answer['property_history'] = $property_history; 201 $answer['extra_meta_log'] = $extra_meta_log; 202 //error_log("Final Property History for $property_id: " . $property_history);203 //error_log("Final Extra Meta Log for $property_id: " . $extra_meta_log); 204 } 205 206 //error_log("mlsimportSaasSetExtraMeta END for property_id = $property_id");207 208 return $answer;209 }238 } 239 $property_history .= 'Updated CUSTOM TAX: ' . $new_taxonomy . '<-- original ' . $orignal_meta_name . '/' . $meta_name . '/' . $custom_label . ' value ' . json_encode( $meta_value_with_label ); 240 continue; 241 } 242 243 if ( 244 '' !== $meta_value && 245 isset( $options['mls-fields'][ $meta_name ] ) && 246 1 === intval( $options['mls-fields'][ $meta_name ] ) 247 ) { 248 if ( 249 isset( $options['mls-fields-admin'][ $meta_name ] ) && 250 0 === intval( $options['mls-fields-admin'][ $meta_name ] ) 251 ) { 252 if ( isset( $options['field_order'][ $orignal_meta_name ] ) ) { 253 $order = intval( $options['field_order'][ $orignal_meta_name ] ); 254 } else { 255 $index = array_search( $orignal_meta_name, $options['field_order'], true ); 256 $order = ( false !== $index ) ? intval( $index ) : 9999; 257 } 258 $extra_fields[] = array( 259 'meta_name' => $orignal_meta_name, 260 'fave_additional_feature_title' => $feature_name, 261 'fave_additional_feature_value' => $meta_value, 262 'order' => $order, 263 ); 264 } elseif ( 265 isset( $options['mls-fields-admin'][ $meta_name ] ) && 266 1 === intval( $options['mls-fields-admin'][ $meta_name ] ) 267 ) { 268 update_post_meta( $property_id, strtolower( $feature_name ), $meta_value ); 269 $log_msg = 'Property with ID ' . $property_id . ' Updated EXTRA Meta ' . $meta_name . ' label ' . $feature_name . ' with value ' . $meta_value; 270 $property_history .= $log_msg . '</br>'; 271 $extra_meta_log .= $log_msg . PHP_EOL; 272 } 273 } 274 } 275 276 usort( 277 $extra_fields, 278 function ( $a, $b ) { 279 $orderA = isset( $a['order'] ) ? intval( $a['order'] ) : 9999; 280 $orderB = isset( $b['order'] ) ? intval( $b['order'] ) : 9999; 281 return $orderA <=> $orderB; 282 } 283 ); 284 285 $ordered_extra_fields = array(); 286 foreach ( $extra_fields as $field ) { 287 $ordered_extra_fields[] = array( 288 'fave_additional_feature_title' => $field['fave_additional_feature_title'], 289 'fave_additional_feature_value' => $field['fave_additional_feature_value'], 290 ); 291 } 292 293 update_post_meta( $property_id, 'additional_features', $ordered_extra_fields ); 294 } 295 296 $answer['property_history'] = $property_history; 297 $answer['extra_meta_log'] = $extra_meta_log; 298 299 return $answer; 300 } 210 301 211 302 /** -
mlsimport/tags/6.1.2/enviroment/RealHomesClass.php
r3357653 r3366929 62 62 * @var string $plugin_name 63 63 */ 64 public function enviroment_image_save_gallery( $property_id, $post_attachments ) {64 public function enviroment_image_save_gallery( $property_id, $post_attachments ) { 65 65 return; 66 } 66 } 67 68 /** 69 * Format extra meta values into a safe string representation. 70 */ 71 private function normalizeExtraMetaValue($meta_value) { 72 if (is_array($meta_value)) { 73 $normalized = array(); 74 75 foreach ($meta_value as $value) { 76 if (is_array($value)) { 77 $encoded = function_exists('wp_json_encode') ? wp_json_encode($value) : json_encode($value); 78 79 if (false !== $encoded && null !== $encoded) { 80 $normalized[] = $encoded; 81 } 82 } else { 83 $value = trim((string) $value); 84 if ('' !== $value) { 85 $normalized[] = $value; 86 } 87 } 88 } 89 90 if (empty($normalized)) { 91 return ''; 92 } 93 94 return implode(', ', $normalized); 95 } 96 97 return preg_replace('/\s*,\s*/', ', ', trim((string) $meta_value)); 98 } 99 100 /** 101 * Format Rooms extra meta entries into a single string. 102 */ 103 private function formatRoomsExtraMeta($rooms) { 104 if (!is_array($rooms) || empty($rooms)) { 105 return ''; 106 } 107 108 $formatted_rooms = array(); 109 110 foreach ($rooms as $room_details) { 111 if (!is_array($room_details)) { 112 continue; 113 } 114 115 $room_type = isset($room_details['RoomType']) ? trim((string) $room_details['RoomType']) : ''; 116 $room_level = isset($room_details['RoomLevel']) ? trim((string) $room_details['RoomLevel']) : ''; 117 $room_length = isset($room_details['RoomLength']) ? trim((string) $room_details['RoomLength']) : ''; 118 $room_width = isset($room_details['RoomWidth']) ? trim((string) $room_details['RoomWidth']) : ''; 119 $room_units = isset($room_details['RoomLengthWidthUnits']) ? trim((string) $room_details['RoomLengthWidthUnits']) : ''; 120 121 if ($room_type === '') { 122 continue; 123 } 124 125 $details = array(); 126 if ($room_level !== '') { 127 $details[] = $room_level; 128 } 129 130 $dimension = ''; 131 if ($room_length !== '' && $room_width !== '') { 132 $dimension = $room_length . ' x ' . $room_width; 133 } elseif ($room_length !== '') { 134 $dimension = $room_length; 135 } elseif ($room_width !== '') { 136 $dimension = $room_width; 137 } 138 139 if ($dimension !== '') { 140 if ($room_units !== '') { 141 $dimension .= ' ' . $room_units; 142 } 143 $details[] = $dimension; 144 } elseif ($room_units !== '') { 145 $details[] = $room_units; 146 } 147 148 $formatted_value = $room_type; 149 if (!empty($details)) { 150 $formatted_value .= ': ' . implode(', ', $details); 151 } 152 153 $formatted_rooms[] = $formatted_value; 154 } 155 156 return implode(' | ', $formatted_rooms); 157 } 67 158 68 159 /** 69 160 * Deal with extra meta 70 161 */ 71 public function mlsimportSaasSetExtraMeta( $property_id, $property ) { 72 $property_history = ''; 73 $extra_meta_log = ''; 74 $answer = array(); 75 $extra_fields = array(); 76 $options = get_option( 'mlsimport_admin_fields_select' ); 77 $permited_meta = isset($options['mls-fields']) ? $options['mls-fields'] : array(); 78 79 // save geo coordinates 80 81 if ( isset( $property['meta']['property_longitude'] ) && isset( $property['meta']['property_latitude'] ) ) { 82 $savingx = $property['meta']['property_latitude'] . ',' . $property['meta']['property_longitude']; 83 update_post_meta( $property_id, 'REAL_HOMES_property_location', $savingx ); 84 $property_history .= 'Update Coordinates Meta with ' . $savingx . '</br>'; 85 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL; 86 } 87 88 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 89 $meta_properties = $property['extra_meta']; 90 foreach ( $meta_properties as $meta_name => $meta_value ) : 91 // check if extra meta is set to import 92 if ( ! isset( $permited_meta[ $meta_name ] ) ) { 93 // we do not have the extra meta 94 continue; 95 } elseif ( isset( $permited_meta[ $meta_name ] ) && intval( $permited_meta[ $meta_name ] ) === 0 ) { 96 // meta exists but is set to no 97 continue; 98 } 99 100 if ( is_array( $meta_value ) ) { 101 $meta_value = implode( ', ', array_map( 'trim', $meta_value ) ); 102 } else { 103 $meta_value = preg_replace( '/\s*,\s*/', ', ', trim( $meta_value ) ); 104 } 105 $orignal_meta_name = $meta_name; 106 107 if( isset( $options['mls-fields-map-postmeta'][ $meta_name ]) && $options['mls-fields-map-postmeta'][ $meta_name ]!=='' ){ 108 $new_post_meta_key=$options['mls-fields-map-postmeta'][ $orignal_meta_name ]; 109 update_post_meta( $property_id, $new_post_meta_key, $meta_value ); 110 $property_history .= 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name . ' and value ' . $meta_value . '</br>'; 111 }else if( isset( $options['mls-fields-map-taxonomy'][ $orignal_meta_name ]) && $options['mls-fields-map-taxonomy'][ $orignal_meta_name ]!=='' ){ 112 $new_taxonomy=$options['mls-fields-map-taxonomy'][ $orignal_meta_name ]; 113 114 $custom_label=$options['mls-fields-label'][ $orignal_meta_name ]; 115 $meta_value_with_label = array( trim( $custom_label.' '.$meta_value) ); 116 117 118 119 120 wp_set_object_terms( $property_id, $meta_value_with_label, $new_taxonomy, true ); 121 clean_term_cache( $property_id, $new_taxonomy ); 122 123 124 $property_history.= 'Updated CUSTOM TAX: ' . $new_taxonomy . '<-- original '.$orignal_meta_name.'/' . $meta_name .'/'.$custom_label. ' and value ' . json_encode($meta_value_with_label); 125 }else{ 126 127 128 if ( '' !== $meta_value && 129 isset( $options['mls-fields'][ $meta_name ] ) && 130 1 === intval( $options['mls-fields'][ $meta_name ] ) 131 ) { 132 $feature_name = isset( $options['mls-fields-label'][ $meta_name ] ) && '' !== $options['mls-fields-label'][ $meta_name ] ? $options['mls-fields-label'][ $meta_name ] : $meta_name; 133 162 public function mlsimportSaasSetExtraMeta( $property_id, $property ) { 163 $property_history = ''; 164 $extra_meta_log = ''; 165 $answer = array(); 166 $extra_fields = array(); 167 $options = get_option( 'mlsimport_admin_fields_select' ); 168 $permited_meta = isset( $options['mls-fields'] ) ? $options['mls-fields'] : array(); 169 170 if ( isset( $property['meta']['property_longitude'] ) && isset( $property['meta']['property_latitude'] ) ) { 171 $savingx = $property['meta']['property_latitude'] . ',' . $property['meta']['property_longitude']; 172 update_post_meta( $property_id, 'REAL_HOMES_property_location', $savingx ); 173 $property_history .= 'Update Coordinates Meta with ' . $savingx . '</br>'; 174 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL; 175 } 176 177 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 178 $meta_properties = $property['extra_meta']; 179 180 foreach ( $meta_properties as $meta_name => $meta_value ) { 181 if ( ! isset( $permited_meta[ $meta_name ] ) ) { 182 continue; 183 } elseif ( isset( $permited_meta[ $meta_name ] ) && intval( $permited_meta[ $meta_name ] ) === 0 ) { 184 continue; 185 } 186 187 if ( 'Rooms' === $meta_name && is_array( $meta_value ) ) { 188 $formatted_rooms = $this->formatRoomsExtraMeta( $meta_value ); 189 if ( '' !== $formatted_rooms ) { 190 update_post_meta( $property_id, 'rooms', $formatted_rooms ); 191 $property_history .= 'Updated EXTRA Meta rooms</br>'; 192 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update EXTRA Meta rooms with value ' . $formatted_rooms . PHP_EOL; 193 } 194 continue; 195 } 196 197 $meta_value = $this->normalizeExtraMetaValue( $meta_value ); 198 $orignal_meta_name = $meta_name; 199 $feature_label = isset( $options['mls-fields-label'][ $meta_name ] ) && '' !== $options['mls-fields-label'][ $meta_name ] ? $options['mls-fields-label'][ $meta_name ] : $meta_name; 200 201 if ( isset( $options['mls-fields-map-postmeta'][ $orignal_meta_name ] ) && '' !== $options['mls-fields-map-postmeta'][ $orignal_meta_name ] ) { 202 $new_post_meta_key = $options['mls-fields-map-postmeta'][ $orignal_meta_name ]; 203 update_post_meta( $property_id, $new_post_meta_key, $meta_value ); 204 $property_history .= 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name . ' and value ' . $meta_value . '</br>'; 205 } elseif ( isset( $options['mls-fields-map-taxonomy'][ $orignal_meta_name ] ) && '' !== $options['mls-fields-map-taxonomy'][ $orignal_meta_name ] ) { 206 $new_taxonomy = $options['mls-fields-map-taxonomy'][ $orignal_meta_name ]; 207 $custom_label = $options['mls-fields-label'][ $orignal_meta_name ]; 208 $meta_value_with_label = array( trim( $custom_label . ' ' . $meta_value ) ); 209 210 wp_set_object_terms( $property_id, $meta_value_with_label, $new_taxonomy, true ); 211 clean_term_cache( $property_id, $new_taxonomy ); 212 213 $property_history .= 'Updated CUSTOM TAX: ' . $new_taxonomy . '<-- original ' . $orignal_meta_name . '/' . $meta_name . '/' . $custom_label . ' and value ' . json_encode( $meta_value_with_label ); 214 } else { 134 215 if ( 135 isset( $options['mls-fields-admin'][ $meta_name ] ) && 136 0 === intval( $options['mls-fields-admin'][ $meta_name ] ) 216 '' !== $meta_value && 217 isset( $options['mls-fields'][ $meta_name ] ) && 218 1 === intval( $options['mls-fields'][ $meta_name ] ) 137 219 ) { 138 if ( isset( $options['field_order'][ $orignal_meta_name ] ) ) { 139 $order = intval( $options['field_order'][ $orignal_meta_name ] ); 140 } else { 141 $index = array_search( $orignal_meta_name, $options['field_order'], true ); 142 $order = ( false !== $index ) ? intval( $index ) : 9999; 220 if ( 221 isset( $options['mls-fields-admin'][ $meta_name ] ) && 222 0 === intval( $options['mls-fields-admin'][ $meta_name ] ) 223 ) { 224 if ( isset( $options['field_order'][ $orignal_meta_name ] ) ) { 225 $order = intval( $options['field_order'][ $orignal_meta_name ] ); 226 } else { 227 $index = array_search( $orignal_meta_name, $options['field_order'], true ); 228 $order = ( false !== $index ) ? intval( $index ) : 9999; 229 } 230 $extra_fields[] = array( 231 'label' => $feature_label, 232 'value' => $meta_value, 233 'order' => $order, 234 ); 235 } elseif ( 236 isset( $options['mls-fields-admin'][ $meta_name ] ) && 237 1 === intval( $options['mls-fields-admin'][ $meta_name ] ) 238 ) { 239 update_post_meta( $property_id, strtolower( $feature_label ), $meta_value ); 143 240 } 144 $extra_fields[] = array(145 'label' => $feature_name,146 'value' => $meta_value,147 'order' => $order,148 );149 } elseif (150 isset( $options['mls-fields-admin'][ $meta_name ] ) &&151 1 === intval( $options['mls-fields-admin'][ $meta_name ] )152 ) {153 update_post_meta( $property_id, strtolower( $feature_name ), $meta_value );154 241 } 155 242 } 156 } 157 158 159 $property_history .= 'Updated EXTRA Meta ' . $meta_name . ' with label ' . $feature_name . ' and value ' . $meta_value . '</br>'; 160 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update EXTRA Meta ' . $meta_name . ' with value ' . $meta_value . PHP_EOL; 161 162 endforeach; 243 244 $property_history .= 'Updated EXTRA Meta ' . $meta_name . ' with label ' . $feature_label . ' and value ' . $meta_value . '</br>'; 245 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update EXTRA Meta ' . $meta_name . ' with value ' . $meta_value . PHP_EOL; 246 } 247 163 248 usort( 164 249 $extra_fields, … … 169 254 } 170 255 ); 171 $ordered_extra_fields = array(); 172 foreach ( $extra_fields as $field ) { 173 $ordered_extra_fields[ $field['label'] ] = $field['value']; 174 } 175 176 update_post_meta( $property_id, 'REAL_HOMES_additional_details', $ordered_extra_fields ); 177 update_post_meta( $property_id, 'REAL_HOMES_additional_details_list', $ordered_extra_fields ); 178 179 $answer['property_history'] = $property_history; 180 $answer['extra_meta_log'] = $extra_meta_log; 181 182 } 183 184 return $answer; 185 } 256 $ordered_extra_fields = array(); 257 foreach ( $extra_fields as $field ) { 258 $ordered_extra_fields[ $field['label'] ] = $field['value']; 259 } 260 261 update_post_meta( $property_id, 'REAL_HOMES_additional_details', $ordered_extra_fields ); 262 update_post_meta( $property_id, 'REAL_HOMES_additional_details_list', $ordered_extra_fields ); 263 264 $answer['property_history'] = $property_history; 265 $answer['extra_meta_log'] = $extra_meta_log; 266 } 267 268 return $answer; 269 } 186 270 187 271 -
mlsimport/tags/6.1.2/enviroment/ResidenceClass.php
r3357653 r3366929 72 72 73 73 74 /** 75 * Deal with extra meta 76 */ 77 78 79 /** 80 * Deal with extra meta 81 */ 82 public function mlsimportSaasSetExtraMeta($property_id, $property) { 74 /** 75 * Format extra meta values into a safe string representation. 76 */ 77 private function normalizeExtraMetaValue($meta_value) { 78 if (is_array($meta_value)) { 79 $normalized = array(); 80 81 foreach ($meta_value as $value) { 82 if (is_array($value)) { 83 if (function_exists('wp_json_encode')) { 84 $encoded = wp_json_encode($value); 85 } else { 86 $encoded = json_encode($value); 87 } 88 89 if (false !== $encoded && null !== $encoded) { 90 $normalized[] = $encoded; 91 } 92 } else { 93 $value = trim((string) $value); 94 if ('' !== $value) { 95 $normalized[] = $value; 96 } 97 } 98 } 99 100 if (empty($normalized)) { 101 return ''; 102 } 103 104 return implode(', ', $normalized); 105 } 106 107 return preg_replace('/\s*,\s*/', ', ', trim((string) $meta_value)); 108 } 109 110 /** 111 * Format Rooms extra meta entries into a single string. 112 */ 113 private function formatRoomsExtraMeta($rooms, $property_id) { 114 if (!is_array($rooms) || empty($rooms)) { 115 return ''; 116 } 117 118 119 $formatted_rooms = array(); 120 121 foreach ($rooms as $index => $room_details) { 122 if (!is_array($room_details)) { 123 continue; 124 } 125 126 $room_type = isset($room_details['RoomType']) ? trim((string) $room_details['RoomType']) : ''; 127 $room_level = isset($room_details['RoomLevel']) ? trim((string) $room_details['RoomLevel']) : ''; 128 $room_length = isset($room_details['RoomLength']) ? trim((string) $room_details['RoomLength']) : ''; 129 $room_width = isset($room_details['RoomWidth']) ? trim((string) $room_details['RoomWidth']) : ''; 130 $room_units = isset($room_details['RoomLengthWidthUnits']) ? trim((string) $room_details['RoomLengthWidthUnits']) : ''; 131 132 if ($room_type === '') { 133 continue; 134 } 135 136 $details = array(); 137 if ($room_level !== '') { 138 $details[] = $room_level; 139 } 140 141 $dimension = ''; 142 if ($room_length !== '' && $room_width !== '') { 143 $dimension = $room_length . ' x ' . $room_width; 144 } elseif ($room_length !== '') { 145 $dimension = $room_length; 146 } elseif ($room_width !== '') { 147 $dimension = $room_width; 148 } 149 150 if ($dimension !== '') { 151 if ($room_units !== '') { 152 $dimension .= ' ' . $room_units; 153 } 154 $details[] = $dimension; 155 } elseif ($room_units !== '') { 156 $details[] = $room_units; 157 } 158 159 $formatted_value = $room_type; 160 if (!empty($details)) { 161 $formatted_value .= ': ' . implode(', ', $details); 162 } 163 164 $formatted_rooms[] = $formatted_value; 165 } 166 167 $result = implode(' | ', $formatted_rooms); 168 169 return $result; 170 } 171 172 173 /** 174 * Deal with extra meta 175 */ 176 177 178 /** 179 * Deal with extra meta 180 */ 181 public function mlsimportSaasSetExtraMeta($property_id, $property) { 83 182 // Memory tracking 84 183 $startMemory = memory_get_usage(true); 85 184 $startMemoryFormatted = round($startMemory / 1048576, 2); 86 //error_log("[Memory-ExtraMeta] Starting extra meta processing with memory: {$startMemoryFormatted} MB");87 185 88 186 $property_history = array(); … … 91 189 if (!isset($property['extra_meta']) || !is_array($property['extra_meta'])) { 92 190 $answer['property_history'] = ''; 93 191 94 192 $endMemory = memory_get_usage(true); 95 193 $endMemoryFormatted = round($endMemory / 1048576, 2); 96 194 $memoryDiff = $endMemoryFormatted - $startMemoryFormatted; 97 //error_log("[Memory-ExtraMeta] No extra meta, finished with memory: {$endMemoryFormatted} MB (change: +{$memoryDiff} MB)"); 98 195 99 196 return $answer; 100 197 } … … 110 207 foreach ($meta_batches as $meta_batch_keys) { 111 208 $batch_count++; 112 209 113 210 $batchMemory = memory_get_usage(true); 114 211 $batchMemoryFormatted = round($batchMemory / 1048576, 2); 115 //error_log("[Memory-ExtraMeta] Processing batch {$batch_count} with memory: {$batchMemoryFormatted} MB");116 212 117 213 foreach ($meta_batch_keys as $meta_name) { … … 120 216 continue; 121 217 } 122 218 123 219 $meta_value = $property['extra_meta'][$meta_name]; 124 220 125 221 // Check if extra meta is set to import 126 222 if (!isset($permited_meta[$meta_name])) { … … 131 227 continue; 132 228 } 133 229 230 if ('Rooms' === $meta_name && is_array($meta_value)) { 231 $formatted_rooms = $this->formatRoomsExtraMeta($meta_value, $property_id); 232 if ($formatted_rooms !== '') { 233 update_post_meta($property_id, 'rooms', $formatted_rooms); 234 $property_history[] = 'Updated EXTRA Meta rooms'; 235 } 236 continue; 237 } 238 239 $normalized_meta_value = $this->normalizeExtraMetaValue($meta_value); 240 134 241 $original_meta_name = $meta_name; 135 242 $meta_name_lower = strtolower($meta_name); … … 139 246 $new_post_meta_key = $options['mls-fields-map-postmeta'][$original_meta_name]; 140 247 141 if (is_array($meta_value)) { 142 $meta_value = implode(', ', array_map('trim', $meta_value)); 143 } else { 144 $meta_value = preg_replace('/\s*,\s*/', ', ', trim($meta_value)); 145 } 146 147 update_post_meta($property_id, $new_post_meta_key, $meta_value); 248 update_post_meta($property_id, $new_post_meta_key, $normalized_meta_value); 148 249 $property_history[] = 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name; 149 } 250 } 150 251 // Process custom taxonomy mapping 151 252 else if (isset($options['mls-fields-map-taxonomy'][$original_meta_name]) && $options['mls-fields-map-taxonomy'][$original_meta_name] !== '') { … … 157 258 } 158 259 159 if (is_array($meta_value)) {160 $meta_value = implode(', ', array_map('trim', $meta_value));161 } else{162 $meta_value = preg_replace('/\s*,\s*/', ', ', trim($meta_value));260 $meta_value_with_label = array(); 261 $term_value = trim($custom_label . ' ' . $normalized_meta_value); 262 if ($term_value !== '') { 263 $meta_value_with_label[] = $term_value; 163 264 } 164 265 165 $meta_value_with_label = array(trim($custom_label . ' ' . $meta_value));166 167 wp_set_object_terms($property_id, $meta_value_with_label, $new_taxonomy, true);168 169 // Fix the clean_term_cache call to avoid SQL errors170 266 if (!empty($meta_value_with_label)) { 267 wp_set_object_terms($property_id, $meta_value_with_label, $new_taxonomy, true); 268 269 // Fix the clean_term_cache call to avoid SQL errors 171 270 $term_ids = array(); 172 271 foreach ($meta_value_with_label as $term_name) { … … 176 275 } 177 276 } 178 277 179 278 if (!empty($term_ids)) { 180 279 clean_term_cache($term_ids, $new_taxonomy); 181 280 } 182 281 } 183 282 184 283 $property_history[] = 'Updated CUSTOM TAX: ' . $new_taxonomy . ' original ' . $original_meta_name; 185 } 284 } 186 285 // Standard meta update 187 286 else { 188 if (is_array($meta_value)) { 189 $meta_value = implode(', ', array_map('trim', $meta_value)); 190 } else { 191 $meta_value = preg_replace('/\s*,\s*/', ', ', trim($meta_value)); 192 } 193 194 update_post_meta($property_id, $meta_name_lower, $meta_value); 287 update_post_meta($property_id, $meta_name_lower, $normalized_meta_value); 195 288 $property_history[] = 'Updated EXTRA Meta ' . $meta_name_lower; 196 289 } 197 290 198 291 // Clear each variable after use 199 292 $meta_value = null; 293 $normalized_meta_value = null; 200 294 } 201 295 … … 207 301 $afterBatchMemoryFormatted = round($afterBatchMemory / 1048576, 2); 208 302 $batchMemoryDiff = $afterBatchMemoryFormatted - $batchMemoryFormatted; 209 //error_log("[Memory-ExtraMeta] Finished batch {$batch_count} with memory: {$afterBatchMemoryFormatted} MB (change: +{$batchMemoryDiff} MB)");210 303 } 211 304 … … 218 311 $property_history[] = '... [truncated history to save memory] ...'; 219 312 } 220 313 221 314 $answer['property_history'] = implode('</br>', $property_history); 222 315 … … 230 323 $endMemoryFormatted = round($endMemory / 1048576, 2); 231 324 $memoryDiff = $endMemoryFormatted - $startMemoryFormatted; 232 //error_log("[Memory-ExtraMeta] Finished extra meta processing with memory: {$endMemoryFormatted} MB (change: +{$memoryDiff} MB)");233 325 234 326 return $answer; -
mlsimport/tags/6.1.2/includes/ThemeImport.php
r3357653 r3366929 200 200 201 201 if (!$refresh_result) { 202 //error_log('MLSImport: Failed to refresh expired token');203 202 return false; 204 203 } … … 217 216 218 217 if (empty($username) || empty($password)) { 219 //error_log('MLSImport: Missing credentials for token refresh');220 218 return false; 221 219 } … … 241 239 242 240 if (is_wp_error($response)) { 243 //error_log('MLSImport: Token refresh request failed: ' . $response->get_error_message());244 241 return false; 245 242 } … … 249 246 250 247 if (!isset($data['success']) || !$data['success'] || !isset($data['token']) || !isset($data['expires'])) { 251 //error_log('MLSImport: Invalid token refresh response');252 248 return false; 253 249 } … … 261 257 update_option('mlsimport_token_expiry', intval($data['expires'])); 262 258 263 //error_log('MLSImport: Token successfully refreshed. Expires: ' . date('Y-m-d H:i:s', $data['expires']));264 259 265 260 return true; … … 268 263 269 264 /** 270 * Parse Result Array with //error_log memory tracking and enhanced memory management271 265 * 272 266 * @param array $readyToParseArray The array ready to be parsed. … … 281 275 // Log initial memory usage 282 276 $initialMemory = memory_get_usage(true); 283 //error_log("MLS Import - START batch {$batchKey} - Memory: " . round($initialMemory / 1048576, 2) . " MB");284 277 285 278 $counterProp = 0; … … 289 282 // Log total items to process 290 283 $totalItems = count($readyToParseArray['data']); 291 //error_log("MLS Import - Processing {$totalItems} properties in batch {$batchKey}");292 284 293 285 … … 316 308 317 309 $current_prop_value = (int) get_post_meta( $mlsimportItemId, 'mlsimport_progress_properties', true ); 318 //error_log('for itemID '.$mlsimportItemId.' count1 -> before bathich '.$current_prop_value);319 310 320 311 … … 328 319 329 320 $listingKey = isset($property['ListingKey']) ? $property['ListingKey'] : 'unknown'; 330 //error_log("MLS Import - Before property {$counterProp}/{$totalItems} (ListingKey: {$listingKey}) - Memory: {$memoryBeforeMB} MB");331 321 332 322 // Clear out database caches that might be polluted … … 341 331 $current_prop_value = $current_prop_value + 1; 342 332 update_post_meta( $mlsimportItemId, 'mlsimport_progress_properties', $current_prop_value ); 343 //error_log(' count2 -> after updateing '.$current_prop_value);344 333 345 334 … … 353 342 $memoryDiff = round(($memoryAfter - $memoryBefore) / 1048576, 2); 354 343 355 //error_log("MLS Import - After property {$counterProp}/{$totalItems} - Memory: {$memoryAfterMB} MB, Diff: {$memoryDiff} MB");356 344 357 345 // Check for memory leak pattern 358 346 if ($memoryDiff > 10) { 359 //error_log("MLS Import - WARNING: Significant memory increase of {$memoryDiff} MB after property {$counterProp}");360 347 // Force cleanup on large increases 361 348 $this->cleanUpMemory(true); … … 378 365 $memoryAfterCleanup = memory_get_usage(true); 379 366 $freedMemory = round(($memoryAfter - $memoryAfterCleanup) / 1048576, 2); 380 //error_log("MLS Import - After cleanup: {$freedMemory} MB freed, Current: " . round($memoryAfterCleanup / 1048576, 2) . " MB");381 367 } 382 368 } else { 383 //error_log("MLS Import - Import stopped by user command at property {$counterProp}");384 369 update_post_meta($itemIdArray['item_id'], 'mlsimport_spawn_status', 'completed'); 385 370 break; … … 390 375 } 391 376 } else { 392 //error_log("MLS Import - No valid data in batch {$batchKey}");393 377 } 394 378 … … 403 387 $peakMemory = round(memory_get_peak_usage(true) / 1048576, 2); 404 388 405 //error_log("MLS Import - END batch {$batchKey} - Processed {$counterProp} properties");406 //error_log("MLS Import - Final Memory: {$finalMemoryMB} MB, Diff: {$totalMemoryDiff} MB, Peak: {$peakMemory} MB");407 389 } 408 390 … … 603 585 wp_delete_object_term_relationships($propertyId, $taxonomy); 604 586 } else { 605 // //error_log("Taxonomy does not exist: {$taxonomy}");606 587 } 607 588 } … … 836 817 837 818 $mediaHistory = []; 838 //error_log("MLSImport: Starting image processing for property ID: $propertyId");839 819 840 820 if ($isInsert === 'no') { 841 821 $mediaHistory[] = 'Media - We have edit - images are not replaced'; 842 //error_log("MLSImport: Edit mode detected, images not replaced.");843 822 return $media_attachments; 844 823 //return implode('</br>', $mediaHistory); … … 858 837 foreach ($media as $key=>$image) { 859 838 if (isset($image['MediaCategory']) && $image['MediaCategory'] !== 'Property Photo' && $image['MediaCategory'] !== 'Photo') { 860 //error_log("MLSImport: Skipping non-photo media category: " . $image['MediaCategory']);861 839 continue; 862 840 } 863 841 864 842 if ( empty( $image['MediaURL'] ) ) { 865 //error_log('empty mediaURL');866 843 continue; 867 844 } … … 882 859 883 860 $attachId = wp_insert_attachment($attachment, $file); 884 //error_log("Processing: " . $file . " - Result: " . (is_wp_error($attachId) ? $attachId->get_error_message() : $attachId));885 861 if (is_wp_error($attachId)) { 886 //error_log("MLSImport: Failed to insert attachment for $file. Error: " . $attachId->get_error_message());887 862 } else { 888 //error_log("MLSImport: Inserted attachment ID $attachId for file $file");889 863 $mediaHistory[] = 'Media - Added ' . $file . ' as attachment ' . $attachId; 890 864 $media_attachments[]=$attachId; … … 897 871 898 872 899 //error_log("BEFORE set_post_thumbnail: hasFeatured=false, setting featuredImageKey=$featuredImageKey as $key featured for propertyId=$propertyId");900 873 set_post_thumbnail($propertyId, $attachId); 901 874 902 // error_log("AFTER set_post_thumbnail: hasFeatured=true, attachId=$attachId should now be featured");903 875 } else { 904 // error_log("SKIPPING featured image: hasFeatured=true, attachId=$attachId");905 876 } 906 877 } 907 878 } else { 908 //error_log("MLSImport: Media item missing 'MediaURL', skipping.");909 879 } 910 880 } 911 881 } else { 912 882 $mediaHistory[] = 'Media data is blank - there are no images'; 913 //error_log("MLSImport: Media array is not valid or empty.");914 883 } 915 884 … … 1187 1156 $memStart = memory_get_usage(true); 1188 1157 $memStartMB = round($memStart / 1048576, 2); 1189 //error_log("PROPERTY IMPORT START - ListingKey: " . ($property['ListingKey'] ?? 'unknown') . " - Memory: {$memStartMB} MB");1190 1158 1191 1159 $mlsImportItemStatus = $mlsimportItemOptionData['mlsimport_item_standardstatus']; … … 1211 1179 // Memory before property ID lookup 1212 1180 $memBeforeRetrieve = memory_get_usage(true); 1213 //error_log("PROPERTY IMPORT - Before property ID lookup - Memory: " . round($memBeforeRetrieve / 1048576, 2) . " MB");1214 1181 1215 1182 $propertyId = intval($this->mlsimportSaasRetrievePropertyById($ListingKey, $listingPostType)); … … 1217 1184 // Memory after property ID lookup 1218 1185 $memAfterRetrieve = memory_get_usage(true); 1219 //error_log("PROPERTY IMPORT - After property ID lookup - Memory: " . round($memAfterRetrieve / 1048576, 2) . " MB, Diff: " . round(($memAfterRetrieve - $memBeforeRetrieve) / 1048576, 2) . " MB");1220 1186 1221 1187 $status = isset($property['StandardStatus']) ? strtolower($property['StandardStatus']) : strtolower($property['extra_meta']['MlsStatus']); … … 1234 1200 // Memory before insert/update 1235 1201 $memBeforeInsert = memory_get_usage(true); 1236 //error_log("PROPERTY IMPORT - Before " . ($isInsert === 'yes' ? "insert" : "update/check") . " - Memory: " . round($memBeforeInsert / 1048576, 2) . " MB");1237 1202 1238 1203 if ($isInsert === 'yes') { … … 1248 1213 if (is_wp_error($propertyId)) { 1249 1214 $this->writeImportLogs('ERROR: on inserting ' . PHP_EOL, $tipImport); 1250 //error_log("PROPERTY IMPORT ERROR - Failed to insert property: " . $propertyId->get_error_message());1251 1215 } else { 1252 1216 update_post_meta($propertyId, 'ListingKey', $ListingKey); … … 1262 1226 // Memory before checking existing property 1263 1227 $memBeforeCheck = memory_get_usage(true); 1264 //error_log("PROPERTY IMPORT - Before checking existing property - Memory: " . round($memBeforeCheck / 1048576, 2) . " MB");1265 1228 1266 1229 $keep = $this->check_if_delete_when_status($propertyId,$mlsImportItemStatus,$mlsImportItemStatusDelete); … … 1272 1235 // Memory before delete 1273 1236 $memBeforeDelete = memory_get_usage(true); 1274 //error_log("PROPERTY IMPORT - Before deleting property - Memory: " . round($memBeforeDelete / 1048576, 2) . " MB");1275 1237 1276 1238 $this->deleteProperty($propertyId, $ListingKey); … … 1278 1240 // Memory after delete 1279 1241 $memAfterDelete = memory_get_usage(true); 1280 //error_log("PROPERTY IMPORT - After deleting property - Memory: " . round($memAfterDelete / 1048576, 2) . " MB, Diff: " . round(($memAfterDelete - $memBeforeDelete) / 1048576, 2) . " MB");1281 1242 1282 1243 $this->writeImportLogs($log, $tipImport); … … 1286 1247 // Memory before updating 1287 1248 $memBeforeUpdate = memory_get_usage(true); 1288 //error_log("PROPERTY IMPORT - Before updating existing property - Memory: " . round($memBeforeUpdate / 1048576, 2) . " MB");1289 1249 1290 1250 $propertyHistory = $this->updateExistingProperty($propertyId,$mlsImportItemStatusDelete, $content, $listingPostType, $newAuthor, $status, $mlsImportItemStatus, $propertyHistory, $tipImport, $ListingKey); … … 1292 1252 // Memory after updating 1293 1253 $memAfterUpdate = memory_get_usage(true); 1294 //error_log("PROPERTY IMPORT - After updating existing property - Memory: " . round($memAfterUpdate / 1048576, 2) . " MB, Diff: " . round(($memAfterUpdate - $memBeforeUpdate) / 1048576, 2) . " MB");1295 1254 } 1296 1255 } … … 1298 1257 // Memory after insert/update 1299 1258 $memAfterInsert = memory_get_usage(true); 1300 //error_log("PROPERTY IMPORT - After " . ($isInsert === 'yes' ? "insert" : "update/check") . " - Memory: " . round($memAfterInsert / 1048576, 2) . " MB, Diff: " . round(($memAfterInsert - $memBeforeInsert) / 1048576, 2) . " MB");1301 1259 1302 1260 if ($propertyId === 0) { … … 1307 1265 // Memory before processing details 1308 1266 $memBeforeDetails = memory_get_usage(true); 1309 //error_log("PROPERTY IMPORT - Before processing property details - Memory: " . round($memBeforeDetails / 1048576, 2) . " MB");1310 1267 1311 1268 $newTitle = $this->processPropertyDetails($property, $propertyId, $tipImport, $propertyHistory, $newAgent, $itemIdArray,$isInsert); … … 1313 1270 // Memory after processing details 1314 1271 $memAfterDetails = memory_get_usage(true); 1315 //error_log("PROPERTY IMPORT - After processing property details - Memory: " . round($memAfterDetails / 1048576, 2) . " MB, Diff: " . round(($memAfterDetails - $memBeforeDetails) / 1048576, 2) . " MB");1316 1272 1317 1273 $log = PHP_EOL . 'Ending on Property ' . $propertyId . ', ListingKey: ' . $ListingKey . ' , is insert? ' . $isInsert . ' with new title: ' . $newTitle . ' ' . PHP_EOL; … … 1383 1339 $memEndMB = round($memEnd / 1048576, 2); 1384 1340 $memDiff = round(($memEnd - $memStart) / 1048576, 2); 1385 //error_log("PROPERTY IMPORT COMPLETE - ListingKey: {$ListingKey} - Final Memory: {$memEndMB} MB, Total Change: {$memDiff} MB");1386 1341 1387 1342 // If we see a significant memory increase, log a warning 1388 1343 if ($memDiff > 5) { 1389 //error_log("WARNING: Significant memory increase of {$memDiff} MB after processing property {$ListingKey}");1390 1344 } 1391 1345 … … 1420 1374 ); 1421 1375 1376 1422 1377 if ($propertyId !== 0 || !is_array($mlsImportItemStatus)) { 1423 //error_log('mlsImportItemStatus 0 ');1424 1378 return 'no'; 1425 1379 … … 1439 1393 if(is_array($mlsImportItemStatus)){ 1440 1394 if (!in_array(strtolower($status), $mlsImportItemStatus, true)) { 1441 //error_log('mlsImportItemStatus 1 ');1442 1395 return 'no'; 1443 1396 } 1444 1397 1445 1398 if ($tipImport === 'cron' && !in_array($status, $mlsImportItemStatus, true)) { 1446 //error_log('mlsImportItemStatus 2');1447 1399 return 'no'; 1448 1400 } … … 1450 1402 }else{ 1451 1403 if(!in_array($status, $activeStatuses, true) ){ 1452 //error_log('mlsImportItemStatus 3 ');1453 1404 return 'no'; 1454 1405 } … … 1492 1443 } 1493 1444 1494 // //error_log for debugging (can comment out in production)1495 // //error_log("[MLSImport] post_status: {$post_status} | keep_status: " . json_encode($mlsImportItemStatus) . " | delete_status: " . json_encode($mlsImportItemStatusDelete));1496 1445 1497 1446 // Keep if status matches "keep" status … … 1665 1614 // Initial memory 1666 1615 $memStart = memory_get_usage(true); 1667 //error_log("PROPERTY DETAILS START - Property ID: {$propertyId} - Initial Memory: " . round($memStart / 1048576, 2) . " MB");1668 1616 1669 1617 $log = PHP_EOL . $this->mlsimportMemUsage() . '====before tax======' . PHP_EOL; … … 1673 1621 if (isset($property['taxonomies']) && is_array($property['taxonomies'])) { 1674 1622 $memBeforeTax = memory_get_usage(true); 1675 //error_log("PROPERTY DETAILS - Before taxonomy processing - Memory: " . round($memBeforeTax / 1048576, 2) . " MB");1676 1623 1677 1624 // Load taxonomy mapping options … … 1731 1678 1732 1679 $memAfterTax = memory_get_usage(true); 1733 //error_log("PROPERTY DETAILS - After all taxonomy processing - Memory: " . round($memAfterTax / 1048576, 2) .1734 1680 // " MB, Total Diff: " . round(($memAfterTax - $memBeforeTax) / 1048576, 2) . " MB"); 1735 1681 } … … 1798 1744 1799 1745 $memAfterMeta = memory_get_usage(true); 1800 //error_log("PROPERTY DETAILS - After meta processing - Memory: " . round($memAfterMeta / 1048576, 2) .1801 1746 // " MB, Diff: " . round(($memAfterMeta - $memBeforeMeta) / 1048576, 2) . " MB"); 1802 1747 } … … 1816 1761 1817 1762 $mediaCount = count($property['Media']); 1818 //error_log("PROPERTY DETAILS - Processing {$mediaCount} media items");1819 1763 1820 1764 … … 1824 1768 $order = array_column($property['Media'], 'Order'); 1825 1769 array_multisort($order, SORT_ASC, $property['Media']); 1826 //error_log("MLSImport: Media sorted by 'Order'");1827 1770 } 1828 1771 … … 1849 1792 if (isset($mediaItem['PreferredPhotoYN']) && $mediaItem['PreferredPhotoYN'] == 1) { 1850 1793 $featuredImageKey = $key; 1851 //error_log("MLSImport: Featured image set from PreferredPhotoYN");1852 1794 break; 1853 1795 } … … 1863 1805 if ($featuredImageKey === null && $orderOneKey !== null) { 1864 1806 $featuredImageKey = $orderOneKey; 1865 //error_log("MLSImport: Featured image set from Order = 1");1866 1807 } 1867 1808 … … 1869 1810 if ($featuredImageKey === null && $orderOneKey !== null) { 1870 1811 $featuredImageKey = $orderOneKey; 1871 //error_log("MLSImport: Featured image set from Order = 1");1872 1812 } 1873 1813 … … 1875 1815 if ($featuredImageKey === null && !empty($property['Media'])) { 1876 1816 $featuredImageKey = 0; 1877 //error_log("MLSImport: Featured image set as first image in array");1878 1817 } 1879 1818 … … 1885 1824 delete_post_meta($propertyId, 'REAL_HOMES_property_images'); 1886 1825 delete_post_meta($propertyId, 'wpestate_property_gallery'); 1887 //error_log("MLSImport: Deleted existing image meta for property ID: $propertyId");1888 1826 } 1889 1827 … … 1899 1837 1900 1838 // Incremental progress report 1901 //error_log("PROPERTY DETAILS - Processed media chunk " . ($index + 1) . "/" . count($mediaChunks));1902 1839 } 1903 1840 … … 1921 1858 1922 1859 $memAfterMedia = memory_get_usage(true); 1923 //error_log("PROPERTY DETAILS - After media processing - Memory: " . round($memAfterMedia / 1048576, 2) .1924 1860 // " MB, Diff: " . round(($memAfterMedia - $memBeforeMedia) / 1048576, 2) . " MB"); 1925 1861 … … 1974 1910 // Final memory stats 1975 1911 $memEnd = memory_get_usage(true); 1976 //error_log("PROPERTY DETAILS COMPLETE - Property ID: {$propertyId} - " .1977 // "Final Memory: " . round($memEnd / 1048576, 2) . " MB, " .1978 // "Total Change: " . round(($memEnd - $memStart) / 1048576, 2) . " MB");1979 1912 1980 1913 return $newTitle; -
mlsimport/tags/6.1.2/mlsimport.php
r3357685 r3366929 4 4 * Plugin URI: https://mlsimport.com/ 5 5 * Description: MLS Import - The MLSImport plugin facilitates the connection to your real estate MLS database, allowing you to download and synchronize real estate property data from the MLS. 6 * Version: 6.1. 16 * Version: 6.1.2 7 7 * Requires at least: 5.2 8 8 * Requires PHP: 7.4 -
mlsimport/tags/6.1.2/readme.txt
r3357685 r3366929 5 5 Tested up to: 6.7.1 6 6 Requires PHP: 7.4 7 Stable Tag: 6.1. 17 Stable Tag: 6.1.2 8 8 License: GPLv3 9 9 License URI: https://www.gnu.org/licenses/gpl-3.0.html … … 84 84 85 85 == Changelog == 86 = 6.1.2 = 87 Fix for Realtor.ca on property room parsing 86 88 87 89 = 6.1.1 = -
mlsimport/trunk/README.MD
r3357685 r3366929 5 5 Tested up to: 6.7.1 6 6 Requires PHP: 7.4 7 Stable Tag: 6.1. 17 Stable Tag: 6.1.2 8 8 License: GPLv3 9 9 License URI: https://www.gnu.org/licenses/gpl-3.0.html … … 84 84 85 85 == Changelog == 86 = 6.1.2 = 87 Fix for Realtor.ca on property room parsing 86 88 87 89 = 6.1.1 = -
mlsimport/trunk/admin/class-mlsimport-admin.php
r3357653 r3366929 1042 1042 1043 1043 delete_option( 'mlsimport_mls_metadata_populated' ); 1044 //error_log('deleting '.$prev_mls.' - '.$mls_name);1045 1044 1046 1045 delete_option( 'mlsimport_admin_fields_select' ); … … 1183 1182 * @param WP_Post $post The post object. 1184 1183 */ 1185 public function mlsimport_saas_display_meta_options($post) {1184 public function mlsimport_saas_display_meta_options($post) { 1186 1185 wp_nonce_field(plugin_basename(__FILE__), 'estate_agent_noncename'); 1187 1186 global $mlsimport; … … 1250 1249 */ 1251 1250 private function generateMetaOptionsHtml($postId, $foundItems, $lastDate, $mlsimportItemHowMany, $mlsimportItemStatCron, $mlsimportMlsId, $fieldImport, $hasError = false) { 1251 1252 1252 1253 1253 ob_start(); … … 1588 1588 public function mlsimport_saas_start_cron_links_per_item( $item_id ) { 1589 1589 // Log memory before start 1590 //error_log("[MLSimport] Start $item_id, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");1591 1590 1592 1591 $last_date = $this->mlsimport_saas_get_last_date( $item_id ); … … 1597 1596 // Make request to MLS API 1598 1597 $mlsrequest = $this->mlsimport_make_listing_requests( $item_id, $last_date ); 1599 //error_log("[MLSimport] After mlsimport_make_listing_requests, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");1600 1598 1601 1599 $found_items = 0; … … 1619 1617 // Potentially large array, log memory before/after 1620 1618 $attachments_to_move = (array) $this->mlsimport_saas_generate_import_requests_per_item( $item_id_array, $last_date ); 1621 //error_log("[MLSimport] After generate_import_requests_per_item, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");1622 1619 1623 1620 // Store in post meta (beware if array is huge) … … 1641 1638 unset($attachments_to_move, $attachments_to_send, $mlsrequest, $item_id_array); 1642 1639 gc_collect_cycles(); 1643 //error_log("[MLSimport] End processing $item_id, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");1644 1640 } 1645 1641 } … … 2397 2393 ); 2398 2394 2399 //error_log(json_encode($item_id_array));2400 //error_log("starting post id ".$post_id);2401 2395 2402 2396 update_post_meta( $post_id, 'mlsimport_attach_to_move_' . $post_id, '' ); … … 2542 2536 $how_many = 10000; 2543 2537 } 2544 //error_log('updating for '.$prop_id.' with'. $how_many);2545 2538 update_post_meta($prop_id,'mlsimport_task_to_import', intval($how_many) ); 2546 2539 … … 2599 2592 2600 2593 $total_batches = count( $attachments_to_move ); 2601 2602 //error_log('$total_batches '. json_encode($total_batches) );2603 2604 2605 2594 2606 2595 // removed because $this … … 2631 2620 mlsimport_saas_single_write_import_custom_logs( $log ); 2632 2621 $log = 'Parsing import batch: ' . ( $key + 1 ) . ' of ' . $total_batches . '. Memory used: ' . $mem_usage_show . ' MB.' . PHP_EOL; 2633 //error_log($log);2634 2622 2635 2623 … … 2669 2657 //new stats 2670 2658 update_post_meta( $mlsimportItemId, 'mlsimport_progress_batches', $total_batches ); 2671 update_post_meta( $mlsimportItemId, 'mlsimport_progress_memory', $final_mem_usage_show );2659 update_post_meta( $mlsimportItemId, 'mlsimport_progress_memory', $final_mem_usage_show ); 2672 2660 2673 2661 -
mlsimport/trunk/enviroment/EstateClass.php
r3357653 r3366929 46 46 * @var string $plugin_name 47 47 */ 48 public function enviroment_image_save( $property_id, $attach_id ) { 49 return; 50 } 48 public function enviroment_image_save( $property_id, $attach_id ) { 49 return; 50 } 51 52 /** 53 * Format extra meta values into a safe string representation. 54 */ 55 private function normalizeExtraMetaValue($meta_value) { 56 if (is_array($meta_value)) { 57 $normalized = array(); 58 59 foreach ($meta_value as $value) { 60 if (is_array($value)) { 61 $encoded = function_exists('wp_json_encode') ? wp_json_encode($value) : json_encode($value); 62 63 if (false !== $encoded && null !== $encoded) { 64 $normalized[] = $encoded; 65 } 66 } else { 67 $value = trim((string) $value); 68 if ('' !== $value) { 69 $normalized[] = $value; 70 } 71 } 72 } 73 74 if (empty($normalized)) { 75 return ''; 76 } 77 78 return implode(', ', $normalized); 79 } 80 81 return preg_replace('/\s*,\s*/', ', ', trim((string) $meta_value)); 82 } 83 84 /** 85 * Format Rooms extra meta entries into a single string. 86 */ 87 private function formatRoomsExtraMeta($rooms) { 88 if (!is_array($rooms) || empty($rooms)) { 89 return ''; 90 } 91 92 $formatted_rooms = array(); 93 94 foreach ($rooms as $room_details) { 95 if (!is_array($room_details)) { 96 continue; 97 } 98 99 $room_type = isset($room_details['RoomType']) ? trim((string) $room_details['RoomType']) : ''; 100 $room_level = isset($room_details['RoomLevel']) ? trim((string) $room_details['RoomLevel']) : ''; 101 $room_length = isset($room_details['RoomLength']) ? trim((string) $room_details['RoomLength']) : ''; 102 $room_width = isset($room_details['RoomWidth']) ? trim((string) $room_details['RoomWidth']) : ''; 103 $room_units = isset($room_details['RoomLengthWidthUnits']) ? trim((string) $room_details['RoomLengthWidthUnits']) : ''; 104 105 if ($room_type === '') { 106 continue; 107 } 108 109 $details = array(); 110 if ($room_level !== '') { 111 $details[] = $room_level; 112 } 113 114 $dimension = ''; 115 if ($room_length !== '' && $room_width !== '') { 116 $dimension = $room_length . ' x ' . $room_width; 117 } elseif ($room_length !== '') { 118 $dimension = $room_length; 119 } elseif ($room_width !== '') { 120 $dimension = $room_width; 121 } 122 123 if ($dimension !== '') { 124 if ($room_units !== '') { 125 $dimension .= ' ' . $room_units; 126 } 127 $details[] = $dimension; 128 } elseif ($room_units !== '') { 129 $details[] = $room_units; 130 } 131 132 $formatted_value = $room_type; 133 if (!empty($details)) { 134 $formatted_value .= ': ' . implode(', ', $details); 135 } 136 137 $formatted_rooms[] = $formatted_value; 138 } 139 140 return implode(' | ', $formatted_rooms); 141 } 51 142 52 143 /** 53 144 * Deal with extra meta 54 145 */ 55 public function mlsimportSaasSetExtraMeta( $property_id, $property ) { 56 $property_history = ''; 57 $extra_meta_log = ''; 58 $answer = array(); 59 $options = get_option( 'mlsimport_admin_fields_select' ); 60 $permited_meta = $options['mls-fields']; 61 62 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 63 $meta_properties = $property['extra_meta']; 64 foreach ( $meta_properties as $meta_name => $meta_value ) : 65 // check if extra meta is set to import 66 if ( ! isset( $permited_meta[ $meta_name ] ) ) { 67 // we do not have the extra meta 68 continue; 69 } elseif ( isset( $permited_meta[ $meta_name ] ) && intval( $permited_meta[ $meta_name ] ) === 0 ) { 70 // meta exists but is set to no 71 continue; 72 } 73 74 $meta_name = strtolower( $meta_name ); 75 if ( is_array( $meta_value ) ) { 76 $meta_value = implode( ', ', array_map( 'trim', $meta_value ) ); 77 } else { 78 $meta_value = preg_replace( '/\s*,\s*/', ', ', trim( $meta_value ) ); 79 } 80 update_post_meta( $property_id, $meta_name, $meta_value ); 81 82 if( isset( $options['mls-fields-map-postmeta'][ $meta_name ]) && $options['mls-fields-map-postmeta'][ $meta_name ]!=='' ){ 83 $new_post_meta_key=$options['mls-fields-map-postmeta'][ $meta_name ]; 84 update_post_meta( $property_id, $new_post_meta_key, $meta_value ); 85 $property_history .= 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name . ' and value ' . $meta_value . '</br>'; 86 } 87 88 89 $property_history .= 'Updated EXTRA Meta ' . $meta_name . ' with meta_value ' . $meta_value . '</br>'; 90 $extra_meta_log .= 'Property with ID ' . $property_id . ' Updated EXTRA Meta ' . $meta_name . ' with value ' . $meta_value . PHP_EOL; 91 endforeach; 92 93 $answer['property_history'] = $property_history; 94 $answer['extra_meta_log'] = $extra_meta_log; 95 } 96 97 $answer = $this->mlsimport_saas_set_extra_meta_features( $property_id, $property, $answer ); 98 99 return $answer; 100 } 146 public function mlsimportSaasSetExtraMeta( $property_id, $property ) { 147 $property_history = ''; 148 $extra_meta_log = ''; 149 $answer = array(); 150 $options = get_option( 'mlsimport_admin_fields_select' ); 151 $permited_meta = isset( $options['mls-fields'] ) ? $options['mls-fields'] : array(); 152 153 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 154 $meta_properties = $property['extra_meta']; 155 156 foreach ( $meta_properties as $meta_name => $meta_value ) { 157 if ( ! isset( $permited_meta[ $meta_name ] ) || intval( $permited_meta[ $meta_name ] ) === 0 ) { 158 continue; 159 } 160 161 if ( 'Rooms' === $meta_name && is_array( $meta_value ) ) { 162 $formatted_rooms = $this->formatRoomsExtraMeta( $meta_value ); 163 if ( '' !== $formatted_rooms ) { 164 update_post_meta( $property_id, 'rooms', $formatted_rooms ); 165 $property_history .= 'Updated EXTRA Meta rooms</br>'; 166 $extra_meta_log .= 'Property with ID ' . $property_id . ' Updated EXTRA Meta rooms with value ' . $formatted_rooms . PHP_EOL; 167 } 168 continue; 169 } 170 171 $normalized_value = $this->normalizeExtraMetaValue( $meta_value ); 172 $meta_key = strtolower( $meta_name ); 173 174 update_post_meta( $property_id, $meta_key, $normalized_value ); 175 176 if ( isset( $options['mls-fields-map-postmeta'][ $meta_key ] ) && $options['mls-fields-map-postmeta'][ $meta_key ] !== '' ) { 177 $new_post_meta_key = $options['mls-fields-map-postmeta'][ $meta_key ]; 178 update_post_meta( $property_id, $new_post_meta_key, $normalized_value ); 179 $property_history .= 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_key . ' and value ' . $normalized_value . '</br>'; 180 } 181 182 $property_history .= 'Updated EXTRA Meta ' . $meta_key . ' with meta_value ' . $normalized_value . '</br>'; 183 $extra_meta_log .= 'Property with ID ' . $property_id . ' Updated EXTRA Meta ' . $meta_key . ' with value ' . $normalized_value . PHP_EOL; 184 } 185 186 $answer['property_history'] = $property_history; 187 $answer['extra_meta_log'] = $extra_meta_log; 188 } 189 190 $answer = $this->mlsimport_saas_set_extra_meta_features( $property_id, $property, $answer ); 191 192 return $answer; 193 } 101 194 102 195 public function mlsimport_saas_set_extra_meta_features( $property_id, $property, $answer ) { -
mlsimport/trunk/enviroment/HouzezClass.php
r3357653 r3366929 50 50 */ 51 51 public function enviroment_image_save( $property_id, $attach_id ) { 52 ////error_log(' for '.$property_id.' adding '.$attach_id);53 52 add_post_meta( $property_id, 'fave_property_images', intval( $attach_id ) ); 54 53 } … … 61 60 * @var string $plugin_name 62 61 */ 63 public function enviroment_image_save_gallery( $property_id, $post_attachments ) {62 public function enviroment_image_save_gallery( $property_id, $post_attachments ) { 64 63 return; 65 } 66 67 68 public function return_extra_fields( $property_id ) { 64 } 65 66 67 /** 68 * Format extra meta values into a safe string representation. 69 */ 70 private function normalizeExtraMetaValue($meta_value) { 71 if (is_array($meta_value)) { 72 $normalized = array(); 73 74 foreach ($meta_value as $value) { 75 if (is_array($value)) { 76 $encoded = function_exists('wp_json_encode') ? wp_json_encode($value) : json_encode($value); 77 78 if (false !== $encoded && null !== $encoded) { 79 $normalized[] = $encoded; 80 } 81 } else { 82 $value = trim((string) $value); 83 if ('' !== $value) { 84 $normalized[] = $value; 85 } 86 } 87 } 88 89 if (empty($normalized)) { 90 return ''; 91 } 92 93 return implode(', ', $normalized); 94 } 95 96 return preg_replace('/\s*,\s*/', ', ', trim((string) $meta_value)); 97 } 98 99 /** 100 * Format Rooms extra meta entries into a single string. 101 */ 102 private function formatRoomsExtraMeta($rooms) { 103 if (!is_array($rooms) || empty($rooms)) { 104 return ''; 105 } 106 107 $formatted_rooms = array(); 108 109 foreach ($rooms as $room_details) { 110 if (!is_array($room_details)) { 111 continue; 112 } 113 114 $room_type = isset($room_details['RoomType']) ? trim((string) $room_details['RoomType']) : ''; 115 $room_level = isset($room_details['RoomLevel']) ? trim((string) $room_details['RoomLevel']) : ''; 116 $room_length = isset($room_details['RoomLength']) ? trim((string) $room_details['RoomLength']) : ''; 117 $room_width = isset($room_details['RoomWidth']) ? trim((string) $room_details['RoomWidth']) : ''; 118 $room_units = isset($room_details['RoomLengthWidthUnits']) ? trim((string) $room_details['RoomLengthWidthUnits']) : ''; 119 120 if ($room_type === '') { 121 continue; 122 } 123 124 $details = array(); 125 if ($room_level !== '') { 126 $details[] = $room_level; 127 } 128 129 $dimension = ''; 130 if ($room_length !== '' && $room_width !== '') { 131 $dimension = $room_length . ' x ' . $room_width; 132 } elseif ($room_length !== '') { 133 $dimension = $room_length; 134 } elseif ($room_width !== '') { 135 $dimension = $room_width; 136 } 137 138 if ($dimension !== '') { 139 if ($room_units !== '') { 140 $dimension .= ' ' . $room_units; 141 } 142 $details[] = $dimension; 143 } elseif ($room_units !== '') { 144 $details[] = $room_units; 145 } 146 147 $formatted_value = $room_type; 148 if (!empty($details)) { 149 $formatted_value .= ': ' . implode(', ', $details); 150 } 151 152 $formatted_rooms[] = $formatted_value; 153 } 154 155 return implode(' | ', $formatted_rooms); 156 } 157 158 public function return_extra_fields 159 ( $property_id ) { 69 160 return get_post_meta( $property_id, 'additional_features', true ); 70 161 } … … 74 165 * Deal with extra meta 75 166 */ 76 public function mlsimportSaasSetExtraMeta( $property_id, $property ) {77 $property_history = '';78 $extra_meta_log = '';79 $answer = array();80 $extra_fields = array();81 $options = get_option('mlsimport_admin_fields_select');82 $permited_meta = isset($options['mls-fields']) ? $options['mls-fields'] : array();83 84 // Log input data 85 86 87 88 // save geo coordinates 89 if ( isset( $property['meta']['houzez_geolocation_long'] ) && isset( $property['meta']['houzez_geolocation_lat'] ) ) { 90 $savingx = $property['meta']['houzez_geolocation_lat'] . ',' . $property['meta']['houzez_geolocation_long']; 91 update_post_meta( $property_id, 'fave_property_location', $savingx );92 update_post_meta( $property_id, 'property_location', $savingx );93 $property_history .= 'Update Coordinates Meta (having houzez_geolocation_long ) with ' . $savingx . '</br>';94 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL;95 //error_log($extra_meta_log);96 } elseif ( isset( $property['meta']['property_longitude'] ) && isset( $property['meta']['property_latitude'] ) ) { 97 $savingx = $property['meta']['property_latitude'] . ',' . $property['meta']['property_longitude']; 98 update_post_meta( $property_id, 'fave_property_location', $savingx ); 99 update_post_meta( $property_id, 'property_location', $savingx );100 $property_history .= 'Update Coordinates Meta (having property_longitude) with ' . $savingx . '</br>'; 101 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL; 102 //error_log($extra_meta_log); 103 } 104 105 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 106 $meta_properties = $property['extra_meta']; 107 foreach ( $meta_properties as $meta_name => $meta_value ) : 108 $orignal_meta_name = $meta_name; 109 110 //error_log('doing meta_name: '.$meta_name.' with '.$meta_value); 111 112 if ( ! isset( $permited_meta[ $meta_name ] ) || intval( $permited_meta[ $meta_name ] ) === 0 ) { 113 114 continue; 115 } 116 117 if ( is_array( $meta_value ) ) {118 $meta_value = implode( ', ', array_map( 'trim', $meta_value ) ); 119 } else {120 $meta_value = preg_replace( '/\s*,\s*/', ', ', trim( $meta_value ) );121 } 122 123 if ( '' !== $meta_value 124 && isset( $options['mls-fields'][ $meta_name ] ) 125 && 1 === intval( $options['mls-fields'][ $meta_name ] ) 126 ) {127 $feature_name = isset( $options['mls-fields-label'][ $meta_name ] ) && '' !== $options['mls-fields-label'][ $meta_name ] ? $options['mls-fields-label'][ $meta_name ] : $meta_name;128 if( isset( $options['mls-fields-map-postmeta'][ $orignal_meta_name ]) && $options['mls-fields-map-postmeta'][ $orignal_meta_name ]!=='' ){129 $new_post_meta_key=$options['mls-fields-map-postmeta'][ $orignal_meta_name ];130 131 //if ( isset( $options['mls-fields-map-postmeta'][ $meta_name ]) && $options['mls-fields-map-postmeta'][ $meta_name ] !== '' ) { 132 $new_post_meta_key = $options['mls-fields-map-postmeta'][ $orignal_meta_name ];133 update_post_meta( $property_id, $new_post_meta_key, $meta_value ); 134 $log_msg = 'Property with ID ' . $property_id . ' Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name . ' with value ' . $meta_value; 135 $property_history .= $log_msg . '</br>'; 136 $extra_meta_log .= $log_msg . PHP_EOL;137 //error_log($log_msg);138 } elseif ( isset( $options['mls-fields-map-taxonomy'][ $orignal_meta_name ]) && $options['mls-fields-map-taxonomy'][ $orignal_meta_name ] !== '') {139 $ new_taxonomy = $options['mls-fields-map-taxonomy'][ $orignal_meta_name ];140 $custom_label = $options['mls-fields-label'][ $orignal_meta_name ];141 if ( $custom_label === 'none' ) {142 $custom_label = '';143 }144 $meta_value_with_label = array( trim( $custom_label . ' ' . $meta_value ) );167 public function mlsimportSaasSetExtraMeta( $property_id, $property ) { 168 $property_history = ''; 169 $extra_meta_log = ''; 170 $answer = array(); 171 $extra_fields = array(); 172 $options = get_option('mlsimport_admin_fields_select'); 173 $permited_meta = isset($options['mls-fields']) ? $options['mls-fields'] : array(); 174 175 if ( isset( $property['meta']['houzez_geolocation_long'] ) && isset( $property['meta']['houzez_geolocation_lat'] ) ) { 176 $savingx = $property['meta']['houzez_geolocation_lat'] . ',' . $property['meta']['houzez_geolocation_long']; 177 update_post_meta( $property_id, 'fave_property_location', $savingx ); 178 update_post_meta( $property_id, 'property_location', $savingx ); 179 $property_history .= 'Update Coordinates Meta (having houzez_geolocation_long ) with ' . $savingx . '</br>'; 180 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL; 181 } elseif ( isset( $property['meta']['property_longitude'] ) && isset( $property['meta']['property_latitude'] ) ) { 182 $savingx = $property['meta']['property_latitude'] . ',' . $property['meta']['property_longitude']; 183 update_post_meta( $property_id, 'fave_property_location', $savingx ); 184 update_post_meta( $property_id, 'property_location', $savingx ); 185 $property_history .= 'Update Coordinates Meta (having property_longitude) with ' . $savingx . '</br>'; 186 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL; 187 } 188 189 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 190 $meta_properties = $property['extra_meta']; 191 192 foreach ( $meta_properties as $meta_name => $meta_value ) { 193 if ( ! isset( $permited_meta[ $meta_name ] ) || intval( $permited_meta[ $meta_name ] ) === 0 ) { 194 continue; 195 } 196 197 if ( 'Rooms' === $meta_name && is_array( $meta_value ) ) { 198 $formatted_rooms = $this->formatRoomsExtraMeta( $meta_value ); 199 if ( '' === $formatted_rooms ) { 200 continue; 201 } 202 203 // Save the formatted value on the dedicated meta key and 204 // reuse the string for the rest of the processing pipeline 205 // (custom mappings, additional features, etc.). 206 update_post_meta( $property_id, 'rooms', $formatted_rooms ); 207 $property_history .= 'Updated EXTRA Meta rooms</br>'; 208 $extra_meta_log .= 'Property with ID ' . $property_id . ' Updated EXTRA Meta rooms with value ' . $formatted_rooms . PHP_EOL; 209 210 $meta_value = $formatted_rooms; 211 } 212 213 $meta_value = $this->normalizeExtraMetaValue( $meta_value ); 214 $orignal_meta_name = $meta_name; 215 $feature_name = isset( $options['mls-fields-label'][ $meta_name ] ) && '' !== $options['mls-fields-label'][ $meta_name ] ? $options['mls-fields-label'][ $meta_name ] : $meta_name; 216 217 if ( isset( $options['mls-fields-map-postmeta'][ $orignal_meta_name ] ) && $options['mls-fields-map-postmeta'][ $orignal_meta_name ] !== '' ) { 218 $new_post_meta_key = $options['mls-fields-map-postmeta'][ $orignal_meta_name ]; 219 update_post_meta( $property_id, $new_post_meta_key, $meta_value ); 220 $log_msg = 'Property with ID ' . $property_id . ' Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name . ' with value ' . $meta_value; 221 $property_history .= $log_msg . '</br>'; 222 $extra_meta_log .= $log_msg . PHP_EOL; 223 continue; 224 } 225 226 if ( isset( $options['mls-fields-map-taxonomy'][ $orignal_meta_name ] ) && $options['mls-fields-map-taxonomy'][ $orignal_meta_name ] !== '' ) { 227 $new_taxonomy = $options['mls-fields-map-taxonomy'][ $orignal_meta_name ]; 228 $custom_label = isset( $options['mls-fields-label'][ $orignal_meta_name ] ) ? $options['mls-fields-label'][ $orignal_meta_name ] : ''; 229 if ( 'none' === $custom_label ) { 230 $custom_label = ''; 231 } 232 $term_value = trim( $custom_label . ' ' . $meta_value ); 233 $meta_value_with_label = array(); 234 if ( '' !== $term_value ) { 235 $meta_value_with_label[] = $term_value; 145 236 wp_set_object_terms( $property_id, $meta_value_with_label, $new_taxonomy, true ); 146 237 clean_term_cache( $property_id, $new_taxonomy ); 147 $log_msg = 'Updated CUSTOM TAX: ' . $new_taxonomy . '<-- original '.$orignal_meta_name.'/' . $meta_name . '/' . $custom_label . ' value ' . json_encode($meta_value_with_label); 148 $property_history .= $log_msg;149 //error_log($log_msg);150 } else { 151 if ( isset( $options['mls-fields-admin'][ $meta_name ] ) && intval( $options['mls-fields-admin'][ $meta_name ] ) === 0 ) { 152 // Determine correct field order regardless of storage format 153 if ( isset( $options['field_order'][ $orignal_meta_name ] ) ) { 154 $order = intval( $options['field_order'][ $orignal_meta_name ] ); 155 } else { 156 $index = array_search( $orignal_meta_name, $options['field_order'], true ); 157 $order = ( false !== $index ) ? intval( $index ) : 9999; 158 } 159 $element = array( 160 'meta_name' => $orignal_meta_name, 161 'fave_additional_feature_title' => $feature_name, 162 'fave_additional_feature_value' => $meta_value, 163 'order' => $order, 164 );165 $extra_fields[] = $element;166 } elseif ( isset( $options['mls-fields-admin'][ $meta_name ] ) && intval( $options['mls-fields-admin'][ $meta_name ] ) === 1 ) { 167 update_post_meta( $property_id, strtolower( $feature_name ), $meta_value ); 168 $log_msg = 'Property with ID ' . $property_id . ' Updated EXTRA Meta ' . $meta_name . ' label ' . $feature_name . ' with value ' . $meta_value; 169 $property_history .= $log_msg . '</br>'; 170 $extra_meta_log .= $log_msg . PHP_EOL; 171 //error_log($log_msg); 172 } 173 } 174 } 175 endforeach; 176 177 usort( 178 $extra_fields, 179 function ( $a, $b ) { 180 $orderA = isset( $a['order'] ) ? intval( $a['order'] ) : 9999;181 $orderB = isset( $b['order'] ) ? intval( $b['order'] ) : 9999; 182 return $orderA <=> $orderB; 183 }184 ); 185 186 // Remove helper keys before saving 187 $ordered_extra_fields = array(); 188 foreach ( $extra_fields as $field ) { 189 $ordered_extra_fields[] = array( 190 'fave_additional_feature_title' => $field['fave_additional_feature_title'], 191 'fave_additional_feature_value' => $field['fave_additional_feature_value'], 192 );193 } 194 195 196 197 update_post_meta( $property_id, 'additional_features', $ordered_extra_fields ); 198 199 200 $answer['property_history'] = $property_history; 201 $answer['extra_meta_log'] = $extra_meta_log; 202 //error_log("Final Property History for $property_id: " . $property_history);203 //error_log("Final Extra Meta Log for $property_id: " . $extra_meta_log); 204 } 205 206 //error_log("mlsimportSaasSetExtraMeta END for property_id = $property_id");207 208 return $answer;209 }238 } 239 $property_history .= 'Updated CUSTOM TAX: ' . $new_taxonomy . '<-- original ' . $orignal_meta_name . '/' . $meta_name . '/' . $custom_label . ' value ' . json_encode( $meta_value_with_label ); 240 continue; 241 } 242 243 if ( 244 '' !== $meta_value && 245 isset( $options['mls-fields'][ $meta_name ] ) && 246 1 === intval( $options['mls-fields'][ $meta_name ] ) 247 ) { 248 if ( 249 isset( $options['mls-fields-admin'][ $meta_name ] ) && 250 0 === intval( $options['mls-fields-admin'][ $meta_name ] ) 251 ) { 252 if ( isset( $options['field_order'][ $orignal_meta_name ] ) ) { 253 $order = intval( $options['field_order'][ $orignal_meta_name ] ); 254 } else { 255 $index = array_search( $orignal_meta_name, $options['field_order'], true ); 256 $order = ( false !== $index ) ? intval( $index ) : 9999; 257 } 258 $extra_fields[] = array( 259 'meta_name' => $orignal_meta_name, 260 'fave_additional_feature_title' => $feature_name, 261 'fave_additional_feature_value' => $meta_value, 262 'order' => $order, 263 ); 264 } elseif ( 265 isset( $options['mls-fields-admin'][ $meta_name ] ) && 266 1 === intval( $options['mls-fields-admin'][ $meta_name ] ) 267 ) { 268 update_post_meta( $property_id, strtolower( $feature_name ), $meta_value ); 269 $log_msg = 'Property with ID ' . $property_id . ' Updated EXTRA Meta ' . $meta_name . ' label ' . $feature_name . ' with value ' . $meta_value; 270 $property_history .= $log_msg . '</br>'; 271 $extra_meta_log .= $log_msg . PHP_EOL; 272 } 273 } 274 } 275 276 usort( 277 $extra_fields, 278 function ( $a, $b ) { 279 $orderA = isset( $a['order'] ) ? intval( $a['order'] ) : 9999; 280 $orderB = isset( $b['order'] ) ? intval( $b['order'] ) : 9999; 281 return $orderA <=> $orderB; 282 } 283 ); 284 285 $ordered_extra_fields = array(); 286 foreach ( $extra_fields as $field ) { 287 $ordered_extra_fields[] = array( 288 'fave_additional_feature_title' => $field['fave_additional_feature_title'], 289 'fave_additional_feature_value' => $field['fave_additional_feature_value'], 290 ); 291 } 292 293 update_post_meta( $property_id, 'additional_features', $ordered_extra_fields ); 294 } 295 296 $answer['property_history'] = $property_history; 297 $answer['extra_meta_log'] = $extra_meta_log; 298 299 return $answer; 300 } 210 301 211 302 /** -
mlsimport/trunk/enviroment/RealHomesClass.php
r3357653 r3366929 62 62 * @var string $plugin_name 63 63 */ 64 public function enviroment_image_save_gallery( $property_id, $post_attachments ) {64 public function enviroment_image_save_gallery( $property_id, $post_attachments ) { 65 65 return; 66 } 66 } 67 68 /** 69 * Format extra meta values into a safe string representation. 70 */ 71 private function normalizeExtraMetaValue($meta_value) { 72 if (is_array($meta_value)) { 73 $normalized = array(); 74 75 foreach ($meta_value as $value) { 76 if (is_array($value)) { 77 $encoded = function_exists('wp_json_encode') ? wp_json_encode($value) : json_encode($value); 78 79 if (false !== $encoded && null !== $encoded) { 80 $normalized[] = $encoded; 81 } 82 } else { 83 $value = trim((string) $value); 84 if ('' !== $value) { 85 $normalized[] = $value; 86 } 87 } 88 } 89 90 if (empty($normalized)) { 91 return ''; 92 } 93 94 return implode(', ', $normalized); 95 } 96 97 return preg_replace('/\s*,\s*/', ', ', trim((string) $meta_value)); 98 } 99 100 /** 101 * Format Rooms extra meta entries into a single string. 102 */ 103 private function formatRoomsExtraMeta($rooms) { 104 if (!is_array($rooms) || empty($rooms)) { 105 return ''; 106 } 107 108 $formatted_rooms = array(); 109 110 foreach ($rooms as $room_details) { 111 if (!is_array($room_details)) { 112 continue; 113 } 114 115 $room_type = isset($room_details['RoomType']) ? trim((string) $room_details['RoomType']) : ''; 116 $room_level = isset($room_details['RoomLevel']) ? trim((string) $room_details['RoomLevel']) : ''; 117 $room_length = isset($room_details['RoomLength']) ? trim((string) $room_details['RoomLength']) : ''; 118 $room_width = isset($room_details['RoomWidth']) ? trim((string) $room_details['RoomWidth']) : ''; 119 $room_units = isset($room_details['RoomLengthWidthUnits']) ? trim((string) $room_details['RoomLengthWidthUnits']) : ''; 120 121 if ($room_type === '') { 122 continue; 123 } 124 125 $details = array(); 126 if ($room_level !== '') { 127 $details[] = $room_level; 128 } 129 130 $dimension = ''; 131 if ($room_length !== '' && $room_width !== '') { 132 $dimension = $room_length . ' x ' . $room_width; 133 } elseif ($room_length !== '') { 134 $dimension = $room_length; 135 } elseif ($room_width !== '') { 136 $dimension = $room_width; 137 } 138 139 if ($dimension !== '') { 140 if ($room_units !== '') { 141 $dimension .= ' ' . $room_units; 142 } 143 $details[] = $dimension; 144 } elseif ($room_units !== '') { 145 $details[] = $room_units; 146 } 147 148 $formatted_value = $room_type; 149 if (!empty($details)) { 150 $formatted_value .= ': ' . implode(', ', $details); 151 } 152 153 $formatted_rooms[] = $formatted_value; 154 } 155 156 return implode(' | ', $formatted_rooms); 157 } 67 158 68 159 /** 69 160 * Deal with extra meta 70 161 */ 71 public function mlsimportSaasSetExtraMeta( $property_id, $property ) { 72 $property_history = ''; 73 $extra_meta_log = ''; 74 $answer = array(); 75 $extra_fields = array(); 76 $options = get_option( 'mlsimport_admin_fields_select' ); 77 $permited_meta = isset($options['mls-fields']) ? $options['mls-fields'] : array(); 78 79 // save geo coordinates 80 81 if ( isset( $property['meta']['property_longitude'] ) && isset( $property['meta']['property_latitude'] ) ) { 82 $savingx = $property['meta']['property_latitude'] . ',' . $property['meta']['property_longitude']; 83 update_post_meta( $property_id, 'REAL_HOMES_property_location', $savingx ); 84 $property_history .= 'Update Coordinates Meta with ' . $savingx . '</br>'; 85 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL; 86 } 87 88 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 89 $meta_properties = $property['extra_meta']; 90 foreach ( $meta_properties as $meta_name => $meta_value ) : 91 // check if extra meta is set to import 92 if ( ! isset( $permited_meta[ $meta_name ] ) ) { 93 // we do not have the extra meta 94 continue; 95 } elseif ( isset( $permited_meta[ $meta_name ] ) && intval( $permited_meta[ $meta_name ] ) === 0 ) { 96 // meta exists but is set to no 97 continue; 98 } 99 100 if ( is_array( $meta_value ) ) { 101 $meta_value = implode( ', ', array_map( 'trim', $meta_value ) ); 102 } else { 103 $meta_value = preg_replace( '/\s*,\s*/', ', ', trim( $meta_value ) ); 104 } 105 $orignal_meta_name = $meta_name; 106 107 if( isset( $options['mls-fields-map-postmeta'][ $meta_name ]) && $options['mls-fields-map-postmeta'][ $meta_name ]!=='' ){ 108 $new_post_meta_key=$options['mls-fields-map-postmeta'][ $orignal_meta_name ]; 109 update_post_meta( $property_id, $new_post_meta_key, $meta_value ); 110 $property_history .= 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name . ' and value ' . $meta_value . '</br>'; 111 }else if( isset( $options['mls-fields-map-taxonomy'][ $orignal_meta_name ]) && $options['mls-fields-map-taxonomy'][ $orignal_meta_name ]!=='' ){ 112 $new_taxonomy=$options['mls-fields-map-taxonomy'][ $orignal_meta_name ]; 113 114 $custom_label=$options['mls-fields-label'][ $orignal_meta_name ]; 115 $meta_value_with_label = array( trim( $custom_label.' '.$meta_value) ); 116 117 118 119 120 wp_set_object_terms( $property_id, $meta_value_with_label, $new_taxonomy, true ); 121 clean_term_cache( $property_id, $new_taxonomy ); 122 123 124 $property_history.= 'Updated CUSTOM TAX: ' . $new_taxonomy . '<-- original '.$orignal_meta_name.'/' . $meta_name .'/'.$custom_label. ' and value ' . json_encode($meta_value_with_label); 125 }else{ 126 127 128 if ( '' !== $meta_value && 129 isset( $options['mls-fields'][ $meta_name ] ) && 130 1 === intval( $options['mls-fields'][ $meta_name ] ) 131 ) { 132 $feature_name = isset( $options['mls-fields-label'][ $meta_name ] ) && '' !== $options['mls-fields-label'][ $meta_name ] ? $options['mls-fields-label'][ $meta_name ] : $meta_name; 133 162 public function mlsimportSaasSetExtraMeta( $property_id, $property ) { 163 $property_history = ''; 164 $extra_meta_log = ''; 165 $answer = array(); 166 $extra_fields = array(); 167 $options = get_option( 'mlsimport_admin_fields_select' ); 168 $permited_meta = isset( $options['mls-fields'] ) ? $options['mls-fields'] : array(); 169 170 if ( isset( $property['meta']['property_longitude'] ) && isset( $property['meta']['property_latitude'] ) ) { 171 $savingx = $property['meta']['property_latitude'] . ',' . $property['meta']['property_longitude']; 172 update_post_meta( $property_id, 'REAL_HOMES_property_location', $savingx ); 173 $property_history .= 'Update Coordinates Meta with ' . $savingx . '</br>'; 174 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update Coordinates Meta with ' . $savingx . PHP_EOL; 175 } 176 177 if ( isset( $property['extra_meta'] ) && is_array( $property['extra_meta'] ) ) { 178 $meta_properties = $property['extra_meta']; 179 180 foreach ( $meta_properties as $meta_name => $meta_value ) { 181 if ( ! isset( $permited_meta[ $meta_name ] ) ) { 182 continue; 183 } elseif ( isset( $permited_meta[ $meta_name ] ) && intval( $permited_meta[ $meta_name ] ) === 0 ) { 184 continue; 185 } 186 187 if ( 'Rooms' === $meta_name && is_array( $meta_value ) ) { 188 $formatted_rooms = $this->formatRoomsExtraMeta( $meta_value ); 189 if ( '' !== $formatted_rooms ) { 190 update_post_meta( $property_id, 'rooms', $formatted_rooms ); 191 $property_history .= 'Updated EXTRA Meta rooms</br>'; 192 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update EXTRA Meta rooms with value ' . $formatted_rooms . PHP_EOL; 193 } 194 continue; 195 } 196 197 $meta_value = $this->normalizeExtraMetaValue( $meta_value ); 198 $orignal_meta_name = $meta_name; 199 $feature_label = isset( $options['mls-fields-label'][ $meta_name ] ) && '' !== $options['mls-fields-label'][ $meta_name ] ? $options['mls-fields-label'][ $meta_name ] : $meta_name; 200 201 if ( isset( $options['mls-fields-map-postmeta'][ $orignal_meta_name ] ) && '' !== $options['mls-fields-map-postmeta'][ $orignal_meta_name ] ) { 202 $new_post_meta_key = $options['mls-fields-map-postmeta'][ $orignal_meta_name ]; 203 update_post_meta( $property_id, $new_post_meta_key, $meta_value ); 204 $property_history .= 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name . ' and value ' . $meta_value . '</br>'; 205 } elseif ( isset( $options['mls-fields-map-taxonomy'][ $orignal_meta_name ] ) && '' !== $options['mls-fields-map-taxonomy'][ $orignal_meta_name ] ) { 206 $new_taxonomy = $options['mls-fields-map-taxonomy'][ $orignal_meta_name ]; 207 $custom_label = $options['mls-fields-label'][ $orignal_meta_name ]; 208 $meta_value_with_label = array( trim( $custom_label . ' ' . $meta_value ) ); 209 210 wp_set_object_terms( $property_id, $meta_value_with_label, $new_taxonomy, true ); 211 clean_term_cache( $property_id, $new_taxonomy ); 212 213 $property_history .= 'Updated CUSTOM TAX: ' . $new_taxonomy . '<-- original ' . $orignal_meta_name . '/' . $meta_name . '/' . $custom_label . ' and value ' . json_encode( $meta_value_with_label ); 214 } else { 134 215 if ( 135 isset( $options['mls-fields-admin'][ $meta_name ] ) && 136 0 === intval( $options['mls-fields-admin'][ $meta_name ] ) 216 '' !== $meta_value && 217 isset( $options['mls-fields'][ $meta_name ] ) && 218 1 === intval( $options['mls-fields'][ $meta_name ] ) 137 219 ) { 138 if ( isset( $options['field_order'][ $orignal_meta_name ] ) ) { 139 $order = intval( $options['field_order'][ $orignal_meta_name ] ); 140 } else { 141 $index = array_search( $orignal_meta_name, $options['field_order'], true ); 142 $order = ( false !== $index ) ? intval( $index ) : 9999; 220 if ( 221 isset( $options['mls-fields-admin'][ $meta_name ] ) && 222 0 === intval( $options['mls-fields-admin'][ $meta_name ] ) 223 ) { 224 if ( isset( $options['field_order'][ $orignal_meta_name ] ) ) { 225 $order = intval( $options['field_order'][ $orignal_meta_name ] ); 226 } else { 227 $index = array_search( $orignal_meta_name, $options['field_order'], true ); 228 $order = ( false !== $index ) ? intval( $index ) : 9999; 229 } 230 $extra_fields[] = array( 231 'label' => $feature_label, 232 'value' => $meta_value, 233 'order' => $order, 234 ); 235 } elseif ( 236 isset( $options['mls-fields-admin'][ $meta_name ] ) && 237 1 === intval( $options['mls-fields-admin'][ $meta_name ] ) 238 ) { 239 update_post_meta( $property_id, strtolower( $feature_label ), $meta_value ); 143 240 } 144 $extra_fields[] = array(145 'label' => $feature_name,146 'value' => $meta_value,147 'order' => $order,148 );149 } elseif (150 isset( $options['mls-fields-admin'][ $meta_name ] ) &&151 1 === intval( $options['mls-fields-admin'][ $meta_name ] )152 ) {153 update_post_meta( $property_id, strtolower( $feature_name ), $meta_value );154 241 } 155 242 } 156 } 157 158 159 $property_history .= 'Updated EXTRA Meta ' . $meta_name . ' with label ' . $feature_name . ' and value ' . $meta_value . '</br>'; 160 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update EXTRA Meta ' . $meta_name . ' with value ' . $meta_value . PHP_EOL; 161 162 endforeach; 243 244 $property_history .= 'Updated EXTRA Meta ' . $meta_name . ' with label ' . $feature_label . ' and value ' . $meta_value . '</br>'; 245 $extra_meta_log .= 'Property with ID ' . $property_id . ' Update EXTRA Meta ' . $meta_name . ' with value ' . $meta_value . PHP_EOL; 246 } 247 163 248 usort( 164 249 $extra_fields, … … 169 254 } 170 255 ); 171 $ordered_extra_fields = array(); 172 foreach ( $extra_fields as $field ) { 173 $ordered_extra_fields[ $field['label'] ] = $field['value']; 174 } 175 176 update_post_meta( $property_id, 'REAL_HOMES_additional_details', $ordered_extra_fields ); 177 update_post_meta( $property_id, 'REAL_HOMES_additional_details_list', $ordered_extra_fields ); 178 179 $answer['property_history'] = $property_history; 180 $answer['extra_meta_log'] = $extra_meta_log; 181 182 } 183 184 return $answer; 185 } 256 $ordered_extra_fields = array(); 257 foreach ( $extra_fields as $field ) { 258 $ordered_extra_fields[ $field['label'] ] = $field['value']; 259 } 260 261 update_post_meta( $property_id, 'REAL_HOMES_additional_details', $ordered_extra_fields ); 262 update_post_meta( $property_id, 'REAL_HOMES_additional_details_list', $ordered_extra_fields ); 263 264 $answer['property_history'] = $property_history; 265 $answer['extra_meta_log'] = $extra_meta_log; 266 } 267 268 return $answer; 269 } 186 270 187 271 -
mlsimport/trunk/enviroment/ResidenceClass.php
r3357653 r3366929 72 72 73 73 74 /** 75 * Deal with extra meta 76 */ 77 78 79 /** 80 * Deal with extra meta 81 */ 82 public function mlsimportSaasSetExtraMeta($property_id, $property) { 74 /** 75 * Format extra meta values into a safe string representation. 76 */ 77 private function normalizeExtraMetaValue($meta_value) { 78 if (is_array($meta_value)) { 79 $normalized = array(); 80 81 foreach ($meta_value as $value) { 82 if (is_array($value)) { 83 if (function_exists('wp_json_encode')) { 84 $encoded = wp_json_encode($value); 85 } else { 86 $encoded = json_encode($value); 87 } 88 89 if (false !== $encoded && null !== $encoded) { 90 $normalized[] = $encoded; 91 } 92 } else { 93 $value = trim((string) $value); 94 if ('' !== $value) { 95 $normalized[] = $value; 96 } 97 } 98 } 99 100 if (empty($normalized)) { 101 return ''; 102 } 103 104 return implode(', ', $normalized); 105 } 106 107 return preg_replace('/\s*,\s*/', ', ', trim((string) $meta_value)); 108 } 109 110 /** 111 * Format Rooms extra meta entries into a single string. 112 */ 113 private function formatRoomsExtraMeta($rooms, $property_id) { 114 if (!is_array($rooms) || empty($rooms)) { 115 return ''; 116 } 117 118 119 $formatted_rooms = array(); 120 121 foreach ($rooms as $index => $room_details) { 122 if (!is_array($room_details)) { 123 continue; 124 } 125 126 $room_type = isset($room_details['RoomType']) ? trim((string) $room_details['RoomType']) : ''; 127 $room_level = isset($room_details['RoomLevel']) ? trim((string) $room_details['RoomLevel']) : ''; 128 $room_length = isset($room_details['RoomLength']) ? trim((string) $room_details['RoomLength']) : ''; 129 $room_width = isset($room_details['RoomWidth']) ? trim((string) $room_details['RoomWidth']) : ''; 130 $room_units = isset($room_details['RoomLengthWidthUnits']) ? trim((string) $room_details['RoomLengthWidthUnits']) : ''; 131 132 if ($room_type === '') { 133 continue; 134 } 135 136 $details = array(); 137 if ($room_level !== '') { 138 $details[] = $room_level; 139 } 140 141 $dimension = ''; 142 if ($room_length !== '' && $room_width !== '') { 143 $dimension = $room_length . ' x ' . $room_width; 144 } elseif ($room_length !== '') { 145 $dimension = $room_length; 146 } elseif ($room_width !== '') { 147 $dimension = $room_width; 148 } 149 150 if ($dimension !== '') { 151 if ($room_units !== '') { 152 $dimension .= ' ' . $room_units; 153 } 154 $details[] = $dimension; 155 } elseif ($room_units !== '') { 156 $details[] = $room_units; 157 } 158 159 $formatted_value = $room_type; 160 if (!empty($details)) { 161 $formatted_value .= ': ' . implode(', ', $details); 162 } 163 164 $formatted_rooms[] = $formatted_value; 165 } 166 167 $result = implode(' | ', $formatted_rooms); 168 169 return $result; 170 } 171 172 173 /** 174 * Deal with extra meta 175 */ 176 177 178 /** 179 * Deal with extra meta 180 */ 181 public function mlsimportSaasSetExtraMeta($property_id, $property) { 83 182 // Memory tracking 84 183 $startMemory = memory_get_usage(true); 85 184 $startMemoryFormatted = round($startMemory / 1048576, 2); 86 //error_log("[Memory-ExtraMeta] Starting extra meta processing with memory: {$startMemoryFormatted} MB");87 185 88 186 $property_history = array(); … … 91 189 if (!isset($property['extra_meta']) || !is_array($property['extra_meta'])) { 92 190 $answer['property_history'] = ''; 93 191 94 192 $endMemory = memory_get_usage(true); 95 193 $endMemoryFormatted = round($endMemory / 1048576, 2); 96 194 $memoryDiff = $endMemoryFormatted - $startMemoryFormatted; 97 //error_log("[Memory-ExtraMeta] No extra meta, finished with memory: {$endMemoryFormatted} MB (change: +{$memoryDiff} MB)"); 98 195 99 196 return $answer; 100 197 } … … 110 207 foreach ($meta_batches as $meta_batch_keys) { 111 208 $batch_count++; 112 209 113 210 $batchMemory = memory_get_usage(true); 114 211 $batchMemoryFormatted = round($batchMemory / 1048576, 2); 115 //error_log("[Memory-ExtraMeta] Processing batch {$batch_count} with memory: {$batchMemoryFormatted} MB");116 212 117 213 foreach ($meta_batch_keys as $meta_name) { … … 120 216 continue; 121 217 } 122 218 123 219 $meta_value = $property['extra_meta'][$meta_name]; 124 220 125 221 // Check if extra meta is set to import 126 222 if (!isset($permited_meta[$meta_name])) { … … 131 227 continue; 132 228 } 133 229 230 if ('Rooms' === $meta_name && is_array($meta_value)) { 231 $formatted_rooms = $this->formatRoomsExtraMeta($meta_value, $property_id); 232 if ($formatted_rooms !== '') { 233 update_post_meta($property_id, 'rooms', $formatted_rooms); 234 $property_history[] = 'Updated EXTRA Meta rooms'; 235 } 236 continue; 237 } 238 239 $normalized_meta_value = $this->normalizeExtraMetaValue($meta_value); 240 134 241 $original_meta_name = $meta_name; 135 242 $meta_name_lower = strtolower($meta_name); … … 139 246 $new_post_meta_key = $options['mls-fields-map-postmeta'][$original_meta_name]; 140 247 141 if (is_array($meta_value)) { 142 $meta_value = implode(', ', array_map('trim', $meta_value)); 143 } else { 144 $meta_value = preg_replace('/\s*,\s*/', ', ', trim($meta_value)); 145 } 146 147 update_post_meta($property_id, $new_post_meta_key, $meta_value); 248 update_post_meta($property_id, $new_post_meta_key, $normalized_meta_value); 148 249 $property_history[] = 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name; 149 } 250 } 150 251 // Process custom taxonomy mapping 151 252 else if (isset($options['mls-fields-map-taxonomy'][$original_meta_name]) && $options['mls-fields-map-taxonomy'][$original_meta_name] !== '') { … … 157 258 } 158 259 159 if (is_array($meta_value)) {160 $meta_value = implode(', ', array_map('trim', $meta_value));161 } else{162 $meta_value = preg_replace('/\s*,\s*/', ', ', trim($meta_value));260 $meta_value_with_label = array(); 261 $term_value = trim($custom_label . ' ' . $normalized_meta_value); 262 if ($term_value !== '') { 263 $meta_value_with_label[] = $term_value; 163 264 } 164 265 165 $meta_value_with_label = array(trim($custom_label . ' ' . $meta_value));166 167 wp_set_object_terms($property_id, $meta_value_with_label, $new_taxonomy, true);168 169 // Fix the clean_term_cache call to avoid SQL errors170 266 if (!empty($meta_value_with_label)) { 267 wp_set_object_terms($property_id, $meta_value_with_label, $new_taxonomy, true); 268 269 // Fix the clean_term_cache call to avoid SQL errors 171 270 $term_ids = array(); 172 271 foreach ($meta_value_with_label as $term_name) { … … 176 275 } 177 276 } 178 277 179 278 if (!empty($term_ids)) { 180 279 clean_term_cache($term_ids, $new_taxonomy); 181 280 } 182 281 } 183 282 184 283 $property_history[] = 'Updated CUSTOM TAX: ' . $new_taxonomy . ' original ' . $original_meta_name; 185 } 284 } 186 285 // Standard meta update 187 286 else { 188 if (is_array($meta_value)) { 189 $meta_value = implode(', ', array_map('trim', $meta_value)); 190 } else { 191 $meta_value = preg_replace('/\s*,\s*/', ', ', trim($meta_value)); 192 } 193 194 update_post_meta($property_id, $meta_name_lower, $meta_value); 287 update_post_meta($property_id, $meta_name_lower, $normalized_meta_value); 195 288 $property_history[] = 'Updated EXTRA Meta ' . $meta_name_lower; 196 289 } 197 290 198 291 // Clear each variable after use 199 292 $meta_value = null; 293 $normalized_meta_value = null; 200 294 } 201 295 … … 207 301 $afterBatchMemoryFormatted = round($afterBatchMemory / 1048576, 2); 208 302 $batchMemoryDiff = $afterBatchMemoryFormatted - $batchMemoryFormatted; 209 //error_log("[Memory-ExtraMeta] Finished batch {$batch_count} with memory: {$afterBatchMemoryFormatted} MB (change: +{$batchMemoryDiff} MB)");210 303 } 211 304 … … 218 311 $property_history[] = '... [truncated history to save memory] ...'; 219 312 } 220 313 221 314 $answer['property_history'] = implode('</br>', $property_history); 222 315 … … 230 323 $endMemoryFormatted = round($endMemory / 1048576, 2); 231 324 $memoryDiff = $endMemoryFormatted - $startMemoryFormatted; 232 //error_log("[Memory-ExtraMeta] Finished extra meta processing with memory: {$endMemoryFormatted} MB (change: +{$memoryDiff} MB)");233 325 234 326 return $answer; -
mlsimport/trunk/includes/ThemeImport.php
r3357653 r3366929 200 200 201 201 if (!$refresh_result) { 202 //error_log('MLSImport: Failed to refresh expired token');203 202 return false; 204 203 } … … 217 216 218 217 if (empty($username) || empty($password)) { 219 //error_log('MLSImport: Missing credentials for token refresh');220 218 return false; 221 219 } … … 241 239 242 240 if (is_wp_error($response)) { 243 //error_log('MLSImport: Token refresh request failed: ' . $response->get_error_message());244 241 return false; 245 242 } … … 249 246 250 247 if (!isset($data['success']) || !$data['success'] || !isset($data['token']) || !isset($data['expires'])) { 251 //error_log('MLSImport: Invalid token refresh response');252 248 return false; 253 249 } … … 261 257 update_option('mlsimport_token_expiry', intval($data['expires'])); 262 258 263 //error_log('MLSImport: Token successfully refreshed. Expires: ' . date('Y-m-d H:i:s', $data['expires']));264 259 265 260 return true; … … 268 263 269 264 /** 270 * Parse Result Array with //error_log memory tracking and enhanced memory management271 265 * 272 266 * @param array $readyToParseArray The array ready to be parsed. … … 281 275 // Log initial memory usage 282 276 $initialMemory = memory_get_usage(true); 283 //error_log("MLS Import - START batch {$batchKey} - Memory: " . round($initialMemory / 1048576, 2) . " MB");284 277 285 278 $counterProp = 0; … … 289 282 // Log total items to process 290 283 $totalItems = count($readyToParseArray['data']); 291 //error_log("MLS Import - Processing {$totalItems} properties in batch {$batchKey}");292 284 293 285 … … 316 308 317 309 $current_prop_value = (int) get_post_meta( $mlsimportItemId, 'mlsimport_progress_properties', true ); 318 //error_log('for itemID '.$mlsimportItemId.' count1 -> before bathich '.$current_prop_value);319 310 320 311 … … 328 319 329 320 $listingKey = isset($property['ListingKey']) ? $property['ListingKey'] : 'unknown'; 330 //error_log("MLS Import - Before property {$counterProp}/{$totalItems} (ListingKey: {$listingKey}) - Memory: {$memoryBeforeMB} MB");331 321 332 322 // Clear out database caches that might be polluted … … 341 331 $current_prop_value = $current_prop_value + 1; 342 332 update_post_meta( $mlsimportItemId, 'mlsimport_progress_properties', $current_prop_value ); 343 //error_log(' count2 -> after updateing '.$current_prop_value);344 333 345 334 … … 353 342 $memoryDiff = round(($memoryAfter - $memoryBefore) / 1048576, 2); 354 343 355 //error_log("MLS Import - After property {$counterProp}/{$totalItems} - Memory: {$memoryAfterMB} MB, Diff: {$memoryDiff} MB");356 344 357 345 // Check for memory leak pattern 358 346 if ($memoryDiff > 10) { 359 //error_log("MLS Import - WARNING: Significant memory increase of {$memoryDiff} MB after property {$counterProp}");360 347 // Force cleanup on large increases 361 348 $this->cleanUpMemory(true); … … 378 365 $memoryAfterCleanup = memory_get_usage(true); 379 366 $freedMemory = round(($memoryAfter - $memoryAfterCleanup) / 1048576, 2); 380 //error_log("MLS Import - After cleanup: {$freedMemory} MB freed, Current: " . round($memoryAfterCleanup / 1048576, 2) . " MB");381 367 } 382 368 } else { 383 //error_log("MLS Import - Import stopped by user command at property {$counterProp}");384 369 update_post_meta($itemIdArray['item_id'], 'mlsimport_spawn_status', 'completed'); 385 370 break; … … 390 375 } 391 376 } else { 392 //error_log("MLS Import - No valid data in batch {$batchKey}");393 377 } 394 378 … … 403 387 $peakMemory = round(memory_get_peak_usage(true) / 1048576, 2); 404 388 405 //error_log("MLS Import - END batch {$batchKey} - Processed {$counterProp} properties");406 //error_log("MLS Import - Final Memory: {$finalMemoryMB} MB, Diff: {$totalMemoryDiff} MB, Peak: {$peakMemory} MB");407 389 } 408 390 … … 603 585 wp_delete_object_term_relationships($propertyId, $taxonomy); 604 586 } else { 605 // //error_log("Taxonomy does not exist: {$taxonomy}");606 587 } 607 588 } … … 836 817 837 818 $mediaHistory = []; 838 //error_log("MLSImport: Starting image processing for property ID: $propertyId");839 819 840 820 if ($isInsert === 'no') { 841 821 $mediaHistory[] = 'Media - We have edit - images are not replaced'; 842 //error_log("MLSImport: Edit mode detected, images not replaced.");843 822 return $media_attachments; 844 823 //return implode('</br>', $mediaHistory); … … 858 837 foreach ($media as $key=>$image) { 859 838 if (isset($image['MediaCategory']) && $image['MediaCategory'] !== 'Property Photo' && $image['MediaCategory'] !== 'Photo') { 860 //error_log("MLSImport: Skipping non-photo media category: " . $image['MediaCategory']);861 839 continue; 862 840 } 863 841 864 842 if ( empty( $image['MediaURL'] ) ) { 865 //error_log('empty mediaURL');866 843 continue; 867 844 } … … 882 859 883 860 $attachId = wp_insert_attachment($attachment, $file); 884 //error_log("Processing: " . $file . " - Result: " . (is_wp_error($attachId) ? $attachId->get_error_message() : $attachId));885 861 if (is_wp_error($attachId)) { 886 //error_log("MLSImport: Failed to insert attachment for $file. Error: " . $attachId->get_error_message());887 862 } else { 888 //error_log("MLSImport: Inserted attachment ID $attachId for file $file");889 863 $mediaHistory[] = 'Media - Added ' . $file . ' as attachment ' . $attachId; 890 864 $media_attachments[]=$attachId; … … 897 871 898 872 899 //error_log("BEFORE set_post_thumbnail: hasFeatured=false, setting featuredImageKey=$featuredImageKey as $key featured for propertyId=$propertyId");900 873 set_post_thumbnail($propertyId, $attachId); 901 874 902 // error_log("AFTER set_post_thumbnail: hasFeatured=true, attachId=$attachId should now be featured");903 875 } else { 904 // error_log("SKIPPING featured image: hasFeatured=true, attachId=$attachId");905 876 } 906 877 } 907 878 } else { 908 //error_log("MLSImport: Media item missing 'MediaURL', skipping.");909 879 } 910 880 } 911 881 } else { 912 882 $mediaHistory[] = 'Media data is blank - there are no images'; 913 //error_log("MLSImport: Media array is not valid or empty.");914 883 } 915 884 … … 1187 1156 $memStart = memory_get_usage(true); 1188 1157 $memStartMB = round($memStart / 1048576, 2); 1189 //error_log("PROPERTY IMPORT START - ListingKey: " . ($property['ListingKey'] ?? 'unknown') . " - Memory: {$memStartMB} MB");1190 1158 1191 1159 $mlsImportItemStatus = $mlsimportItemOptionData['mlsimport_item_standardstatus']; … … 1211 1179 // Memory before property ID lookup 1212 1180 $memBeforeRetrieve = memory_get_usage(true); 1213 //error_log("PROPERTY IMPORT - Before property ID lookup - Memory: " . round($memBeforeRetrieve / 1048576, 2) . " MB");1214 1181 1215 1182 $propertyId = intval($this->mlsimportSaasRetrievePropertyById($ListingKey, $listingPostType)); … … 1217 1184 // Memory after property ID lookup 1218 1185 $memAfterRetrieve = memory_get_usage(true); 1219 //error_log("PROPERTY IMPORT - After property ID lookup - Memory: " . round($memAfterRetrieve / 1048576, 2) . " MB, Diff: " . round(($memAfterRetrieve - $memBeforeRetrieve) / 1048576, 2) . " MB");1220 1186 1221 1187 $status = isset($property['StandardStatus']) ? strtolower($property['StandardStatus']) : strtolower($property['extra_meta']['MlsStatus']); … … 1234 1200 // Memory before insert/update 1235 1201 $memBeforeInsert = memory_get_usage(true); 1236 //error_log("PROPERTY IMPORT - Before " . ($isInsert === 'yes' ? "insert" : "update/check") . " - Memory: " . round($memBeforeInsert / 1048576, 2) . " MB");1237 1202 1238 1203 if ($isInsert === 'yes') { … … 1248 1213 if (is_wp_error($propertyId)) { 1249 1214 $this->writeImportLogs('ERROR: on inserting ' . PHP_EOL, $tipImport); 1250 //error_log("PROPERTY IMPORT ERROR - Failed to insert property: " . $propertyId->get_error_message());1251 1215 } else { 1252 1216 update_post_meta($propertyId, 'ListingKey', $ListingKey); … … 1262 1226 // Memory before checking existing property 1263 1227 $memBeforeCheck = memory_get_usage(true); 1264 //error_log("PROPERTY IMPORT - Before checking existing property - Memory: " . round($memBeforeCheck / 1048576, 2) . " MB");1265 1228 1266 1229 $keep = $this->check_if_delete_when_status($propertyId,$mlsImportItemStatus,$mlsImportItemStatusDelete); … … 1272 1235 // Memory before delete 1273 1236 $memBeforeDelete = memory_get_usage(true); 1274 //error_log("PROPERTY IMPORT - Before deleting property - Memory: " . round($memBeforeDelete / 1048576, 2) . " MB");1275 1237 1276 1238 $this->deleteProperty($propertyId, $ListingKey); … … 1278 1240 // Memory after delete 1279 1241 $memAfterDelete = memory_get_usage(true); 1280 //error_log("PROPERTY IMPORT - After deleting property - Memory: " . round($memAfterDelete / 1048576, 2) . " MB, Diff: " . round(($memAfterDelete - $memBeforeDelete) / 1048576, 2) . " MB");1281 1242 1282 1243 $this->writeImportLogs($log, $tipImport); … … 1286 1247 // Memory before updating 1287 1248 $memBeforeUpdate = memory_get_usage(true); 1288 //error_log("PROPERTY IMPORT - Before updating existing property - Memory: " . round($memBeforeUpdate / 1048576, 2) . " MB");1289 1249 1290 1250 $propertyHistory = $this->updateExistingProperty($propertyId,$mlsImportItemStatusDelete, $content, $listingPostType, $newAuthor, $status, $mlsImportItemStatus, $propertyHistory, $tipImport, $ListingKey); … … 1292 1252 // Memory after updating 1293 1253 $memAfterUpdate = memory_get_usage(true); 1294 //error_log("PROPERTY IMPORT - After updating existing property - Memory: " . round($memAfterUpdate / 1048576, 2) . " MB, Diff: " . round(($memAfterUpdate - $memBeforeUpdate) / 1048576, 2) . " MB");1295 1254 } 1296 1255 } … … 1298 1257 // Memory after insert/update 1299 1258 $memAfterInsert = memory_get_usage(true); 1300 //error_log("PROPERTY IMPORT - After " . ($isInsert === 'yes' ? "insert" : "update/check") . " - Memory: " . round($memAfterInsert / 1048576, 2) . " MB, Diff: " . round(($memAfterInsert - $memBeforeInsert) / 1048576, 2) . " MB");1301 1259 1302 1260 if ($propertyId === 0) { … … 1307 1265 // Memory before processing details 1308 1266 $memBeforeDetails = memory_get_usage(true); 1309 //error_log("PROPERTY IMPORT - Before processing property details - Memory: " . round($memBeforeDetails / 1048576, 2) . " MB");1310 1267 1311 1268 $newTitle = $this->processPropertyDetails($property, $propertyId, $tipImport, $propertyHistory, $newAgent, $itemIdArray,$isInsert); … … 1313 1270 // Memory after processing details 1314 1271 $memAfterDetails = memory_get_usage(true); 1315 //error_log("PROPERTY IMPORT - After processing property details - Memory: " . round($memAfterDetails / 1048576, 2) . " MB, Diff: " . round(($memAfterDetails - $memBeforeDetails) / 1048576, 2) . " MB");1316 1272 1317 1273 $log = PHP_EOL . 'Ending on Property ' . $propertyId . ', ListingKey: ' . $ListingKey . ' , is insert? ' . $isInsert . ' with new title: ' . $newTitle . ' ' . PHP_EOL; … … 1383 1339 $memEndMB = round($memEnd / 1048576, 2); 1384 1340 $memDiff = round(($memEnd - $memStart) / 1048576, 2); 1385 //error_log("PROPERTY IMPORT COMPLETE - ListingKey: {$ListingKey} - Final Memory: {$memEndMB} MB, Total Change: {$memDiff} MB");1386 1341 1387 1342 // If we see a significant memory increase, log a warning 1388 1343 if ($memDiff > 5) { 1389 //error_log("WARNING: Significant memory increase of {$memDiff} MB after processing property {$ListingKey}");1390 1344 } 1391 1345 … … 1420 1374 ); 1421 1375 1376 1422 1377 if ($propertyId !== 0 || !is_array($mlsImportItemStatus)) { 1423 //error_log('mlsImportItemStatus 0 ');1424 1378 return 'no'; 1425 1379 … … 1439 1393 if(is_array($mlsImportItemStatus)){ 1440 1394 if (!in_array(strtolower($status), $mlsImportItemStatus, true)) { 1441 //error_log('mlsImportItemStatus 1 ');1442 1395 return 'no'; 1443 1396 } 1444 1397 1445 1398 if ($tipImport === 'cron' && !in_array($status, $mlsImportItemStatus, true)) { 1446 //error_log('mlsImportItemStatus 2');1447 1399 return 'no'; 1448 1400 } … … 1450 1402 }else{ 1451 1403 if(!in_array($status, $activeStatuses, true) ){ 1452 //error_log('mlsImportItemStatus 3 ');1453 1404 return 'no'; 1454 1405 } … … 1492 1443 } 1493 1444 1494 // //error_log for debugging (can comment out in production)1495 // //error_log("[MLSImport] post_status: {$post_status} | keep_status: " . json_encode($mlsImportItemStatus) . " | delete_status: " . json_encode($mlsImportItemStatusDelete));1496 1445 1497 1446 // Keep if status matches "keep" status … … 1665 1614 // Initial memory 1666 1615 $memStart = memory_get_usage(true); 1667 //error_log("PROPERTY DETAILS START - Property ID: {$propertyId} - Initial Memory: " . round($memStart / 1048576, 2) . " MB");1668 1616 1669 1617 $log = PHP_EOL . $this->mlsimportMemUsage() . '====before tax======' . PHP_EOL; … … 1673 1621 if (isset($property['taxonomies']) && is_array($property['taxonomies'])) { 1674 1622 $memBeforeTax = memory_get_usage(true); 1675 //error_log("PROPERTY DETAILS - Before taxonomy processing - Memory: " . round($memBeforeTax / 1048576, 2) . " MB");1676 1623 1677 1624 // Load taxonomy mapping options … … 1731 1678 1732 1679 $memAfterTax = memory_get_usage(true); 1733 //error_log("PROPERTY DETAILS - After all taxonomy processing - Memory: " . round($memAfterTax / 1048576, 2) .1734 1680 // " MB, Total Diff: " . round(($memAfterTax - $memBeforeTax) / 1048576, 2) . " MB"); 1735 1681 } … … 1798 1744 1799 1745 $memAfterMeta = memory_get_usage(true); 1800 //error_log("PROPERTY DETAILS - After meta processing - Memory: " . round($memAfterMeta / 1048576, 2) .1801 1746 // " MB, Diff: " . round(($memAfterMeta - $memBeforeMeta) / 1048576, 2) . " MB"); 1802 1747 } … … 1816 1761 1817 1762 $mediaCount = count($property['Media']); 1818 //error_log("PROPERTY DETAILS - Processing {$mediaCount} media items");1819 1763 1820 1764 … … 1824 1768 $order = array_column($property['Media'], 'Order'); 1825 1769 array_multisort($order, SORT_ASC, $property['Media']); 1826 //error_log("MLSImport: Media sorted by 'Order'");1827 1770 } 1828 1771 … … 1849 1792 if (isset($mediaItem['PreferredPhotoYN']) && $mediaItem['PreferredPhotoYN'] == 1) { 1850 1793 $featuredImageKey = $key; 1851 //error_log("MLSImport: Featured image set from PreferredPhotoYN");1852 1794 break; 1853 1795 } … … 1863 1805 if ($featuredImageKey === null && $orderOneKey !== null) { 1864 1806 $featuredImageKey = $orderOneKey; 1865 //error_log("MLSImport: Featured image set from Order = 1");1866 1807 } 1867 1808 … … 1869 1810 if ($featuredImageKey === null && $orderOneKey !== null) { 1870 1811 $featuredImageKey = $orderOneKey; 1871 //error_log("MLSImport: Featured image set from Order = 1");1872 1812 } 1873 1813 … … 1875 1815 if ($featuredImageKey === null && !empty($property['Media'])) { 1876 1816 $featuredImageKey = 0; 1877 //error_log("MLSImport: Featured image set as first image in array");1878 1817 } 1879 1818 … … 1885 1824 delete_post_meta($propertyId, 'REAL_HOMES_property_images'); 1886 1825 delete_post_meta($propertyId, 'wpestate_property_gallery'); 1887 //error_log("MLSImport: Deleted existing image meta for property ID: $propertyId");1888 1826 } 1889 1827 … … 1899 1837 1900 1838 // Incremental progress report 1901 //error_log("PROPERTY DETAILS - Processed media chunk " . ($index + 1) . "/" . count($mediaChunks));1902 1839 } 1903 1840 … … 1921 1858 1922 1859 $memAfterMedia = memory_get_usage(true); 1923 //error_log("PROPERTY DETAILS - After media processing - Memory: " . round($memAfterMedia / 1048576, 2) .1924 1860 // " MB, Diff: " . round(($memAfterMedia - $memBeforeMedia) / 1048576, 2) . " MB"); 1925 1861 … … 1974 1910 // Final memory stats 1975 1911 $memEnd = memory_get_usage(true); 1976 //error_log("PROPERTY DETAILS COMPLETE - Property ID: {$propertyId} - " .1977 // "Final Memory: " . round($memEnd / 1048576, 2) . " MB, " .1978 // "Total Change: " . round(($memEnd - $memStart) / 1048576, 2) . " MB");1979 1912 1980 1913 return $newTitle; -
mlsimport/trunk/mlsimport.php
r3357685 r3366929 4 4 * Plugin URI: https://mlsimport.com/ 5 5 * Description: MLS Import - The MLSImport plugin facilitates the connection to your real estate MLS database, allowing you to download and synchronize real estate property data from the MLS. 6 * Version: 6.1. 16 * Version: 6.1.2 7 7 * Requires at least: 5.2 8 8 * Requires PHP: 7.4 -
mlsimport/trunk/readme.txt
r3357685 r3366929 5 5 Tested up to: 6.7.1 6 6 Requires PHP: 7.4 7 Stable Tag: 6.1. 17 Stable Tag: 6.1.2 8 8 License: GPLv3 9 9 License URI: https://www.gnu.org/licenses/gpl-3.0.html … … 84 84 85 85 == Changelog == 86 = 6.1.2 = 87 Fix for Realtor.ca on property room parsing 86 88 87 89 = 6.1.1 =
Note: See TracChangeset
for help on using the changeset viewer.