diff --git a/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-cluster.php b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-cluster.php index d4ba1336..96943976 100644 --- a/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-cluster.php +++ b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-cluster.php @@ -65,6 +65,33 @@ class MLS_Cluster { $this->db = $db; } + /** + * Get state filter SQL clause + * + * @return string SQL clause or empty string + */ + private function get_state_filter() { + if (!defined('MLS_ALLOWED_STATES') || empty(MLS_ALLOWED_STATES)) { + return ''; + } + + global $wpdb; + $states = array_map(function($state) use ($wpdb) { + return $wpdb->prepare('%s', $state); + }, MLS_ALLOWED_STATES); + return 'state_or_province IN (' . implode(',', $states) . ')'; + } + + /** + * Get the TBD address exclusion filter + * Excludes properties with "TBD" as street number + * + * @return string SQL clause + */ + private function get_tbd_exclusion_filter() { + return "(street_number IS NULL OR (street_number != 'TBD' AND street_number NOT LIKE 'TBD %'))"; + } + /** * Encode latitude/longitude to geohash * @@ -225,6 +252,15 @@ class MLS_Cluster { $where = array('mlg_can_view = 1', 'latitude IS NOT NULL', 'longitude IS NOT NULL'); $values = array(); + // Add state filter (MN, IA only) + $state_filter = $this->get_state_filter(); + if ($state_filter) { + $where[] = $state_filter; + } + + // Exclude TBD addresses + $where[] = $this->get_tbd_exclusion_filter(); + if ($args['status']) { $where[] = 'standard_status = %s'; $values[] = $args['status']; @@ -276,8 +312,8 @@ class MLS_Cluster { $total = (int) $wpdb->get_var($count_sql); } - // If very few properties, always show individual markers (no grouping) - if ($total < self::MIN_FOR_GROUPING) { + // If few properties, always show individual markers (no grouping) + if ($total <= self::MIN_FOR_GROUPING) { return $this->get_individual_markers($where_sql, $values, $total); } @@ -541,6 +577,15 @@ class MLS_Cluster { $where = array('mlg_can_view = 1', 'latitude IS NOT NULL', 'longitude IS NOT NULL'); $values = array(); + // Add state filter (MN, IA only) + $state_filter = $this->get_state_filter(); + if ($state_filter) { + $where[] = $state_filter; + } + + // Exclude TBD addresses + $where[] = $this->get_tbd_exclusion_filter(); + if (!empty($args['status'])) { $where[] = 'standard_status = %s'; $values[] = $args['status']; diff --git a/wp-content/themes/homeproz/dist/assets/main.js b/wp-content/themes/homeproz/dist/assets/main.js index d3325249..7a13b69d 100644 --- a/wp-content/themes/homeproz/dist/assets/main.js +++ b/wp-content/themes/homeproz/dist/assets/main.js @@ -1 +1 @@ -(function(a){var b=a(".menu-toggle"),i=a(".mobile-navigation");b.length&&(b.on("click",function(){var n=a(this).attr("aria-expanded")==="true";a(this).attr("aria-expanded",!n),i.toggleClass("is-open"),n?a("body").removeClass("mobile-menu-open"):a("body").addClass("mobile-menu-open")}),a(document).on("keydown",function(n){n.key==="Escape"&&i.hasClass("is-open")&&(b.attr("aria-expanded","false"),i.removeClass("is-open"),a("body").removeClass("mobile-menu-open"))}),a(document).on("click",function(n){i.hasClass("is-open")&&!a(n.target).closest(".mobile-navigation").length&&!a(n.target).closest(".menu-toggle").length&&(b.attr("aria-expanded","false"),i.removeClass("is-open"),a("body").removeClass("mobile-menu-open"))}))})(jQuery);(function(a){var b=6e3,i=1450,n=1e3,o=[],h=0,p=null,l=!1,u=!1,m=null;function t(){if(a(".Home_Page").length&&(m=a(".hero-split-image"),!!m.length)){var d=m.data("gallery-images");!d||!d.length||(o=d,e(),a(window).on("resize",v(e,150)))}}function e(){var d=a(window).width();d>=i?l||r():l&&s()}function r(){l=!0,u||(c(),u=!0),p=setInterval(f,b)}function s(){l=!1,p&&(clearInterval(p),p=null)}function c(){a.each(o,function(d,g){var y=new Image;y.src=g})}function f(){h=(h+1)%o.length;var d=o[h],g=a('
');g.css({position:"absolute",top:0,left:0,right:0,bottom:0,"background-image":"url("+d+")","background-size":"cover","background-position":"center center","background-repeat":"no-repeat",opacity:0,transform:"scale(1.02)",transition:"opacity "+n+"ms ease-in-out, transform "+n+"ms ease-in-out","z-index":1}),m.css("position","relative"),m.append(g),g[0].offsetHeight,g.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){m.css("background-image","url("+d+")"),g.remove()},n)}function v(d,g){var y;return function(){var P=this,I=arguments;clearTimeout(y),y=setTimeout(function(){d.apply(P,I)},g)}}a(document).ready(t)})(jQuery);(function(a){if(a("body").hasClass("Home_Page")){var b={grid:null,emptyMessage:null,listings:[],init:function(){this.grid=a("#featured-listings-grid"),this.emptyMessage=a("#featured-listings-empty"),this.grid.length&&(this.loadListingsData(),this.renderListings())},loadListingsData:function(){var i=document.getElementById("featured-mls-data");if(!i){this.listings=[];return}try{this.listings=JSON.parse(i.textContent)}catch(n){console.error("Failed to parse featured listings data:",n),this.listings=[]}},shuffleArray:function(i){for(var n=i.slice(),o=n.length-1;o>0;o--){var h=Math.floor(Math.random()*(o+1)),p=n[o];n[o]=n[h],n[h]=p}return n},renderListings:function(){if(!this.listings||this.listings.length===0){this.grid.hide(),this.emptyMessage.show();return}for(var i=[],n=[],o=0;oSomething went wrong. Please try again.
=0&&this.preloadThumbnailPages(i,1)}};a(function(){b.init()})})(jQuery);(function(a){if(!a(".mortgage-calculator-main").length)return;let b=!1;a.fn.currencyInput=function(n=!0){return this.data("ci_show_symbol",n),b||(b=!0,a.fn._CIOriginalVal=a.fn.val,a.fn.val=function(h){if(a(this).data("_currencyInput"))if(arguments.length===0){var p=a(this)._CIOriginalVal();if(p=="")return"";var l=parseInt(p.replace(/[^0-9]/g,""));return l}else{if(h=String(h).replace(/[^0-9]/g,""),h!=""){var u=parseInt(h).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:0,maximumFractionDigits:0});return a(this).data("ci_show_symbol")||(u=u.replace("$","")),a(this)._CIOriginalVal(u)}return a(this)._CIOriginalVal(h)}else if(a(this).data("_percentInput"))if(arguments.length===0){var p=a(this)._CIOriginalVal();if(p=="")return"";var l=parseFloat(p.replace(/[^0-9.]/g,""));return isNaN(l)?"":l}else{h=String(h).replace(/[^0-9.]/g,"");var m=h.split(".");return m.length>2&&(h=m[0]+"."+m.slice(1).join("")),a(this)._CIOriginalVal(h)}else return arguments.length===0?a(this)._CIOriginalVal():a(this)._CIOriginalVal(h)}),this.data("_currencyInput")?this:(this.data("_currencyInput",!0),this.on("focus",function(){a(this).select()}),this.on("input",function(h){var p=this.selectionStart,l=a(this)._CIOriginalVal(),u=l.length;a(this).val(l);var m=a(this)._CIOriginalVal().length;m>u?p+=m-u:m2&&(l=u[0]+"."+u.slice(1).join("")),a(this)._CIOriginalVal(l);var m=l.length;m
0){var h=o/n*100;this.$downPaymentPercent._CIOriginalVal(h.toFixed(1))}},syncDownPaymentFromPercent:function(){var n=this.$homePrice.val(),o=this.$downPaymentPercent.val();if(n&&n>0&&o!==""&&o>=0){var h=Math.round(n*o/100);this.$downPayment.val(h)}},calculate:function(){var n=this.$homePrice.val()||0,o=this.$downPayment.val()||0,h=parseInt(this.$loanTerm.val(),10),p=this.$interestRate.val()||0,l=n-o;l<0&&(l=0);var u=p/100/12,m=h*12,t=0,e=0;if(l>0&&u>0&&m>0){var r=Math.pow(1+u,m);t=l*(u*r)/(r-1),e=t*m-l}else l>0&&u===0&&(t=l/m,e=0);this.$monthlyPayment.text(this.formatCurrencyDisplay(t)),this.$principalInterest.text(this.formatCurrencyDisplay(t)),this.$loanAmount.text(this.formatCurrencyDisplay(l)),this.$totalInterest.text(this.formatCurrencyDisplay(e))}};a(document).ready(function(){i.init()})})(jQuery);(function(a){a(function(){})})(jQuery); +(function(r){var b=r(".menu-toggle"),i=r(".mobile-navigation");b.length&&(b.on("click",function(){var n=r(this).attr("aria-expanded")==="true";r(this).attr("aria-expanded",!n),i.toggleClass("is-open"),n?r("body").removeClass("mobile-menu-open"):r("body").addClass("mobile-menu-open")}),r(document).on("keydown",function(n){n.key==="Escape"&&i.hasClass("is-open")&&(b.attr("aria-expanded","false"),i.removeClass("is-open"),r("body").removeClass("mobile-menu-open"))}),r(document).on("click",function(n){i.hasClass("is-open")&&!r(n.target).closest(".mobile-navigation").length&&!r(n.target).closest(".menu-toggle").length&&(b.attr("aria-expanded","false"),i.removeClass("is-open"),r("body").removeClass("mobile-menu-open"))}))})(jQuery);(function(r){var b=6e3,i=1450,n=1e3,o=[],h=0,p=null,l=!1,u=!1,m=null;function t(){if(r(".Home_Page").length&&(m=r(".hero-split-image"),!!m.length)){var d=m.data("gallery-images");!d||!d.length||(o=d,e(),r(window).on("resize",v(e,150)))}}function e(){var d=r(window).width();d>=i?l||a():l&&s()}function a(){l=!0,u||(c(),u=!0),p=setInterval(f,b)}function s(){l=!1,p&&(clearInterval(p),p=null)}function c(){r.each(o,function(d,g){var y=new Image;y.src=g})}function f(){h=(h+1)%o.length;var d=o[h],g=r('
');g.css({position:"absolute",top:0,left:0,right:0,bottom:0,"background-image":"url("+d+")","background-size":"cover","background-position":"center center","background-repeat":"no-repeat",opacity:0,transform:"scale(1.02)",transition:"opacity "+n+"ms ease-in-out, transform "+n+"ms ease-in-out","z-index":1}),m.css("position","relative"),m.append(g),g[0].offsetHeight,g.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){m.css("background-image","url("+d+")"),g.remove()},n)}function v(d,g){var y;return function(){var I=this,P=arguments;clearTimeout(y),y=setTimeout(function(){d.apply(I,P)},g)}}r(document).ready(t)})(jQuery);(function(r){if(r("body").hasClass("Home_Page")){var b={grid:null,emptyMessage:null,listings:[],init:function(){this.grid=r("#featured-listings-grid"),this.emptyMessage=r("#featured-listings-empty"),this.grid.length&&(this.loadListingsData(),this.renderListings())},loadListingsData:function(){var i=document.getElementById("featured-mls-data");if(!i){this.listings=[];return}try{this.listings=JSON.parse(i.textContent)}catch(n){console.error("Failed to parse featured listings data:",n),this.listings=[]}},shuffleArray:function(i){for(var n=i.slice(),o=n.length-1;o>0;o--){var h=Math.floor(Math.random()*(o+1)),p=n[o];n[o]=n[h],n[h]=p}return n},renderListings:function(){if(!this.listings||this.listings.length===0){this.grid.hide(),this.emptyMessage.show();return}for(var i=[],n=[],o=0;oSomething went wrong. Please try again.
=0&&this.preloadThumbnailPages(i,1)}};r(function(){b.init()})})(jQuery);(function(r){if(!r(".mortgage-calculator-main").length)return;let b=!1;r.fn.currencyInput=function(n=!0){return this.data("ci_show_symbol",n),b||(b=!0,r.fn._CIOriginalVal=r.fn.val,r.fn.val=function(h){if(r(this).data("_currencyInput"))if(arguments.length===0){var p=r(this)._CIOriginalVal();if(p=="")return"";var l=parseInt(p.replace(/[^0-9]/g,""));return l}else{if(h=String(h).replace(/[^0-9]/g,""),h!=""){var u=parseInt(h).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:0,maximumFractionDigits:0});return r(this).data("ci_show_symbol")||(u=u.replace("$","")),r(this)._CIOriginalVal(u)}return r(this)._CIOriginalVal(h)}else if(r(this).data("_percentInput"))if(arguments.length===0){var p=r(this)._CIOriginalVal();if(p=="")return"";var l=parseFloat(p.replace(/[^0-9.]/g,""));return isNaN(l)?"":l}else{h=String(h).replace(/[^0-9.]/g,"");var m=h.split(".");return m.length>2&&(h=m[0]+"."+m.slice(1).join("")),r(this)._CIOriginalVal(h)}else return arguments.length===0?r(this)._CIOriginalVal():r(this)._CIOriginalVal(h)}),this.data("_currencyInput")?this:(this.data("_currencyInput",!0),this.on("focus",function(){r(this).select()}),this.on("input",function(h){var p=this.selectionStart,l=r(this)._CIOriginalVal(),u=l.length;r(this).val(l);var m=r(this)._CIOriginalVal().length;m>u?p+=m-u:m2&&(l=u[0]+"."+u.slice(1).join("")),r(this)._CIOriginalVal(l);var m=l.length;m
0){var h=o/n*100;this.$downPaymentPercent._CIOriginalVal(h.toFixed(1))}},syncDownPaymentFromPercent:function(){var n=this.$homePrice.val(),o=this.$downPaymentPercent.val();if(n&&n>0&&o!==""&&o>=0){var h=Math.round(n*o/100);this.$downPayment.val(h)}},calculate:function(){var n=this.$homePrice.val()||0,o=this.$downPayment.val()||0,h=parseInt(this.$loanTerm.val(),10),p=this.$interestRate.val()||0,l=n-o;l<0&&(l=0);var u=p/100/12,m=h*12,t=0,e=0;if(l>0&&u>0&&m>0){var a=Math.pow(1+u,m);t=l*(u*a)/(a-1),e=t*m-l}else l>0&&u===0&&(t=l/m,e=0);this.$monthlyPayment.text(this.formatCurrencyDisplay(t)),this.$principalInterest.text(this.formatCurrencyDisplay(t)),this.$loanAmount.text(this.formatCurrencyDisplay(l)),this.$totalInterest.text(this.formatCurrencyDisplay(e))}};r(document).ready(function(){i.init()})})(jQuery);(function(r){r(function(){})})(jQuery);
diff --git a/wp-content/themes/homeproz/template-parts/property/property-card-mls.php b/wp-content/themes/homeproz/template-parts/property/property-card-mls.php
index 4a343d1c..bc3823c3 100644
--- a/wp-content/themes/homeproz/template-parts/property/property-card-mls.php
+++ b/wp-content/themes/homeproz/template-parts/property/property-card-mls.php
@@ -65,7 +65,7 @@ $image_url = function_exists('mls_get_image_url') ? mls_get_image_url($listing_k
$has_image = !empty($image_url);
?>
-