Plugin Directory

Changeset 3366929


Ignore:
Timestamp:
09/24/2025 06:27:49 AM (6 months ago)
Author:
mlsimport
Message:

Update to version 6.1.2 from GitHub

Location:
mlsimport
Files:
18 edited
1 copied

Legend:

Unmodified
Added
Removed
  • mlsimport/tags/6.1.2/README.MD

    r3357685 r3366929  
    55Tested up to: 6.7.1
    66Requires PHP: 7.4
    7 Stable Tag: 6.1.1
     7Stable Tag: 6.1.2
    88License: GPLv3
    99License URI: https://www.gnu.org/licenses/gpl-3.0.html
     
    8484
    8585== Changelog ==
     86= 6.1.2 =
     87Fix for Realtor.ca on property room parsing
    8688
    8789= 6.1.1 =
  • mlsimport/tags/6.1.2/admin/class-mlsimport-admin.php

    r3357653 r3366929  
    10421042
    10431043            delete_option( 'mlsimport_mls_metadata_populated' );
    1044             //error_log('deleting '.$prev_mls.' - '.$mls_name);
    10451044
    10461045            delete_option( 'mlsimport_admin_fields_select' );
     
    11831182     * @param WP_Post $post The post object.
    11841183     */
    1185     public function mlsimport_saas_display_meta_options($post) {
     1184        public function mlsimport_saas_display_meta_options($post) {
    11861185                wp_nonce_field(plugin_basename(__FILE__), 'estate_agent_noncename');
    11871186                global $mlsimport;
     
    12501249     */
    12511250       private function generateMetaOptionsHtml($postId, $foundItems, $lastDate, $mlsimportItemHowMany, $mlsimportItemStatCron, $mlsimportMlsId, $fieldImport, $hasError = false) {
     1251
    12521252
    12531253        ob_start();
     
    15881588       public function mlsimport_saas_start_cron_links_per_item( $item_id ) {
    15891589           // Log memory before start
    1590            //error_log("[MLSimport] Start $item_id, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");
    15911590
    15921591           $last_date = $this->mlsimport_saas_get_last_date( $item_id );
     
    15971596           // Make request to MLS API
    15981597           $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");
    16001598
    16011599           $found_items = 0;
     
    16191617               // Potentially large array, log memory before/after
    16201618               $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");
    16221619
    16231620               // Store in post meta (beware if array is huge)
     
    16411638               unset($attachments_to_move, $attachments_to_send, $mlsrequest, $item_id_array);
    16421639               gc_collect_cycles();
    1643                //error_log("[MLSimport] End processing $item_id, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");
    16441640           }
    16451641       }
     
    23972393        );
    23982394
    2399         //error_log(json_encode($item_id_array));
    2400         //error_log("starting post id ".$post_id);
    24012395
    24022396                update_post_meta( $post_id, 'mlsimport_attach_to_move_' . $post_id, '' );
     
    25422536            $how_many = 10000;
    25432537        }
    2544         //error_log('updating  for '.$prop_id.' with'. $how_many);
    25452538        update_post_meta($prop_id,'mlsimport_task_to_import', intval($how_many) );
    25462539
     
    25992592
    26002593        $total_batches = count( $attachments_to_move );
    2601                
    2602         //error_log('$total_batches '. json_encode($total_batches) );
    2603                
    2604                
    26052594
    26062595        // removed because $this
     
    26312620                mlsimport_saas_single_write_import_custom_logs( $log );
    26322621                $log = 'Parsing import batch: ' . ( $key + 1 ) . ' of ' . $total_batches . '. Memory used: ' . $mem_usage_show . ' MB.' . PHP_EOL;
    2633                                 //error_log($log);
    26342622               
    26352623
     
    26692657                    //new stats
    26702658                    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 );
    26722660               
    26732661
  • mlsimport/tags/6.1.2/enviroment/EstateClass.php

    r3357653 r3366929  
    4646     * @var      string    $plugin_name
    4747     */
    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        }
    51142
    52143    /**
    53144     * Deal with extra meta
    54145     */
    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        }
    101194
    102195    public function mlsimport_saas_set_extra_meta_features( $property_id, $property, $answer ) {
  • mlsimport/tags/6.1.2/enviroment/HouzezClass.php

    r3357653 r3366929  
    5050     */
    5151    public function enviroment_image_save( $property_id, $attach_id ) {
    52         ////error_log(' for '.$property_id.' adding '.$attach_id);
    5352        add_post_meta( $property_id, 'fave_property_images', intval( $attach_id ) );
    5453    }
     
    6160     * @var      string    $plugin_name
    6261     */
    63     public function enviroment_image_save_gallery( $property_id, $post_attachments ) {
     62            public function enviroment_image_save_gallery( $property_id, $post_attachments ) {
    6463      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 ) {
    69160        return get_post_meta( $property_id, 'additional_features', true );
    70161    }
     
    74165     * Deal with extra meta
    75166        */
    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;
    145236                                                wp_set_object_terms( $property_id, $meta_value_with_label, $new_taxonomy, true );
    146237                                                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        }
    210301
    211302    /**
  • mlsimport/tags/6.1.2/enviroment/RealHomesClass.php

    r3357653 r3366929  
    6262     * @var      string    $plugin_name
    6363     */
    64     public function enviroment_image_save_gallery( $property_id, $post_attachments ) {
     64        public function enviroment_image_save_gallery( $property_id, $post_attachments ) {
    6565      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        }
    67158
    68159    /**
    69160     * Deal with extra meta
    70161     */
    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 {
    134215                                        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 ] )
    137219                                        ) {
    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 );
    143240                                                }
    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 );
    154241                                        }
    155242                                }
    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
    163248                        usort(
    164249                                $extra_fields,
     
    169254                                }
    170255                        );
    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        }
    186270
    187271
  • mlsimport/tags/6.1.2/enviroment/ResidenceClass.php

    r3357653 r3366929  
    7272
    7373
    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) {
    83182        // Memory tracking
    84183        $startMemory = memory_get_usage(true);
    85184        $startMemoryFormatted = round($startMemory / 1048576, 2);
    86         //error_log("[Memory-ExtraMeta] Starting extra meta processing with memory: {$startMemoryFormatted} MB");
    87185
    88186        $property_history = array();
     
    91189        if (!isset($property['extra_meta']) || !is_array($property['extra_meta'])) {
    92190            $answer['property_history'] = '';
    93            
     191
    94192            $endMemory = memory_get_usage(true);
    95193            $endMemoryFormatted = round($endMemory / 1048576, 2);
    96194            $memoryDiff = $endMemoryFormatted - $startMemoryFormatted;
    97             //error_log("[Memory-ExtraMeta] No extra meta, finished with memory: {$endMemoryFormatted} MB (change: +{$memoryDiff} MB)");
    98            
     195
    99196            return $answer;
    100197        }
     
    110207        foreach ($meta_batches as $meta_batch_keys) {
    111208            $batch_count++;
    112            
     209
    113210            $batchMemory = memory_get_usage(true);
    114211            $batchMemoryFormatted = round($batchMemory / 1048576, 2);
    115             //error_log("[Memory-ExtraMeta] Processing batch {$batch_count} with memory: {$batchMemoryFormatted} MB");
    116212           
    117213            foreach ($meta_batch_keys as $meta_name) {
     
    120216                    continue;
    121217                }
    122                
     218
    123219                $meta_value = $property['extra_meta'][$meta_name];
    124                
     220
    125221                // Check if extra meta is set to import
    126222                if (!isset($permited_meta[$meta_name])) {
     
    131227                    continue;
    132228                }
    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
    134241                $original_meta_name = $meta_name;
    135242                $meta_name_lower = strtolower($meta_name);
     
    139246                    $new_post_meta_key = $options['mls-fields-map-postmeta'][$original_meta_name];
    140247
    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);
    148249                    $property_history[] = 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name;
    149                 } 
     250                }
    150251                // Process custom taxonomy mapping
    151252                else if (isset($options['mls-fields-map-taxonomy'][$original_meta_name]) && $options['mls-fields-map-taxonomy'][$original_meta_name] !== '') {
     
    157258                    }
    158259
    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;
    163264                    }
    164265
    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 errors
    170266                    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
    171270                        $term_ids = array();
    172271                        foreach ($meta_value_with_label as $term_name) {
     
    176275                            }
    177276                        }
    178                        
     277
    179278                        if (!empty($term_ids)) {
    180279                            clean_term_cache($term_ids, $new_taxonomy);
    181280                        }
    182281                    }
    183                    
     282
    184283                    $property_history[] = 'Updated CUSTOM TAX: ' . $new_taxonomy . ' original ' . $original_meta_name;
    185                 } 
     284                }
    186285                // Standard meta update
    187286                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);
    195288                    $property_history[] = 'Updated EXTRA Meta ' . $meta_name_lower;
    196289                }
    197                
     290
    198291                // Clear each variable after use
    199292                $meta_value = null;
     293                $normalized_meta_value = null;
    200294            }
    201295           
     
    207301            $afterBatchMemoryFormatted = round($afterBatchMemory / 1048576, 2);
    208302            $batchMemoryDiff = $afterBatchMemoryFormatted - $batchMemoryFormatted;
    209             //error_log("[Memory-ExtraMeta] Finished batch {$batch_count} with memory: {$afterBatchMemoryFormatted} MB (change: +{$batchMemoryDiff} MB)");
    210303        }
    211304       
     
    218311            $property_history[] = '... [truncated history to save memory] ...';
    219312        }
    220        
     313
    221314        $answer['property_history'] = implode('</br>', $property_history);
    222315       
     
    230323        $endMemoryFormatted = round($endMemory / 1048576, 2);
    231324        $memoryDiff = $endMemoryFormatted - $startMemoryFormatted;
    232         //error_log("[Memory-ExtraMeta] Finished extra meta processing with memory: {$endMemoryFormatted} MB (change: +{$memoryDiff} MB)");
    233325       
    234326        return $answer;
  • mlsimport/tags/6.1.2/includes/ThemeImport.php

    r3357653 r3366929  
    200200           
    201201            if (!$refresh_result) {
    202                 //error_log('MLSImport: Failed to refresh expired token');
    203202                return false;
    204203            }
     
    217216       
    218217        if (empty($username) || empty($password)) {
    219             //error_log('MLSImport: Missing credentials for token refresh');
    220218            return false;
    221219        }
     
    241239       
    242240        if (is_wp_error($response)) {
    243             //error_log('MLSImport: Token refresh request failed: ' . $response->get_error_message());
    244241            return false;
    245242        }
     
    249246       
    250247        if (!isset($data['success']) || !$data['success'] || !isset($data['token']) || !isset($data['expires'])) {
    251             //error_log('MLSImport: Invalid token refresh response');
    252248            return false;
    253249        }
     
    261257        update_option('mlsimport_token_expiry', intval($data['expires']));
    262258       
    263         //error_log('MLSImport: Token successfully refreshed. Expires: ' . date('Y-m-d H:i:s', $data['expires']));
    264259       
    265260        return true;
     
    268263
    269264/**
    270  * Parse Result Array with //error_log memory tracking and enhanced memory management
    271265 *
    272266 * @param array $readyToParseArray The array ready to be parsed.
     
    281275    // Log initial memory usage
    282276    $initialMemory = memory_get_usage(true);
    283     //error_log("MLS Import - START batch {$batchKey} - Memory: " . round($initialMemory / 1048576, 2) . " MB");
    284277   
    285278    $counterProp = 0;
     
    289282        // Log total items to process
    290283        $totalItems = count($readyToParseArray['data']);
    291         //error_log("MLS Import - Processing {$totalItems} properties in batch {$batchKey}");
    292284       
    293285   
     
    316308
    317309        $current_prop_value = (int) get_post_meta( $mlsimportItemId, 'mlsimport_progress_properties', true );
    318         //error_log('for itemID '.$mlsimportItemId.' count1 -> before bathich '.$current_prop_value);
    319310
    320311       
     
    328319           
    329320            $listingKey = isset($property['ListingKey']) ? $property['ListingKey'] : 'unknown';
    330             //error_log("MLS Import - Before property {$counterProp}/{$totalItems} (ListingKey: {$listingKey}) - Memory: {$memoryBeforeMB} MB");
    331321           
    332322            // Clear out database caches that might be polluted
     
    341331                $current_prop_value = $current_prop_value + 1;
    342332                update_post_meta( $mlsimportItemId, 'mlsimport_progress_properties', $current_prop_value );
    343                 //error_log(' count2 -> after updateing '.$current_prop_value);
    344333
    345334
     
    353342                $memoryDiff = round(($memoryAfter - $memoryBefore) / 1048576, 2);
    354343               
    355                 //error_log("MLS Import - After property {$counterProp}/{$totalItems} - Memory: {$memoryAfterMB} MB, Diff: {$memoryDiff} MB");
    356344               
    357345                // Check for memory leak pattern
    358346                if ($memoryDiff > 10) {
    359                     //error_log("MLS Import - WARNING: Significant memory increase of {$memoryDiff} MB after property {$counterProp}");
    360347                    // Force cleanup on large increases
    361348                    $this->cleanUpMemory(true);
     
    378365                    $memoryAfterCleanup = memory_get_usage(true);
    379366                    $freedMemory = round(($memoryAfter - $memoryAfterCleanup) / 1048576, 2);
    380                     //error_log("MLS Import - After cleanup: {$freedMemory} MB freed, Current: " . round($memoryAfterCleanup / 1048576, 2) . " MB");
    381367                }
    382368            } else {
    383                 //error_log("MLS Import - Import stopped by user command at property {$counterProp}");
    384369                update_post_meta($itemIdArray['item_id'], 'mlsimport_spawn_status', 'completed');
    385370                break;
     
    390375        }
    391376    } else {
    392         //error_log("MLS Import - No valid data in batch {$batchKey}");
    393377    }
    394378   
     
    403387    $peakMemory = round(memory_get_peak_usage(true) / 1048576, 2);
    404388   
    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");
    407389}
    408390
     
    603585                    wp_delete_object_term_relationships($propertyId, $taxonomy);
    604586                } else {
    605                 //  //error_log("Taxonomy does not exist: {$taxonomy}");
    606587                }
    607588            }
     
    836817
    837818        $mediaHistory = [];
    838         //error_log("MLSImport: Starting image processing for property ID: $propertyId");
    839819
    840820        if ($isInsert === 'no') {
    841821            $mediaHistory[] = 'Media - We have edit - images are not replaced';
    842             //error_log("MLSImport: Edit mode detected, images not replaced.");
    843822            return $media_attachments;
    844823            //return implode('</br>', $mediaHistory);
     
    858837            foreach ($media as $key=>$image) {
    859838                if (isset($image['MediaCategory']) && $image['MediaCategory'] !== 'Property Photo' && $image['MediaCategory'] !== 'Photo') {
    860                     //error_log("MLSImport: Skipping non-photo media category: " . $image['MediaCategory']);
    861839                    continue;
    862840                }
    863841
    864842                if ( empty( $image['MediaURL'] ) ) {
    865                     //error_log('empty mediaURL');
    866843                    continue;
    867844                }
     
    882859   
    883860                    $attachId = wp_insert_attachment($attachment, $file);
    884                     //error_log("Processing: " . $file . " - Result: " . (is_wp_error($attachId) ? $attachId->get_error_message() : $attachId));
    885861                    if (is_wp_error($attachId)) {
    886                         //error_log("MLSImport: Failed to insert attachment for $file. Error: " . $attachId->get_error_message());
    887862                    } else {
    888                         //error_log("MLSImport: Inserted attachment ID $attachId for file $file");
    889863                        $mediaHistory[] = 'Media - Added ' . $file . ' as attachment ' . $attachId;
    890864                        $media_attachments[]=$attachId;
     
    897871                       
    898872               
    899                         //error_log("BEFORE set_post_thumbnail: hasFeatured=false, setting featuredImageKey=$featuredImageKey as $key featured for propertyId=$propertyId");
    900873                        set_post_thumbnail($propertyId, $attachId);
    901874                       
    902                         //  error_log("AFTER set_post_thumbnail: hasFeatured=true, attachId=$attachId should now be featured");
    903875                        } else {
    904                         //  error_log("SKIPPING featured image: hasFeatured=true, attachId=$attachId");
    905876                        }
    906877                    }
    907878                } else {
    908                     //error_log("MLSImport: Media item missing 'MediaURL', skipping.");
    909879                }
    910880            }
    911881        } else {
    912882            $mediaHistory[] = 'Media data is blank - there are no images';
    913             //error_log("MLSImport: Media array is not valid or empty.");
    914883        }
    915884
     
    11871156    $memStart = memory_get_usage(true);
    11881157    $memStartMB = round($memStart / 1048576, 2);
    1189     //error_log("PROPERTY IMPORT START - ListingKey: " . ($property['ListingKey'] ?? 'unknown') . " - Memory: {$memStartMB} MB");
    11901158
    11911159    $mlsImportItemStatus        = $mlsimportItemOptionData['mlsimport_item_standardstatus'];
     
    12111179    // Memory before property ID lookup
    12121180    $memBeforeRetrieve = memory_get_usage(true);
    1213     //error_log("PROPERTY IMPORT - Before property ID lookup - Memory: " . round($memBeforeRetrieve / 1048576, 2) . " MB");
    12141181   
    12151182    $propertyId         = intval($this->mlsimportSaasRetrievePropertyById($ListingKey, $listingPostType));
     
    12171184    // Memory after property ID lookup
    12181185    $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");
    12201186   
    12211187    $status             = isset($property['StandardStatus']) ? strtolower($property['StandardStatus']) : strtolower($property['extra_meta']['MlsStatus']);
     
    12341200    // Memory before insert/update
    12351201    $memBeforeInsert = memory_get_usage(true);
    1236     //error_log("PROPERTY IMPORT - Before " . ($isInsert === 'yes' ? "insert" : "update/check") . " - Memory: " . round($memBeforeInsert / 1048576, 2) . " MB");
    12371202
    12381203    if ($isInsert === 'yes') {
     
    12481213        if (is_wp_error($propertyId)) {
    12491214            $this->writeImportLogs('ERROR: on inserting ' . PHP_EOL, $tipImport);
    1250             //error_log("PROPERTY IMPORT ERROR - Failed to insert property: " . $propertyId->get_error_message());
    12511215        } else {
    12521216            update_post_meta($propertyId, 'ListingKey', $ListingKey);
     
    12621226        // Memory before checking existing property
    12631227        $memBeforeCheck = memory_get_usage(true);
    1264         //error_log("PROPERTY IMPORT - Before checking existing property - Memory: " . round($memBeforeCheck / 1048576, 2) . " MB");
    12651228
    12661229        $keep = $this->check_if_delete_when_status($propertyId,$mlsImportItemStatus,$mlsImportItemStatusDelete);
     
    12721235            // Memory before delete
    12731236            $memBeforeDelete = memory_get_usage(true);
    1274             //error_log("PROPERTY IMPORT - Before deleting property - Memory: " . round($memBeforeDelete / 1048576, 2) . " MB");
    12751237           
    12761238            $this->deleteProperty($propertyId, $ListingKey);
     
    12781240            // Memory after delete
    12791241            $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");
    12811242           
    12821243            $this->writeImportLogs($log, $tipImport);
     
    12861247            // Memory before updating
    12871248            $memBeforeUpdate = memory_get_usage(true);
    1288             //error_log("PROPERTY IMPORT - Before updating existing property - Memory: " . round($memBeforeUpdate / 1048576, 2) . " MB");
    12891249           
    12901250            $propertyHistory = $this->updateExistingProperty($propertyId,$mlsImportItemStatusDelete, $content, $listingPostType, $newAuthor, $status, $mlsImportItemStatus, $propertyHistory, $tipImport, $ListingKey);
     
    12921252            // Memory after updating
    12931253            $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");
    12951254        }
    12961255    }
     
    12981257    // Memory after insert/update
    12991258    $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");
    13011259
    13021260    if ($propertyId === 0) {
     
    13071265    // Memory before processing details
    13081266    $memBeforeDetails = memory_get_usage(true);
    1309     //error_log("PROPERTY IMPORT - Before processing property details - Memory: " . round($memBeforeDetails / 1048576, 2) . " MB");
    13101267
    13111268    $newTitle = $this->processPropertyDetails($property, $propertyId, $tipImport, $propertyHistory, $newAgent, $itemIdArray,$isInsert);
     
    13131270    // Memory after processing details
    13141271    $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");
    13161272
    13171273    $log = PHP_EOL . 'Ending on Property ' . $propertyId . ', ListingKey: ' . $ListingKey . ' , is insert? ' . $isInsert . ' with new title: ' . $newTitle . '  ' . PHP_EOL;
     
    13831339    $memEndMB = round($memEnd / 1048576, 2);
    13841340    $memDiff = round(($memEnd - $memStart) / 1048576, 2);
    1385     //error_log("PROPERTY IMPORT COMPLETE - ListingKey: {$ListingKey} - Final Memory: {$memEndMB} MB, Total Change: {$memDiff} MB");
    13861341   
    13871342    // If we see a significant memory increase, log a warning
    13881343    if ($memDiff > 5) {
    1389         //error_log("WARNING: Significant memory increase of {$memDiff} MB after processing property {$ListingKey}");
    13901344    }
    13911345   
     
    14201374        );
    14211375
     1376
    14221377        if ($propertyId !== 0 || !is_array($mlsImportItemStatus)) {
    1423             //error_log('mlsImportItemStatus 0 ');
    14241378            return 'no';
    14251379           
     
    14391393        if(is_array($mlsImportItemStatus)){
    14401394            if (!in_array(strtolower($status), $mlsImportItemStatus, true)) {
    1441                 //error_log('mlsImportItemStatus 1 ');
    14421395                return 'no';
    14431396            }
    14441397   
    14451398            if ($tipImport === 'cron' && !in_array($status, $mlsImportItemStatus, true)) {
    1446                 //error_log('mlsImportItemStatus 2');
    14471399                return 'no';
    14481400            }
     
    14501402        }else{
    14511403            if(!in_array($status, $activeStatuses, true) ){
    1452                 //error_log('mlsImportItemStatus 3 ');
    14531404                return 'no';
    14541405            }
     
    14921443    }
    14931444
    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));
    14961445
    14971446    // Keep if status matches "keep" status
     
    16651614    // Initial memory
    16661615    $memStart = memory_get_usage(true);
    1667     //error_log("PROPERTY DETAILS START - Property ID: {$propertyId} - Initial Memory: " . round($memStart / 1048576, 2) . " MB");
    16681616   
    16691617    $log = PHP_EOL . $this->mlsimportMemUsage() . '====before tax======' . PHP_EOL;
     
    16731621    if (isset($property['taxonomies']) && is_array($property['taxonomies'])) {
    16741622        $memBeforeTax = memory_get_usage(true);
    1675         //error_log("PROPERTY DETAILS - Before taxonomy processing - Memory: " . round($memBeforeTax / 1048576, 2) . " MB");
    16761623
    16771624        // Load taxonomy mapping options
     
    17311678       
    17321679        $memAfterTax = memory_get_usage(true);
    1733         //error_log("PROPERTY DETAILS - After all taxonomy processing - Memory: " . round($memAfterTax / 1048576, 2) .
    17341680              //   " MB, Total Diff: " . round(($memAfterTax - $memBeforeTax) / 1048576, 2) . " MB");
    17351681    }
     
    17981744       
    17991745        $memAfterMeta = memory_get_usage(true);
    1800         //error_log("PROPERTY DETAILS - After meta processing - Memory: " . round($memAfterMeta / 1048576, 2) .
    18011746            //     " MB, Diff: " . round(($memAfterMeta - $memBeforeMeta) / 1048576, 2) . " MB");
    18021747    }
     
    18161761
    18171762        $mediaCount = count($property['Media']);
    1818         //error_log("PROPERTY DETAILS - Processing {$mediaCount} media items");
    18191763       
    18201764
     
    18241768            $order = array_column($property['Media'], 'Order');
    18251769            array_multisort($order, SORT_ASC, $property['Media']);
    1826             //error_log("MLSImport: Media sorted by 'Order'");
    18271770        }
    18281771
     
    18491792            if (isset($mediaItem['PreferredPhotoYN']) && $mediaItem['PreferredPhotoYN'] == 1) {
    18501793                $featuredImageKey = $key;
    1851                 //error_log("MLSImport: Featured image set from PreferredPhotoYN");
    18521794                break;
    18531795            }
     
    18631805        if ($featuredImageKey === null && $orderOneKey !== null) {
    18641806            $featuredImageKey = $orderOneKey;
    1865             //error_log("MLSImport: Featured image set from Order = 1");
    18661807        }
    18671808
     
    18691810        if ($featuredImageKey === null && $orderOneKey !== null) {
    18701811            $featuredImageKey = $orderOneKey;
    1871             //error_log("MLSImport: Featured image set from Order = 1");
    18721812        }
    18731813
     
    18751815        if ($featuredImageKey === null && !empty($property['Media'])) {
    18761816            $featuredImageKey = 0;
    1877             //error_log("MLSImport: Featured image set as first image in array");
    18781817        }
    18791818
     
    18851824            delete_post_meta($propertyId, 'REAL_HOMES_property_images');
    18861825            delete_post_meta($propertyId, 'wpestate_property_gallery');
    1887             //error_log("MLSImport: Deleted existing image meta for property ID: $propertyId");
    18881826        }
    18891827
     
    18991837           
    19001838            // Incremental progress report
    1901             //error_log("PROPERTY DETAILS - Processed media chunk " . ($index + 1) . "/" . count($mediaChunks));
    19021839        }
    19031840       
     
    19211858
    19221859    $memAfterMedia = memory_get_usage(true);
    1923     //error_log("PROPERTY DETAILS - After media processing - Memory: " . round($memAfterMedia / 1048576, 2) .
    19241860           //  " MB, Diff: " . round(($memAfterMedia - $memBeforeMedia) / 1048576, 2) . " MB");
    19251861   
     
    19741910    // Final memory stats
    19751911    $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");
    19791912   
    19801913    return $newTitle;
  • mlsimport/tags/6.1.2/mlsimport.php

    r3357685 r3366929  
    44 * Plugin URI:        https://mlsimport.com/
    55 * 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.1
     6 * Version:           6.1.2
    77 * Requires at least: 5.2
    88 * Requires PHP:      7.4
  • mlsimport/tags/6.1.2/readme.txt

    r3357685 r3366929  
    55Tested up to: 6.7.1
    66Requires PHP: 7.4
    7 Stable Tag: 6.1.1
     7Stable Tag: 6.1.2
    88License: GPLv3
    99License URI: https://www.gnu.org/licenses/gpl-3.0.html
     
    8484
    8585== Changelog ==
     86= 6.1.2 =
     87Fix for Realtor.ca on property room parsing
    8688
    8789= 6.1.1 =
  • mlsimport/trunk/README.MD

    r3357685 r3366929  
    55Tested up to: 6.7.1
    66Requires PHP: 7.4
    7 Stable Tag: 6.1.1
     7Stable Tag: 6.1.2
    88License: GPLv3
    99License URI: https://www.gnu.org/licenses/gpl-3.0.html
     
    8484
    8585== Changelog ==
     86= 6.1.2 =
     87Fix for Realtor.ca on property room parsing
    8688
    8789= 6.1.1 =
  • mlsimport/trunk/admin/class-mlsimport-admin.php

    r3357653 r3366929  
    10421042
    10431043            delete_option( 'mlsimport_mls_metadata_populated' );
    1044             //error_log('deleting '.$prev_mls.' - '.$mls_name);
    10451044
    10461045            delete_option( 'mlsimport_admin_fields_select' );
     
    11831182     * @param WP_Post $post The post object.
    11841183     */
    1185     public function mlsimport_saas_display_meta_options($post) {
     1184        public function mlsimport_saas_display_meta_options($post) {
    11861185                wp_nonce_field(plugin_basename(__FILE__), 'estate_agent_noncename');
    11871186                global $mlsimport;
     
    12501249     */
    12511250       private function generateMetaOptionsHtml($postId, $foundItems, $lastDate, $mlsimportItemHowMany, $mlsimportItemStatCron, $mlsimportMlsId, $fieldImport, $hasError = false) {
     1251
    12521252
    12531253        ob_start();
     
    15881588       public function mlsimport_saas_start_cron_links_per_item( $item_id ) {
    15891589           // Log memory before start
    1590            //error_log("[MLSimport] Start $item_id, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");
    15911590
    15921591           $last_date = $this->mlsimport_saas_get_last_date( $item_id );
     
    15971596           // Make request to MLS API
    15981597           $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");
    16001598
    16011599           $found_items = 0;
     
    16191617               // Potentially large array, log memory before/after
    16201618               $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");
    16221619
    16231620               // Store in post meta (beware if array is huge)
     
    16411638               unset($attachments_to_move, $attachments_to_send, $mlsrequest, $item_id_array);
    16421639               gc_collect_cycles();
    1643                //error_log("[MLSimport] End processing $item_id, memory: " . (memory_get_usage(true) / 1024 / 1024) . " MB");
    16441640           }
    16451641       }
     
    23972393        );
    23982394
    2399         //error_log(json_encode($item_id_array));
    2400         //error_log("starting post id ".$post_id);
    24012395
    24022396                update_post_meta( $post_id, 'mlsimport_attach_to_move_' . $post_id, '' );
     
    25422536            $how_many = 10000;
    25432537        }
    2544         //error_log('updating  for '.$prop_id.' with'. $how_many);
    25452538        update_post_meta($prop_id,'mlsimport_task_to_import', intval($how_many) );
    25462539
     
    25992592
    26002593        $total_batches = count( $attachments_to_move );
    2601                
    2602         //error_log('$total_batches '. json_encode($total_batches) );
    2603                
    2604                
    26052594
    26062595        // removed because $this
     
    26312620                mlsimport_saas_single_write_import_custom_logs( $log );
    26322621                $log = 'Parsing import batch: ' . ( $key + 1 ) . ' of ' . $total_batches . '. Memory used: ' . $mem_usage_show . ' MB.' . PHP_EOL;
    2633                                 //error_log($log);
    26342622               
    26352623
     
    26692657                    //new stats
    26702658                    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 );
    26722660               
    26732661
  • mlsimport/trunk/enviroment/EstateClass.php

    r3357653 r3366929  
    4646     * @var      string    $plugin_name
    4747     */
    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        }
    51142
    52143    /**
    53144     * Deal with extra meta
    54145     */
    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        }
    101194
    102195    public function mlsimport_saas_set_extra_meta_features( $property_id, $property, $answer ) {
  • mlsimport/trunk/enviroment/HouzezClass.php

    r3357653 r3366929  
    5050     */
    5151    public function enviroment_image_save( $property_id, $attach_id ) {
    52         ////error_log(' for '.$property_id.' adding '.$attach_id);
    5352        add_post_meta( $property_id, 'fave_property_images', intval( $attach_id ) );
    5453    }
     
    6160     * @var      string    $plugin_name
    6261     */
    63     public function enviroment_image_save_gallery( $property_id, $post_attachments ) {
     62            public function enviroment_image_save_gallery( $property_id, $post_attachments ) {
    6463      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 ) {
    69160        return get_post_meta( $property_id, 'additional_features', true );
    70161    }
     
    74165     * Deal with extra meta
    75166        */
    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;
    145236                                                wp_set_object_terms( $property_id, $meta_value_with_label, $new_taxonomy, true );
    146237                                                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        }
    210301
    211302    /**
  • mlsimport/trunk/enviroment/RealHomesClass.php

    r3357653 r3366929  
    6262     * @var      string    $plugin_name
    6363     */
    64     public function enviroment_image_save_gallery( $property_id, $post_attachments ) {
     64        public function enviroment_image_save_gallery( $property_id, $post_attachments ) {
    6565      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        }
    67158
    68159    /**
    69160     * Deal with extra meta
    70161     */
    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 {
    134215                                        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 ] )
    137219                                        ) {
    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 );
    143240                                                }
    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 );
    154241                                        }
    155242                                }
    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
    163248                        usort(
    164249                                $extra_fields,
     
    169254                                }
    170255                        );
    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        }
    186270
    187271
  • mlsimport/trunk/enviroment/ResidenceClass.php

    r3357653 r3366929  
    7272
    7373
    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) {
    83182        // Memory tracking
    84183        $startMemory = memory_get_usage(true);
    85184        $startMemoryFormatted = round($startMemory / 1048576, 2);
    86         //error_log("[Memory-ExtraMeta] Starting extra meta processing with memory: {$startMemoryFormatted} MB");
    87185
    88186        $property_history = array();
     
    91189        if (!isset($property['extra_meta']) || !is_array($property['extra_meta'])) {
    92190            $answer['property_history'] = '';
    93            
     191
    94192            $endMemory = memory_get_usage(true);
    95193            $endMemoryFormatted = round($endMemory / 1048576, 2);
    96194            $memoryDiff = $endMemoryFormatted - $startMemoryFormatted;
    97             //error_log("[Memory-ExtraMeta] No extra meta, finished with memory: {$endMemoryFormatted} MB (change: +{$memoryDiff} MB)");
    98            
     195
    99196            return $answer;
    100197        }
     
    110207        foreach ($meta_batches as $meta_batch_keys) {
    111208            $batch_count++;
    112            
     209
    113210            $batchMemory = memory_get_usage(true);
    114211            $batchMemoryFormatted = round($batchMemory / 1048576, 2);
    115             //error_log("[Memory-ExtraMeta] Processing batch {$batch_count} with memory: {$batchMemoryFormatted} MB");
    116212           
    117213            foreach ($meta_batch_keys as $meta_name) {
     
    120216                    continue;
    121217                }
    122                
     218
    123219                $meta_value = $property['extra_meta'][$meta_name];
    124                
     220
    125221                // Check if extra meta is set to import
    126222                if (!isset($permited_meta[$meta_name])) {
     
    131227                    continue;
    132228                }
    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
    134241                $original_meta_name = $meta_name;
    135242                $meta_name_lower = strtolower($meta_name);
     
    139246                    $new_post_meta_key = $options['mls-fields-map-postmeta'][$original_meta_name];
    140247
    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);
    148249                    $property_history[] = 'Updated CUSTOM post meta ' . $new_post_meta_key . ' original ' . $meta_name;
    149                 } 
     250                }
    150251                // Process custom taxonomy mapping
    151252                else if (isset($options['mls-fields-map-taxonomy'][$original_meta_name]) && $options['mls-fields-map-taxonomy'][$original_meta_name] !== '') {
     
    157258                    }
    158259
    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;
    163264                    }
    164265
    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 errors
    170266                    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
    171270                        $term_ids = array();
    172271                        foreach ($meta_value_with_label as $term_name) {
     
    176275                            }
    177276                        }
    178                        
     277
    179278                        if (!empty($term_ids)) {
    180279                            clean_term_cache($term_ids, $new_taxonomy);
    181280                        }
    182281                    }
    183                    
     282
    184283                    $property_history[] = 'Updated CUSTOM TAX: ' . $new_taxonomy . ' original ' . $original_meta_name;
    185                 } 
     284                }
    186285                // Standard meta update
    187286                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);
    195288                    $property_history[] = 'Updated EXTRA Meta ' . $meta_name_lower;
    196289                }
    197                
     290
    198291                // Clear each variable after use
    199292                $meta_value = null;
     293                $normalized_meta_value = null;
    200294            }
    201295           
     
    207301            $afterBatchMemoryFormatted = round($afterBatchMemory / 1048576, 2);
    208302            $batchMemoryDiff = $afterBatchMemoryFormatted - $batchMemoryFormatted;
    209             //error_log("[Memory-ExtraMeta] Finished batch {$batch_count} with memory: {$afterBatchMemoryFormatted} MB (change: +{$batchMemoryDiff} MB)");
    210303        }
    211304       
     
    218311            $property_history[] = '... [truncated history to save memory] ...';
    219312        }
    220        
     313
    221314        $answer['property_history'] = implode('</br>', $property_history);
    222315       
     
    230323        $endMemoryFormatted = round($endMemory / 1048576, 2);
    231324        $memoryDiff = $endMemoryFormatted - $startMemoryFormatted;
    232         //error_log("[Memory-ExtraMeta] Finished extra meta processing with memory: {$endMemoryFormatted} MB (change: +{$memoryDiff} MB)");
    233325       
    234326        return $answer;
  • mlsimport/trunk/includes/ThemeImport.php

    r3357653 r3366929  
    200200           
    201201            if (!$refresh_result) {
    202                 //error_log('MLSImport: Failed to refresh expired token');
    203202                return false;
    204203            }
     
    217216       
    218217        if (empty($username) || empty($password)) {
    219             //error_log('MLSImport: Missing credentials for token refresh');
    220218            return false;
    221219        }
     
    241239       
    242240        if (is_wp_error($response)) {
    243             //error_log('MLSImport: Token refresh request failed: ' . $response->get_error_message());
    244241            return false;
    245242        }
     
    249246       
    250247        if (!isset($data['success']) || !$data['success'] || !isset($data['token']) || !isset($data['expires'])) {
    251             //error_log('MLSImport: Invalid token refresh response');
    252248            return false;
    253249        }
     
    261257        update_option('mlsimport_token_expiry', intval($data['expires']));
    262258       
    263         //error_log('MLSImport: Token successfully refreshed. Expires: ' . date('Y-m-d H:i:s', $data['expires']));
    264259       
    265260        return true;
     
    268263
    269264/**
    270  * Parse Result Array with //error_log memory tracking and enhanced memory management
    271265 *
    272266 * @param array $readyToParseArray The array ready to be parsed.
     
    281275    // Log initial memory usage
    282276    $initialMemory = memory_get_usage(true);
    283     //error_log("MLS Import - START batch {$batchKey} - Memory: " . round($initialMemory / 1048576, 2) . " MB");
    284277   
    285278    $counterProp = 0;
     
    289282        // Log total items to process
    290283        $totalItems = count($readyToParseArray['data']);
    291         //error_log("MLS Import - Processing {$totalItems} properties in batch {$batchKey}");
    292284       
    293285   
     
    316308
    317309        $current_prop_value = (int) get_post_meta( $mlsimportItemId, 'mlsimport_progress_properties', true );
    318         //error_log('for itemID '.$mlsimportItemId.' count1 -> before bathich '.$current_prop_value);
    319310
    320311       
     
    328319           
    329320            $listingKey = isset($property['ListingKey']) ? $property['ListingKey'] : 'unknown';
    330             //error_log("MLS Import - Before property {$counterProp}/{$totalItems} (ListingKey: {$listingKey}) - Memory: {$memoryBeforeMB} MB");
    331321           
    332322            // Clear out database caches that might be polluted
     
    341331                $current_prop_value = $current_prop_value + 1;
    342332                update_post_meta( $mlsimportItemId, 'mlsimport_progress_properties', $current_prop_value );
    343                 //error_log(' count2 -> after updateing '.$current_prop_value);
    344333
    345334
     
    353342                $memoryDiff = round(($memoryAfter - $memoryBefore) / 1048576, 2);
    354343               
    355                 //error_log("MLS Import - After property {$counterProp}/{$totalItems} - Memory: {$memoryAfterMB} MB, Diff: {$memoryDiff} MB");
    356344               
    357345                // Check for memory leak pattern
    358346                if ($memoryDiff > 10) {
    359                     //error_log("MLS Import - WARNING: Significant memory increase of {$memoryDiff} MB after property {$counterProp}");
    360347                    // Force cleanup on large increases
    361348                    $this->cleanUpMemory(true);
     
    378365                    $memoryAfterCleanup = memory_get_usage(true);
    379366                    $freedMemory = round(($memoryAfter - $memoryAfterCleanup) / 1048576, 2);
    380                     //error_log("MLS Import - After cleanup: {$freedMemory} MB freed, Current: " . round($memoryAfterCleanup / 1048576, 2) . " MB");
    381367                }
    382368            } else {
    383                 //error_log("MLS Import - Import stopped by user command at property {$counterProp}");
    384369                update_post_meta($itemIdArray['item_id'], 'mlsimport_spawn_status', 'completed');
    385370                break;
     
    390375        }
    391376    } else {
    392         //error_log("MLS Import - No valid data in batch {$batchKey}");
    393377    }
    394378   
     
    403387    $peakMemory = round(memory_get_peak_usage(true) / 1048576, 2);
    404388   
    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");
    407389}
    408390
     
    603585                    wp_delete_object_term_relationships($propertyId, $taxonomy);
    604586                } else {
    605                 //  //error_log("Taxonomy does not exist: {$taxonomy}");
    606587                }
    607588            }
     
    836817
    837818        $mediaHistory = [];
    838         //error_log("MLSImport: Starting image processing for property ID: $propertyId");
    839819
    840820        if ($isInsert === 'no') {
    841821            $mediaHistory[] = 'Media - We have edit - images are not replaced';
    842             //error_log("MLSImport: Edit mode detected, images not replaced.");
    843822            return $media_attachments;
    844823            //return implode('</br>', $mediaHistory);
     
    858837            foreach ($media as $key=>$image) {
    859838                if (isset($image['MediaCategory']) && $image['MediaCategory'] !== 'Property Photo' && $image['MediaCategory'] !== 'Photo') {
    860                     //error_log("MLSImport: Skipping non-photo media category: " . $image['MediaCategory']);
    861839                    continue;
    862840                }
    863841
    864842                if ( empty( $image['MediaURL'] ) ) {
    865                     //error_log('empty mediaURL');
    866843                    continue;
    867844                }
     
    882859   
    883860                    $attachId = wp_insert_attachment($attachment, $file);
    884                     //error_log("Processing: " . $file . " - Result: " . (is_wp_error($attachId) ? $attachId->get_error_message() : $attachId));
    885861                    if (is_wp_error($attachId)) {
    886                         //error_log("MLSImport: Failed to insert attachment for $file. Error: " . $attachId->get_error_message());
    887862                    } else {
    888                         //error_log("MLSImport: Inserted attachment ID $attachId for file $file");
    889863                        $mediaHistory[] = 'Media - Added ' . $file . ' as attachment ' . $attachId;
    890864                        $media_attachments[]=$attachId;
     
    897871                       
    898872               
    899                         //error_log("BEFORE set_post_thumbnail: hasFeatured=false, setting featuredImageKey=$featuredImageKey as $key featured for propertyId=$propertyId");
    900873                        set_post_thumbnail($propertyId, $attachId);
    901874                       
    902                         //  error_log("AFTER set_post_thumbnail: hasFeatured=true, attachId=$attachId should now be featured");
    903875                        } else {
    904                         //  error_log("SKIPPING featured image: hasFeatured=true, attachId=$attachId");
    905876                        }
    906877                    }
    907878                } else {
    908                     //error_log("MLSImport: Media item missing 'MediaURL', skipping.");
    909879                }
    910880            }
    911881        } else {
    912882            $mediaHistory[] = 'Media data is blank - there are no images';
    913             //error_log("MLSImport: Media array is not valid or empty.");
    914883        }
    915884
     
    11871156    $memStart = memory_get_usage(true);
    11881157    $memStartMB = round($memStart / 1048576, 2);
    1189     //error_log("PROPERTY IMPORT START - ListingKey: " . ($property['ListingKey'] ?? 'unknown') . " - Memory: {$memStartMB} MB");
    11901158
    11911159    $mlsImportItemStatus        = $mlsimportItemOptionData['mlsimport_item_standardstatus'];
     
    12111179    // Memory before property ID lookup
    12121180    $memBeforeRetrieve = memory_get_usage(true);
    1213     //error_log("PROPERTY IMPORT - Before property ID lookup - Memory: " . round($memBeforeRetrieve / 1048576, 2) . " MB");
    12141181   
    12151182    $propertyId         = intval($this->mlsimportSaasRetrievePropertyById($ListingKey, $listingPostType));
     
    12171184    // Memory after property ID lookup
    12181185    $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");
    12201186   
    12211187    $status             = isset($property['StandardStatus']) ? strtolower($property['StandardStatus']) : strtolower($property['extra_meta']['MlsStatus']);
     
    12341200    // Memory before insert/update
    12351201    $memBeforeInsert = memory_get_usage(true);
    1236     //error_log("PROPERTY IMPORT - Before " . ($isInsert === 'yes' ? "insert" : "update/check") . " - Memory: " . round($memBeforeInsert / 1048576, 2) . " MB");
    12371202
    12381203    if ($isInsert === 'yes') {
     
    12481213        if (is_wp_error($propertyId)) {
    12491214            $this->writeImportLogs('ERROR: on inserting ' . PHP_EOL, $tipImport);
    1250             //error_log("PROPERTY IMPORT ERROR - Failed to insert property: " . $propertyId->get_error_message());
    12511215        } else {
    12521216            update_post_meta($propertyId, 'ListingKey', $ListingKey);
     
    12621226        // Memory before checking existing property
    12631227        $memBeforeCheck = memory_get_usage(true);
    1264         //error_log("PROPERTY IMPORT - Before checking existing property - Memory: " . round($memBeforeCheck / 1048576, 2) . " MB");
    12651228
    12661229        $keep = $this->check_if_delete_when_status($propertyId,$mlsImportItemStatus,$mlsImportItemStatusDelete);
     
    12721235            // Memory before delete
    12731236            $memBeforeDelete = memory_get_usage(true);
    1274             //error_log("PROPERTY IMPORT - Before deleting property - Memory: " . round($memBeforeDelete / 1048576, 2) . " MB");
    12751237           
    12761238            $this->deleteProperty($propertyId, $ListingKey);
     
    12781240            // Memory after delete
    12791241            $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");
    12811242           
    12821243            $this->writeImportLogs($log, $tipImport);
     
    12861247            // Memory before updating
    12871248            $memBeforeUpdate = memory_get_usage(true);
    1288             //error_log("PROPERTY IMPORT - Before updating existing property - Memory: " . round($memBeforeUpdate / 1048576, 2) . " MB");
    12891249           
    12901250            $propertyHistory = $this->updateExistingProperty($propertyId,$mlsImportItemStatusDelete, $content, $listingPostType, $newAuthor, $status, $mlsImportItemStatus, $propertyHistory, $tipImport, $ListingKey);
     
    12921252            // Memory after updating
    12931253            $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");
    12951254        }
    12961255    }
     
    12981257    // Memory after insert/update
    12991258    $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");
    13011259
    13021260    if ($propertyId === 0) {
     
    13071265    // Memory before processing details
    13081266    $memBeforeDetails = memory_get_usage(true);
    1309     //error_log("PROPERTY IMPORT - Before processing property details - Memory: " . round($memBeforeDetails / 1048576, 2) . " MB");
    13101267
    13111268    $newTitle = $this->processPropertyDetails($property, $propertyId, $tipImport, $propertyHistory, $newAgent, $itemIdArray,$isInsert);
     
    13131270    // Memory after processing details
    13141271    $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");
    13161272
    13171273    $log = PHP_EOL . 'Ending on Property ' . $propertyId . ', ListingKey: ' . $ListingKey . ' , is insert? ' . $isInsert . ' with new title: ' . $newTitle . '  ' . PHP_EOL;
     
    13831339    $memEndMB = round($memEnd / 1048576, 2);
    13841340    $memDiff = round(($memEnd - $memStart) / 1048576, 2);
    1385     //error_log("PROPERTY IMPORT COMPLETE - ListingKey: {$ListingKey} - Final Memory: {$memEndMB} MB, Total Change: {$memDiff} MB");
    13861341   
    13871342    // If we see a significant memory increase, log a warning
    13881343    if ($memDiff > 5) {
    1389         //error_log("WARNING: Significant memory increase of {$memDiff} MB after processing property {$ListingKey}");
    13901344    }
    13911345   
     
    14201374        );
    14211375
     1376
    14221377        if ($propertyId !== 0 || !is_array($mlsImportItemStatus)) {
    1423             //error_log('mlsImportItemStatus 0 ');
    14241378            return 'no';
    14251379           
     
    14391393        if(is_array($mlsImportItemStatus)){
    14401394            if (!in_array(strtolower($status), $mlsImportItemStatus, true)) {
    1441                 //error_log('mlsImportItemStatus 1 ');
    14421395                return 'no';
    14431396            }
    14441397   
    14451398            if ($tipImport === 'cron' && !in_array($status, $mlsImportItemStatus, true)) {
    1446                 //error_log('mlsImportItemStatus 2');
    14471399                return 'no';
    14481400            }
     
    14501402        }else{
    14511403            if(!in_array($status, $activeStatuses, true) ){
    1452                 //error_log('mlsImportItemStatus 3 ');
    14531404                return 'no';
    14541405            }
     
    14921443    }
    14931444
    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));
    14961445
    14971446    // Keep if status matches "keep" status
     
    16651614    // Initial memory
    16661615    $memStart = memory_get_usage(true);
    1667     //error_log("PROPERTY DETAILS START - Property ID: {$propertyId} - Initial Memory: " . round($memStart / 1048576, 2) . " MB");
    16681616   
    16691617    $log = PHP_EOL . $this->mlsimportMemUsage() . '====before tax======' . PHP_EOL;
     
    16731621    if (isset($property['taxonomies']) && is_array($property['taxonomies'])) {
    16741622        $memBeforeTax = memory_get_usage(true);
    1675         //error_log("PROPERTY DETAILS - Before taxonomy processing - Memory: " . round($memBeforeTax / 1048576, 2) . " MB");
    16761623
    16771624        // Load taxonomy mapping options
     
    17311678       
    17321679        $memAfterTax = memory_get_usage(true);
    1733         //error_log("PROPERTY DETAILS - After all taxonomy processing - Memory: " . round($memAfterTax / 1048576, 2) .
    17341680              //   " MB, Total Diff: " . round(($memAfterTax - $memBeforeTax) / 1048576, 2) . " MB");
    17351681    }
     
    17981744       
    17991745        $memAfterMeta = memory_get_usage(true);
    1800         //error_log("PROPERTY DETAILS - After meta processing - Memory: " . round($memAfterMeta / 1048576, 2) .
    18011746            //     " MB, Diff: " . round(($memAfterMeta - $memBeforeMeta) / 1048576, 2) . " MB");
    18021747    }
     
    18161761
    18171762        $mediaCount = count($property['Media']);
    1818         //error_log("PROPERTY DETAILS - Processing {$mediaCount} media items");
    18191763       
    18201764
     
    18241768            $order = array_column($property['Media'], 'Order');
    18251769            array_multisort($order, SORT_ASC, $property['Media']);
    1826             //error_log("MLSImport: Media sorted by 'Order'");
    18271770        }
    18281771
     
    18491792            if (isset($mediaItem['PreferredPhotoYN']) && $mediaItem['PreferredPhotoYN'] == 1) {
    18501793                $featuredImageKey = $key;
    1851                 //error_log("MLSImport: Featured image set from PreferredPhotoYN");
    18521794                break;
    18531795            }
     
    18631805        if ($featuredImageKey === null && $orderOneKey !== null) {
    18641806            $featuredImageKey = $orderOneKey;
    1865             //error_log("MLSImport: Featured image set from Order = 1");
    18661807        }
    18671808
     
    18691810        if ($featuredImageKey === null && $orderOneKey !== null) {
    18701811            $featuredImageKey = $orderOneKey;
    1871             //error_log("MLSImport: Featured image set from Order = 1");
    18721812        }
    18731813
     
    18751815        if ($featuredImageKey === null && !empty($property['Media'])) {
    18761816            $featuredImageKey = 0;
    1877             //error_log("MLSImport: Featured image set as first image in array");
    18781817        }
    18791818
     
    18851824            delete_post_meta($propertyId, 'REAL_HOMES_property_images');
    18861825            delete_post_meta($propertyId, 'wpestate_property_gallery');
    1887             //error_log("MLSImport: Deleted existing image meta for property ID: $propertyId");
    18881826        }
    18891827
     
    18991837           
    19001838            // Incremental progress report
    1901             //error_log("PROPERTY DETAILS - Processed media chunk " . ($index + 1) . "/" . count($mediaChunks));
    19021839        }
    19031840       
     
    19211858
    19221859    $memAfterMedia = memory_get_usage(true);
    1923     //error_log("PROPERTY DETAILS - After media processing - Memory: " . round($memAfterMedia / 1048576, 2) .
    19241860           //  " MB, Diff: " . round(($memAfterMedia - $memBeforeMedia) / 1048576, 2) . " MB");
    19251861   
     
    19741910    // Final memory stats
    19751911    $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");
    19791912   
    19801913    return $newTitle;
  • mlsimport/trunk/mlsimport.php

    r3357685 r3366929  
    44 * Plugin URI:        https://mlsimport.com/
    55 * 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.1
     6 * Version:           6.1.2
    77 * Requires at least: 5.2
    88 * Requires PHP:      7.4
  • mlsimport/trunk/readme.txt

    r3357685 r3366929  
    55Tested up to: 6.7.1
    66Requires PHP: 7.4
    7 Stable Tag: 6.1.1
     7Stable Tag: 6.1.2
    88License: GPLv3
    99License URI: https://www.gnu.org/licenses/gpl-3.0.html
     
    8484
    8585== Changelog ==
     86= 6.1.2 =
     87Fix for Realtor.ca on property room parsing
    8688
    8789= 6.1.1 =
Note: See TracChangeset for help on using the changeset viewer.