plugin = $plugin; add_action('admin_menu', array($this, 'add_menu')); add_action('admin_init', array($this, 'register_settings')); add_action('wp_ajax_mls_test_connection', array($this, 'ajax_test_connection')); add_action('wp_ajax_mls_run_sync', array($this, 'ajax_run_sync')); } /** * Add admin menu */ public function add_menu() { add_options_page( 'MLS Settings', 'MLS Settings', 'manage_options', 'mls-settings', array($this, 'render_settings_page') ); } /** * Register settings */ public function register_settings() { register_setting('mls_settings', MLS_Options::OPTION_KEY, array( 'sanitize_callback' => array($this, 'sanitize_options'), )); } /** * Sanitize options */ public function sanitize_options($input) { $sanitized = array(); if (isset($input['api_url'])) { $sanitized['api_url'] = esc_url_raw($input['api_url']); } if (isset($input['api_token'])) { $sanitized['api_token'] = sanitize_text_field($input['api_token']); } if (isset($input['originating_system'])) { $sanitized['originating_system'] = sanitize_text_field($input['originating_system']); } $sanitized['auto_sync_enabled'] = !empty($input['auto_sync_enabled']); $sanitized['sync_media'] = !empty($input['sync_media']); if (isset($input['sync_interval'])) { $allowed = array('every_30_minutes', 'hourly', 'every_2_hours', 'every_6_hours', 'every_12_hours', 'daily'); $sanitized['sync_interval'] = in_array($input['sync_interval'], $allowed) ? $input['sync_interval'] : 'hourly'; } // Preserve timestamps $existing = get_option(MLS_Options::OPTION_KEY, array()); if (isset($existing['last_full_sync'])) { $sanitized['last_full_sync'] = $existing['last_full_sync']; } if (isset($existing['last_incremental_sync'])) { $sanitized['last_incremental_sync'] = $existing['last_incremental_sync']; } return $sanitized; } /** * Render settings page */ public function render_settings_page() { if (!current_user_can('manage_options')) { return; } $options = $this->plugin->get_options(); $db = $this->plugin->get_db(); $stats = $db->get_stats(); $sync_engine = $this->plugin->get_sync_engine(); $sync_status = $sync_engine->get_status(); $rate_limiter = $this->plugin->get_rate_limiter(); $rate_status = $rate_limiter->get_status(); // Check if using wp-config constants $using_config_url = defined('MLSGRID_API_URL') && MLSGRID_API_URL; $using_config_token = defined('MLSGRID_ACCESS_TOKEN') && MLSGRID_ACCESS_TOKEN; ?>

MLS Settings

API URL

Set via MLSGRID_API_URL in wp-config.php

API Token

Set via MLSGRID_ACCESS_TOKEN in wp-config.php

Originating System

MLS system identifier (e.g., northstar)

Auto Sync
Sync Interval
Sync Media

Manual Actions

Database Statistics

Total Properties
Active
Pending
Sold/Closed
Media Files /

Last Sync

Type: sync_type); ?>
Completed: completed_at); ?>
Records: records_processed); ?> processed

No sync completed yet.

Rate Limits

Hourly /
Daily /
Data This Hour
plugin->get_api_client(); $result = $api_client->test_connection(); if ($result['success']) { wp_send_json_success($result); } else { wp_send_json_error($result['error']); } } /** * AJAX: Run sync */ public function ajax_run_sync() { check_ajax_referer('mls_admin', '_wpnonce'); if (!current_user_can('manage_options')) { wp_send_json_error('Permission denied'); } $sync_type = isset($_POST['sync_type']) ? sanitize_text_field($_POST['sync_type']) : 'incremental'; $sync_engine = $this->plugin->get_sync_engine(); // Run sync with a reasonable limit for AJAX if ($sync_type === 'full') { $result = $sync_engine->run_full_sync(false, 500); } else { $result = $sync_engine->run_incremental_sync(false); } if ($result['success']) { wp_send_json_success(array( 'message' => sprintf( '%d processed, %d created, %d updated', $result['stats']['processed'], $result['stats']['created'], $result['stats']['updated'] ), 'stats' => $result['stats'], )); } else { wp_send_json_error($result['error']); } } }