Manual property enhancements: MLS status sync, agent clone, description formatting

- Manual properties linked to MLS now inherit status (Active/Pending/Closed) and
  days_on_market from the MLS listing dynamically
- Properties not in MLS default to Closed status
- Clone feature now auto-populates listing agent by matching MLS ID to Agent CPT
- Description formatter detects embedded headers (unpunctuated text after sentences)
  and splits them into separate paragraphs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
root
2026-01-23 21:28:44 +00:00
parent c2d5b2248d
commit 57b752f54e
60 changed files with 5323 additions and 189 deletions
@@ -191,24 +191,62 @@ class MLS_CLI {
private function show_rate_limits() {
$rate_limiter = $this->plugin->get_rate_limiter();
$status = $rate_limiter->get_status();
$summary = $rate_limiter->get_usage_summary();
WP_CLI::line('=== Rate Limits ===');
WP_CLI::line('=== MLS Grid Rate Limits ===');
WP_CLI::line('');
// Requests
WP_CLI::line('Requests:');
WP_CLI::line(sprintf(
'Hourly: %d / %d requests (%d remaining)',
$status['hourly']['used'],
$status['hourly']['limit'],
$status['hourly']['remaining']
' Hourly: %s / %s (%s%%)',
number_format($status['hourly']['used']),
number_format($status['hourly']['limit']),
$summary['requests_hourly_pct']
));
WP_CLI::line(sprintf(
'Daily: %d / %d requests (%d remaining)',
$status['daily']['used'],
$status['daily']['limit'],
$status['daily']['remaining']
' Daily: %s / %s (%s%%)',
number_format($status['daily']['used']),
number_format($status['daily']['limit']),
$summary['requests_daily_pct']
));
WP_CLI::line('');
// Data transfer
WP_CLI::line('Data Transfer:');
WP_CLI::line(sprintf(
' Hourly: %s / %s (%s%%)',
size_format($status['data_hourly']['used']),
size_format($status['data_hourly']['limit']),
$summary['data_hourly_pct']
));
WP_CLI::line(sprintf(
'Data: %s / 4GB this hour',
size_format($status['bytes_this_hour'])
' Daily: %s / %s (%s%%)',
size_format($status['data_daily']['used']),
size_format($status['data_daily']['limit']),
$summary['data_daily_pct']
));
WP_CLI::line(sprintf(
' Remaining today: %s GB',
$summary['data_daily_remaining_gb']
));
WP_CLI::line('');
// Warnings
if ($rate_limiter->is_approaching_limit(0.7)) {
WP_CLI::warning('Approaching rate limits (>70% used)');
}
if ($rate_limiter->is_approaching_limit(0.9)) {
WP_CLI::error('Critical: Near rate limit threshold (>90% used)', false);
}
// Sync pacing info
WP_CLI::line('Sync Pacing:');
WP_CLI::line(sprintf(
' Min interval: %s seconds between API requests',
number_format(MLS_Rate_Limiter::SYNC_MIN_INTERVAL_MS / 1000, 2)
));
WP_CLI::line(' (Ensures max 50%% of daily quota used even if sync runs 24h)');
WP_CLI::line('');
}