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>
This commit is contained in:
root
2026-04-29 15:32:23 +00:00
parent 57b752f54e
commit b6df4dbb92
5385 changed files with 838580 additions and 2416 deletions
@@ -0,0 +1,23 @@
<?php
/**
* Display Email settings heading.
*
* @since 1.8.5
*/
defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
?>
<h4>
<?php esc_html_e( 'Email', 'wpforms-lite' ); ?>
</h4>
<p>
<?php esc_html_e( 'Customize your email template and sending preferences.', 'wpforms-lite' ); ?>
</p>
<?php
// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
echo wpforms()->obj( 'education_smtp_notice' )->get_template();
/* Omit closing PHP tag at the end of PHP files to avoid "headers already sent" issues. */
@@ -0,0 +1,29 @@
<?php
/**
* Description template for hCaptcha.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<p><?php esc_html_e( "hCaptcha is a free and privacy-oriented spam prevention service. Within your forms, hCaptcha will display a checkbox asking users to prove they're human (much like Google's v2 Checkbox reCAPTCHA). This is a simple step for legitimate site visitors, but is extremely effective at blocking spam.", 'wpforms-lite' ); ?></p>
<p>
<?php
printf(
wp_kses( /* translators: %s - WPForms.com Setup hCaptcha URL. */
__( 'For more details on how hCaptcha works, as well as a step by step setup guide, please check out our <a href="%s" target="_blank" rel="noopener noreferrer">documentation</a>.', 'wpforms-lite' ),
[
'a' => [
'href' => [],
'target' => [],
'rel' => [],
],
]
),
esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-set-up-and-use-hcaptcha-in-wpforms/', 'Settings - Captcha', 'hCaptcha Documentation' ) )
);
?>
</p>
@@ -0,0 +1,57 @@
<?php
/**
* Description template for reCAPTCHA.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<p class="wpforms-strong"><?php esc_html_e( 'reCAPTCHA is a free anti-spam service from Google which helps to protect your website from spam and abuse while letting real people pass through with ease.', 'wpforms-lite' ); ?></p>
<p><?php esc_html_e( 'Google offers 3 versions of reCAPTCHA (all supported within WPForms):', 'wpforms-lite' ); ?></p>
<ul style="list-style: disc;margin-left: 20px;">
<li>
<?php
echo wp_kses(
__( '<strong>v2 Checkbox reCAPTCHA</strong>: Prompts users to check a box to prove they\'re human.', 'wpforms-lite' ),
[ 'strong' => [] ]
);
?>
</li>
<li>
<?php
echo wp_kses(
__( '<strong>v2 Invisible reCAPTCHA</strong>: Uses advanced technology to detect real users without requiring any input.', 'wpforms-lite' ),
[ 'strong' => [] ]
);
?>
</li>
<li>
<?php
echo wp_kses(
__( '<strong>v3 reCAPTCHA</strong>: Uses a behind-the-scenes scoring system to detect abusive traffic, and lets you decide the minimum passing score. Recommended for advanced use only (or if using Google AMP).', 'wpforms-lite' ),
[ 'strong' => [] ]
);
?>
</li>
</ul>
<p><?php esc_html_e( 'Sites already using one type of reCAPTCHA will need to create new site keys before switching to a different option.', 'wpforms-lite' ); ?></p>
<p>
<?php
printf(
wp_kses( /* translators: %s - WPForms.com Setup reCAPTCHA URL. */
__( '<a href="%s" target="_blank" rel="noopener noreferrer">Read our walk through</a> to learn more and for step-by-step directions.', 'wpforms-lite' ),
[
'a' => [
'href' => [],
'target' => [],
'rel' => [],
],
]
),
esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-set-up-and-use-recaptcha-in-wpforms/', 'Settings - Captcha', 'reCAPTCHA Documentation' ) )
);
?>
</p>
@@ -0,0 +1,25 @@
<?php
/**
* Specific note template.
*
* @since 1.8.4
*
* @var string $content
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<div class="wpforms-specific-note-wrap">
<div class="wpforms-specific-note-lightbulb">
<svg viewBox="0 0 14 20">
<path d="M3.75 17.97c0 .12 0 .23.08.35l.97 1.4c.12.2.32.28.51.28H8.4c.2 0 .39-.08.5-.27l.98-1.41c.04-.12.08-.23.08-.35v-1.72H3.75v1.72Zm3.13-5.47c.66 0 1.25-.55 1.25-1.25 0-.66-.6-1.25-1.26-1.25-.7 0-1.25.59-1.25 1.25 0 .7.55 1.25 1.25 1.25Zm0-12.5A6.83 6.83 0 0 0 0 6.88c0 1.75.63 3.32 1.68 4.53.66.74 1.68 2.3 2.03 3.59H5.6c0-.16 0-.35-.08-.55-.2-.7-.86-2.5-2.42-4.25a5.19 5.19 0 0 1-1.21-3.32c-.04-2.86 2.3-5 5-5 2.73 0 5 2.26 5 5 0 1.2-.47 2.38-1.26 3.32a11.72 11.72 0 0 0-2.42 4.25c-.07.2-.07.35-.07.55H10a10.56 10.56 0 0 1 2.03-3.6A6.85 6.85 0 0 0 6.88 0Zm-.4 8.75h.75c.3 0 .58-.23.62-.55l.5-3.75a.66.66 0 0 0-.62-.7H5.98a.66.66 0 0 0-.63.7l.5 3.75c.05.32.32.55.63.55Z"/>
</svg>
</div>
<div class="wpforms-specific-note-content">
<?php echo $content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
</div>
@@ -0,0 +1,29 @@
<?php
/**
* Description template for Turnstile.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<p><?php esc_html_e( 'Cloudflare Turnstile is a free, CAPTCHA-like service for preventing form spam while protecting data privacy. It offers a user-friendly experience by confirming visitors are real humans without requiring them to solve puzzles or math questions.', 'wpforms-lite' ); ?></p>
<p>
<?php
printf(
wp_kses( /* translators: %s - WPForms.com Setup Cloudflare Turnstile URL. */
__( 'For more details on how Turnstile works, as well as a step by step setup guide, please check out our <a href="%s" target="_blank" rel="noopener noreferrer">documentation</a>.', 'wpforms-lite' ),
[
'a' => [
'href' => [],
'target' => [],
'rel' => [],
],
]
),
esc_url( wpforms_utm_link( 'https://wpforms.com/docs/setting-up-cloudflare-turnstile/', 'Settings - Captcha', 'Turnstile Documentation' ) )
);
?>
</p>