Files
homeproz/db_content_updates/2026-01-21_manual-property-system.md
T
root b6df4dbb92 Snapshot: MLS sync fixes, image refresh, plugin/theme updates
MLS plugin fixes from this session:
- Fix silent insert failures: location column NOT NULL was rejecting wpdb->insert calls,
  causing ~18k new properties since Dec 2025 to be lost. Inserts now build raw SQL
  with ST_PointFromText so the spatial column is populated atomically.
- Auto-refresh expired media URLs in MLS_Media_Handler::fetch_and_cache(), guarded by
  a property-level GET_LOCK so concurrent fetches share one API refresh.
- Normalize WP_Error to null in mls_get_property_image() so callers can rely on the
  documented string|null contract.
- Support comma-separated property_type filters in MLS_Query and MLS_Cluster so the
  homepage "View All Commercial" link (?property_type=Commercial+Sale,Land,Farm)
  actually filters correctly.
- Incremental sync now looks back 10 minutes past the latest modification timestamp
  as a safety margin against missed records.
- Smart sync exits silently (info-level, not warning) when a full sync is in progress.

Operational:
- New cron: weekly full sync Sundays at 3 AM (/usr/local/bin/mls-full-sync).
- New cron: hourly 2GB cap on mls-thumbnails/ and cache/transformed-images/
  (/usr/local/bin/mls-image-cache-cap).
- Logrotate config for wp-content/debug.log (2-day retention, daily rotation,
  delaycompress).

Repo policy:
- CLAUDE.md updated with explicit "commit everything except build artifacts" policy.
- .gitignore: untrack runtime image caches and debug.log rotations.

Other modifications in this snapshot are pre-existing in-flight theme/plugin/db_content_updates work.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 15:32:23 +00:00

2.8 KiB
Executable File

Manual Property Entry System

Date: 2026-01-21 Type: Schema Change + New Feature

Summary

Added the ability to manually enter properties that integrate seamlessly with MLS-synced listings. Manual properties can override MLS listings (same MLS ID), support cloning from existing MLS data, and include geocoding for addresses.

Schema Changes

New table wp_mls_properties_manual created automatically by the MLS plugin on activation/upgrade.

The table will be created automatically when the plugin runs - no manual SQL needed.

New Custom Post Type

CPT: manual_property Menu: "Manual Properties" in WordPress admin

ACF Field Group

ACF fields are registered programmatically (no JSON import needed). Fields will appear automatically on the Manual Property edit screen.

How to Use

Add a Manual Property

  1. Go to Manual Properties > Add Property in WordPress admin
  2. Fill in property details across the tabs:
    • Basic Info: Status, Price, Type, HomeProz checkbox, Featured toggle
    • Location: Address (geocoded automatically), City, State, ZIP
    • Details: Beds, Baths, Square Feet, etc.
    • Description: Public remarks
    • Media: Upload property photos
    • Agent: Select from Agent CPT
    • Dates: List date, close date, etc.
  3. Publish the property

Clone from MLS

  1. Go to Manual Properties > Add Property
  2. Enter an MLS # in the "Clone from MLS Listing" box
  3. Click "Clone Listing"
  4. Images will be downloaded and fields pre-populated
  5. Review and modify as needed, then publish

Override an MLS Listing

  1. Create a manual property
  2. Set the MLS # field to the MLS ID you want to override
  3. Publish
  4. The manual version will appear in search results instead of the MLS-synced version

Dependencies

  • ACF Pro (already installed)
  • MLS by HansonXyz plugin (updated in this release)

Files Changed

Plugin files (MLS plugin):

  • mls-by-hansonxyz.php - Added table constant, class includes
  • includes/class-mls-db.php - Added manual properties table schema
  • includes/class-mls-query.php - Modified to include manual properties in queries
  • includes/class-mls-image-endpoint.php - Handle manual property images
  • includes/class-mls-manual-property.php - NEW: CPT, ACF fields, sync logic
  • includes/class-mls-geocoder.php - NEW: Address geocoding via Nominatim
  • admin/js/manual-property.js - NEW: Clone from MLS functionality
  • admin/css/manual-property.css - NEW: Admin styles

Notes

  • Manual properties use WordPress Media Library for images (not MLS media cache)
  • Geocoding uses free Nominatim API (rate limited, cached for 30 days)
  • Manual property listing keys follow format: MANUAL-{post_id}
  • Properties with listing_id set will override MLS listings with matching ID