Files
homeproz/CLAUDE.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

4.5 KiB
Executable File

HomeProz WordPress Theme

Custom WordPress theme for HomeProz Real Estate (Albert Lea, MN). Dark/rust brand aesthetic with ACF-powered property listings.

Development Rules

  1. No emojis - nowhere in code, commits, docs, or conversation
  2. Tailwind CSS + SCSS - compiled via Vite
  3. jQuery - for all JS functionality
  4. Co-locate files - SCSS/JS live alongside PHP templates
  5. Page-scoped styles - wrap in .Page_Class_Name { }, early return in JS
  6. Server-side render - no client-side templating
  7. No custom animations - keep it static and fast
  8. ASK before architectural decisions
  9. No git commits unless asked - commits are for checkpoints before major work or major milestones, not for small single-file changes
  10. Sync to staging - after modifying theme or plugin files, sync them to /var/www/vhosts/homeprozrealestate.com/staging/ using rsync

Version Control Policy

Git is a snapshot tool and the historical record of what changed on the site. If it's not in git, it may as well not exist.

When asked to commit, commit everything except build artifacts — do not pick a "scope" or hand-select files. The point is the snapshot.

  • Commit: all source (PHP, SCSS, JS), configs, package.json/package-lock.json, db_content_updates/, node_modules/, dist/, DB snapshots (*.sql.gz), plugins, themes, CLAUDE.md. node_modules/ and dist/ are tracked intentionally — see comments in .gitignore.
  • Do not commit: runtime caches (wp-content/cache/transformed-images/), log files (wp-content/debug.log*), and other transient/regenerable runtime output. These belong in .gitignore.

If you find untracked files in scope of a commit, include them. If something looks ambiguous, default to committing it — under-tracking loses history; over-tracking is reversible.

Build

cd wp-content/themes/homeproz
npm run build

Tools

  • WP-CLI: wp --allow-root <command>
  • Dev commits: ./dev_commit.sh "message" (includes DB snapshot)

WordPress Admin

  • URL: /wp-admin/
  • Username: admin
  • Password: Byg2X2sqbHeVvHLYRz5e

Theme Options

Access via homeproz_get_option('key'):

  • phone, email, address, facebook, tiktok

Database Content Changes (MANDATORY)

This site has a production fork. All database changes must be documented for production sync.

Schema changes (new tables, columns, indexes): Use migration files in the MLS plugin (wp-content/plugins/mls-by-hansonxyz/).

Content changes (options, ACF fields, posts, menus, terms): Create a timestamped document in db_content_updates/ with:

  • Filename: YYYY-MM-DD_HH-MM_description.md
  • What was changed (exact field names, option keys, post IDs)
  • The exact values set (copy/paste the WP-CLI commands or SQL)
  • Why it was changed
  • Any dependencies or order of operations

Example: 2026-01-04_19-30_add-footer-menu.md

DO NOT make database content changes without creating the corresponding document. The production team relies on these files to sync changes.

Custom Post Types

Agent (/agents/)

  • ACF: phone, email, bio, gallery, social links, order, disabled toggle
  • Disabled agents: 404 on profile, office contact on property cards

Key Helpers

// Get locations with active/pending properties only
$locations = homeproz_get_active_locations();

// Contact page with property inquiry prefill
$url = add_query_arg('property', urlencode($title), home_url('/contact/'));

Page Classes

Home_Page, Properties_Archive, Single_Property, About_Page, Contact_Page, Blog_Archive, Single_Post, Agents_Archive, Single_Agent, Search_Page, Error_404

MLS Property Overrides

Force a non-HomeProz listing to appear as HomeProz

Some properties (e.g., LandProz listings) may need to appear on the HomeProz site. The is_homeproz flag overrides the office name check.

  1. Find the property's listing_key:
wp --allow-root db query "SELECT listing_key, listing_id, street_name, city, list_office_name, is_homeproz FROM wp_mls_properties WHERE listing_id LIKE '%<MLS_ID>%'"
  1. Set the override flag:
wp --allow-root db query "UPDATE wp_mls_properties SET is_homeproz = 1 WHERE listing_key = '<LISTING_KEY>'"
  1. Document the change in db_content_updates/ per the Database Content Changes policy.

Example: 121 Main St, Glenville (NST7785198) is listed under "LandProz Real Estate, LLC" but appears on HomeProz via is_homeproz = 1.