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

78 lines
2.8 KiB
Markdown
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