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

129 lines
4.1 KiB
PHP
Executable File

<?php
/**
* WPForms Builder Field Context Menu (right click) Template.
*
* @since 1.8.6
*/
use WPForms\Admin\Education\Helpers;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<div class="wpforms-context-menu" id="wpforms-field-context-menu">
<ul class="wpforms-context-menu-list">
<li class="wpforms-context-menu-list-item" data-action="edit">
<span class="wpforms-context-menu-list-item-icon">
<i class="fa fa-pencil-square-o"></i>
</span>
<span class="wpforms-context-menu-list-item-text">
<?php esc_html_e( 'Edit', 'wpforms-lite' ); ?>
</span>
</li>
<li class="wpforms-context-menu-list-item" data-action="duplicate">
<span class="wpforms-context-menu-list-item-icon">
<i class="fa fa-files-o"></i>
</span>
<span class="wpforms-context-menu-list-item-text">
<?php esc_html_e( 'Duplicate', 'wpforms-lite' ); ?>
</span>
</li>
<li class="wpforms-context-menu-list-item" data-action="delete">
<span class="wpforms-context-menu-list-item-icon">
<i class="fa fa-trash-o"></i>
</span>
<span class="wpforms-context-menu-list-item-text">
<?php esc_html_e( 'Delete', 'wpforms-lite' ); ?>
</span>
</li>
<li class="wpforms-context-menu-list-divider" data-visibility="required, label, field-size"></li>
<li class="wpforms-context-menu-list-item wpforms-context-menu-list-item-selective" data-action="required">
<span class="wpforms-context-menu-list-item-icon">
<i class="fa fa-asterisk"></i>
</span>
<span class="wpforms-context-menu-list-item-text" data-active-text="<?php esc_html_e( 'Mark as Optional', 'wpforms-lite' ); ?>">
<?php esc_html_e( 'Mark as Required', 'wpforms-lite' ); ?>
</span>
</li>
<li class="wpforms-context-menu-list-item wpforms-context-menu-list-item-selective" data-action="label">
<span class="wpforms-context-menu-list-item-icon">
<i class="fa fa-tag"></i>
</span>
<span class="wpforms-context-menu-list-item-text" data-active-text="<?php esc_html_e( 'Show Label', 'wpforms-lite' ); ?>">
<?php esc_html_e( 'Hide Label', 'wpforms-lite' ); ?>
</span>
</li>
<li class="wpforms-context-menu-list-item wpforms-context-menu-list-item-has-child" data-action="field-size">
<span class="wpforms-context-menu-list-item-icon">
<i class="fa fa-arrows-h"></i>
</span>
<span class="wpforms-context-menu-list-item-text">
<?php esc_html_e( 'Field Size', 'wpforms-lite' ); ?>
</span>
<ul class="wpforms-context-menu-list wpforms-context-menu-list-selective">
<li class="wpforms-context-menu-list-item wpforms-context-menu-list-item-selective" data-action="field-size" data-value="small">
<span class="wpforms-context-menu-list-item-icon">
<i class="fa fa-check"></i>
</span>
<span class="wpforms-context-menu-list-item-text">
<?php esc_html_e( 'Small', 'wpforms-lite' ); ?>
</span>
</li>
<li class="wpforms-context-menu-list-item wpforms-context-menu-list-item-selective" data-action="field-size" data-value="medium">
<span class="wpforms-context-menu-list-item-icon">
<i class="fa fa-check"></i>
</span>
<span class="wpforms-context-menu-list-item-text">
<?php esc_html_e( 'Medium', 'wpforms-lite' ); ?>
</span>
</li>
<li class="wpforms-context-menu-list-item wpforms-context-menu-list-item-selective" data-action="field-size" data-value="large">
<span class="wpforms-context-menu-list-item-icon">
<i class="fa fa-check"></i>
</span>
<span class="wpforms-context-menu-list-item-text">
<?php esc_html_e( 'Large', 'wpforms-lite' ); ?>
</span>
</li>
</ul>
</li>
<li class="wpforms-context-menu-list-divider" data-visibility="smart-logic"></li>
<li class="wpforms-context-menu-list-item" data-action="smart-logic">
<span class="wpforms-context-menu-list-item-icon">
<i class="fa fa-random"></i>
</span>
<span class="wpforms-context-menu-list-item-text">
<?php esc_html_e( 'Edit Smart Logic', 'wpforms-lite' ); ?>
</span>
<?php if ( ! wpforms()->is_pro() ) : ?>
<?php Helpers::print_badge( 'Pro', 'sm', 'inline', 'stone' ); ?>
<?php endif; ?>
</li>
</ul>
</div>