Files
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 lines
4.1 KiB
XML
Executable File

<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 106 80"><path fill="#0074BF" d="M73.012 69.998H63.01V80h10.002V69.998Z" opacity=".5"/><path fill="#0074BF" d="M63.01 69.998H53.008V80H63.01V69.998Zm-10.002 0H43.006V80h10.002V69.998Z" opacity=".7"/><path fill="#0074BF" d="M43.006 69.998H33.004V80h10.002V69.998Z" opacity=".5"/><path fill="#0082BF" d="M83.014 60.013H73.013v10.002h10.001V60.012Z" opacity=".7"/><path fill="#0082BF" d="M73.012 60.013H63.01v10.002h10.002V60.012Z" opacity=".8"/><path fill="#0082BF" d="M63.01 60.013H53.008v10.002H63.01V60.012Zm-10.002 0H43.006v10.002h10.002V60.012Z"/><path fill="#0082BF" d="M43.006 60.013H33.004v10.002h10.002V60.012Z" opacity=".8"/><path fill="#0082BF" d="M33.004 60.013H23.002v10.002h10.002V60.012Z" opacity=".7"/><path fill="#008FBF" d="M93 50.01H82.998v10.002H93V50.01Z" opacity=".5"/><path fill="#008FBF" d="M83.014 50.01H73.013v10.002h10.001V50.01Z" opacity=".8"/><path fill="#008FBF" d="M73.012 50.01H63.01v10.002h10.002V50.01Zm-10.002 0H53.008v10.002H63.01V50.01Zm-10.002 0H43.006v10.002h10.002V50.01Zm-10.002 0H33.004v10.002h10.002V50.01Z"/><path fill="#008FBF" d="M33.004 50.01H23.002v10.002h10.002V50.01Z" opacity=".8"/><path fill="#008FBF" d="M23.002 50.01H13v10.002h10.002V50.01Z" opacity=".5"/><path fill="#009DBF" d="M93 40.008H82.998V50.01H93V40.008Z" opacity=".7"/><path fill="#009DBF" d="M83.014 40.008H73.013V50.01h10.001V40.008Zm-10.002 0H63.01V50.01h10.002V40.008Zm-10.002 0H53.008V50.01H63.01V40.008Zm-10.002 0H43.006V50.01h10.002V40.008Zm-10.002 0H33.004V50.01h10.002V40.008Zm-10.002 0H23.002V50.01h10.002V40.008Z"/><path fill="#009DBF" d="M23.002 40.008H13V50.01h10.002V40.008Z" opacity=".7"/><path fill="#00ABBF" d="M93 30.006H82.998v10.002H93V30.006Z" opacity=".7"/><path fill="#00ABBF" d="M83.014 30.006H73.013v10.002h10.001V30.006Zm-10.002 0H63.01v10.002h10.002V30.006Zm-10.002 0H53.008v10.002H63.01V30.006Zm-10.002 0H43.006v10.002h10.002V30.006Zm-10.002 0H33.004v10.002h10.002V30.006Zm-10.002 0H23.002v10.002h10.002V30.006Z"/><path fill="#00ABBF" d="M23.002 30.006H13v10.002h10.002V30.006Z" opacity=".7"/><path fill="#00B9BF" d="M93 20.004H82.998v10.002H93V20.004Z" opacity=".5"/><path fill="#00B9BF" d="M83.014 20.004H73.013v10.002h10.001V20.004Z" opacity=".8"/><path fill="#00B9BF" d="M73.012 20.004H63.01v10.002h10.002V20.004Zm-10.002 0H53.008v10.002H63.01V20.004Zm-10.002 0H43.006v10.002h10.002V20.004Zm-10.002 0H33.004v10.002h10.002V20.004Z"/><path fill="#00B9BF" d="M33.004 20.004H23.002v10.002h10.002V20.004Z" opacity=".8"/><path fill="#00B9BF" d="M23.002 20.004H13v10.002h10.002V20.004Z" opacity=".5"/><path fill="#00C6BF" d="M83.014 10.002H73.013v10.002h10.001V10.002Z" opacity=".7"/><path fill="#00C6BF" d="M73.012 10.002H63.01v10.002h10.002V10.002Z" opacity=".8"/><path fill="#00C6BF" d="M63.01 10.002H53.008v10.002H63.01V10.002Zm-10.002 0H43.006v10.002h10.002V10.002Z"/><path fill="#00C6BF" d="M43.006 10.002H33.004v10.002h10.002V10.002Z" opacity=".8"/><path fill="#00C6BF" d="M33.004 10.002H23.002v10.002h10.002V10.002Z" opacity=".7"/><path fill="#00D4BF" d="M73.012 0H63.01v10.002h10.002V0Z" opacity=".5"/><path fill="#00D4BF" d="M63.01 0H53.008v10.002H63.01V0ZM53.008 0H43.006v10.002h10.002V0Z" opacity=".7"/><path fill="#00D4BF" d="M43.006 0H33.004v10.002h10.002V0Z" opacity=".5"/><path fill="#fff" d="m39.34 36.84 2.787-6.237c1.012-1.592.88-3.55-.232-4.66a3.6 3.6 0 0 0-.481-.399 3.054 3.054 0 0 0-2.571-.298 4.246 4.246 0 0 0-2.322 1.791s-3.816 8.907-5.242 12.905c-1.426 3.998-.863 11.346 4.611 16.836 5.806 5.806 14.215 7.133 19.573 3.102.232-.116.431-.249.63-.415l16.521-13.8c.796-.664 1.99-2.024.93-3.583-1.046-1.526-3.003-.481-3.816.033l-9.504 6.917a.422.422 0 0 1-.597-.05s0-.017-.017-.017c-.249-.298-.282-1.078.1-1.393l14.58-12.374c1.26-1.128 1.426-2.787.414-3.915-.995-1.11-2.57-1.078-3.848.067l-13.12 10.267a.578.578 0 0 1-.813-.083c0-.016-.017-.016-.017-.033-.265-.298-.365-.78-.066-1.078l14.862-14.414c1.178-1.095 1.244-2.936.15-4.097a2.824 2.824 0 0 0-2.024-.863 2.905 2.905 0 0 0-2.09.83L52.544 36.144c-.365.364-1.078 0-1.161-.432a.474.474 0 0 1 .132-.431l11.628-13.237a2.86 2.86 0 0 0 .15-4.047 2.86 2.86 0 0 0-4.048-.15c-.05.05-.1.084-.133.133L41.447 37.47c-.63.63-1.56.664-2.007.3a.657.657 0 0 1-.1-.93Z"/></svg>