diff --git a/SITE_ID_AND_SYNC_SETTINGS_FIX.md b/SITE_ID_AND_SYNC_SETTINGS_FIX.md new file mode 100644 index 00000000..e85980eb --- /dev/null +++ b/SITE_ID_AND_SYNC_SETTINGS_FIX.md @@ -0,0 +1,318 @@ +# Site ID and Sync Settings Fix + +## Issues Addressed + +### 1. ❌ "Site ID not set" Error in WordPress Plugin +**Problem:** Plugin showed "X Site ID not set" error preventing sync operations + +**Root Cause:** +- Plugin was taking the first site from `/system/sites/` API response +- User has multiple sites (Home & Garden, Salman Sadiq, etc.) +- Wrong site was being selected + +**Solution:** +- Match site by domain name instead of taking first result +- Added fallback to first site if no domain match +- Added manual Site ID input field if auto-detection fails + +### 2. ✅ Taxonomy Selection Impact Verified +**Question:** Does the "Taxonomies to Sync" checkbox selection have actual impact? + +**Answer:** **YES!** The taxonomy selection is fully functional: + +**Code Reference: `data/site-collection.php` (lines 318-325)** +```php +// Get enabled taxonomies from settings +if (function_exists('igny8_get_enabled_taxonomies')) { + $enabled_taxonomies = igny8_get_enabled_taxonomies(); + if (!empty($enabled_taxonomies)) { + $tracked_taxonomies = $enabled_taxonomies; + } +} + +foreach ($tracked_taxonomies as $taxonomy) { + if (!taxonomy_exists($taxonomy)) { + continue; + } + // Only syncs enabled taxonomies +} +``` + +✅ **Only checked taxonomies will be collected and synced** + +**When Selection Matters:** +- ✅ "Collect & Send Site Data" button - respects selections +- ✅ Cron jobs (automatic syncs) - respects selections +- ✅ Manual syncs from WP Admin - respects selections + +### 3. ✅ Post Type Selection Impact Verified +**Question:** Does the "Post Types to Sync" checkbox selection have actual impact? + +**Answer:** **YES!** The post type selection is fully functional: + +**Code Reference: `data/site-collection.php` (lines 302-315)** +```php +foreach ((array) $settings['post_types'] as $post_type) { + if (!post_type_exists($post_type) || !igny8_is_post_type_enabled($post_type)) { + continue; // Skips disabled post types + } + + $posts = igny8_fetch_wordpress_posts($post_type, ...); + // Only fetches enabled post types +} +``` + +✅ **Only checked post types will be collected and synced** + +**When Selection Matters:** +- ✅ "Collect & Send Site Data" button - respects selections +- ✅ Cron jobs (automatic syncs) - respects selections +- ✅ Manual syncs from WP Admin - respects selections + +### 4. ✅ App "Sync Now" Button Impact Verified +**Question:** Does the "Sync Now" button on Content Types page respect plugin settings? + +**Answer:** **PARTIALLY** - It respects integration config, but uses backend-stored settings: + +**How It Works:** +1. Frontend calls: `/v1/integration/integrations/{id}/sync/` +2. Backend reads integration's `config_json.content_types` +3. Syncs based on what's **enabled in the integration record** + +**Important Notes:** +- ✅ The "Sync Now" button syncs FROM WordPress TO IGNY8 +- ✅ It uses the settings stored in the integration config (backend database) +- ⚠️ If you change plugin settings, you need to send site structure first: + - Click "Collect & Send Site Data" in plugin + - This updates the integration config in the backend + - Then "Sync Now" will use the new settings + +**Workflow:** +``` +Plugin Settings Changed + ↓ +Click "Collect & Send Site Data" (updates backend config) + ↓ +Click "Sync Now" in App (uses updated config) + ↓ +Syncs with new settings +``` + +--- + +## Changes Made + +### File 1: `admin/class-admin.php` + +**Change 1: Site ID Detection by Domain** +```php +// Before (line 278-283) +$site_response = $api->get('/system/sites/'); +if ($site_response['success'] && !empty($site_response['results'])) { + $site = $site_response['results'][0]; // Takes first + update_option('igny8_site_id', $site['id']); +} + +// After (line 278-299) +$site_response = $api->get('/system/sites/'); +if ($site_response['success'] && !empty($site_response['results'])) { + $current_site_url = get_site_url(); + $current_domain = parse_url($current_site_url, PHP_URL_HOST); + + // Try to find matching site by domain + $matched_site = null; + foreach ($site_response['results'] as $site) { + if (!empty($site['domain'])) { + $site_domain = parse_url($site['domain'], PHP_URL_HOST); + if ($site_domain === $current_domain) { + $matched_site = $site; + break; + } + } + } + + // Use matched site or fallback to first + if ($matched_site) { + update_option('igny8_site_id', $matched_site['id']); + error_log('IGNY8: Matched site by domain: ' . $matched_site['name']); + } else { + $site = $site_response['results'][0]; + update_option('igny8_site_id', $site['id']); + error_log('IGNY8: No domain match, using first site'); + } +} +``` + +**Change 2: Allow Manual Site ID (line 63-68)** +```php +// Added sanitization for manual site ID entry +register_setting('igny8_settings', 'igny8_site_id', array( + 'type' => 'integer', + 'sanitize_callback' => 'absint' +)); +``` + +### File 2: `admin/settings.php` + +**Change: Manual Site ID Input Field (line 210-232)** +```php + + + + + +

+ +

+ + + + + + + + + +

+ +

+ + + +``` + +--- + +## How to Deploy + +### Step 1: Upload Updated Files to homeg8.com + +Upload these 2 files via FTP/SFTP to `wp-content/plugins/igny8-wp-plugin/`: + +1. ✅ `admin/class-admin.php` (Site ID domain matching) +2. ✅ `admin/settings.php` (Manual Site ID field) + +### Step 2: Reconnect the Plugin + +**Option A: Automatic (Recommended)** +1. Go to **WordPress Admin → Settings → IGNY8 Bridge** +2. Click "Revoke API Key" button +3. Re-enter your email, password, and API key +4. Click "Connect to IGNY8" +5. Plugin should now detect Site ID correctly by matching "homeg8.com" domain + +**Option B: Manual (If Auto-detection Still Fails)** +1. Go to IGNY8 app and find your Site ID: + - Navigate to Sites → Home & Garden Site + - Check the URL: `https://app.igny8.com/sites/5/...` + - Site ID is `5` +2. Go to WordPress Admin → Settings → IGNY8 Bridge +3. Scroll to "Connection Status" section +4. If "Site ID not set", you'll see a manual input field +5. Enter `5` (or your site ID) +6. Click "Save Connection Settings" + +### Step 3: Verify Fix + +1. **Check Site ID:** + - Settings → IGNY8 Bridge + - "Connection Status" section should show "Site ID: 5" + +2. **Test Sync Operations:** + - Should no longer show "X Site ID not set" error + - Click "Collect & Send Site Data" - should work + - Click "Sync Posts to IGNY8" - should work + +3. **Check App Frontend:** + - Go to IGNY8 App → Sites → Home & Garden → Settings → Content Types + - Click "Sync Now" + - Should see content being synced + +--- + +## Testing Checklist + +### Plugin Side (WordPress Admin) +- [ ] Site ID is correctly detected and displayed +- [ ] "Collect & Send Site Data" button works (no Site ID error) +- [ ] "Sync Posts to IGNY8" button works +- [ ] "Sync Taxonomies" button works +- [ ] Taxonomy selections are saved correctly +- [ ] Post type selections are saved correctly +- [ ] Only selected taxonomies are synced +- [ ] Only selected post types are synced + +### App Side (IGNY8 Frontend) +- [ ] Site shows "Connected" status +- [ ] Content Types page shows correct counts +- [ ] "Sync Now" button triggers sync +- [ ] Synced content appears with correct counts +- [ ] Integration test connection succeeds + +--- + +## FAQ + +### Q: What if Site ID is still not detected? +**A:** Use the manual Site ID input: +1. Find your Site ID in the app URL +2. Enter it manually in the plugin settings +3. Save settings + +### Q: Do I need to re-save taxonomy/post type selections? +**A:** No, existing selections are preserved. Only Site ID is affected. + +### Q: Will this affect existing synced content? +**A:** No, existing content is safe. This only fixes the Site ID detection. + +### Q: How do I find my Site ID? +**A:** Check the IGNY8 app URL when viewing your site: +- URL format: `https://app.igny8.com/sites/{SITE_ID}/...` +- Example: `https://app.igny8.com/sites/5/dashboard` → Site ID is `5` + +### Q: Does the "Sync Now" button in the app use my plugin settings immediately? +**A:** Not immediately. You need to: +1. Change settings in plugin +2. Click "Collect & Send Site Data" to update backend +3. Then "Sync Now" will use new settings + +--- + +## Summary + +### ✅ **What's Fixed:** +1. Site ID now correctly detected by domain matching +2. Manual Site ID input available as fallback +3. Better logging for debugging + +### ✅ **What's Confirmed Working:** +1. Taxonomy selection affects sync (only checked taxonomies sync) +2. Post type selection affects sync (only checked post types sync) +3. "Collect & Send Site Data" respects selections +4. "Sync Now" in app uses integration config + +### ⚠️ **Important Workflow:** +``` +Change Plugin Settings + ↓ +Click "Collect & Send Site Data" (updates backend) + ↓ +Click "Sync Now" in App (uses updated settings) +``` + +--- + +## Support + +If issues persist: +1. Check WordPress debug log: `wp-content/debug.log` +2. Check for error: "IGNY8: Matched site by domain: {site_name}" +3. If no match found: "IGNY8: No domain match, using first site" +4. Use manual Site ID input if auto-detection fails + diff --git a/igny8-wp-plugin/admin/class-admin.php b/igny8-wp-plugin/admin/class-admin.php index 2b501a03..1a50b3b8 100644 --- a/igny8-wp-plugin/admin/class-admin.php +++ b/igny8-wp-plugin/admin/class-admin.php @@ -63,7 +63,10 @@ class Igny8Admin { */ public function register_settings() { register_setting('igny8_settings', 'igny8_email'); - register_setting('igny8_settings', 'igny8_site_id'); + register_setting('igny8_settings', 'igny8_site_id', array( + 'type' => 'integer', + 'sanitize_callback' => 'absint' + )); register_setting('igny8_settings', 'igny8_enable_two_way_sync', array( 'type' => 'boolean', 'sanitize_callback' => array($this, 'sanitize_boolean'), @@ -275,11 +278,33 @@ class Igny8Admin { } } - // Try to get site ID (if available) using the authenticated client + // Try to get site ID by matching current site URL $site_response = $api->get('/system/sites/'); if ($site_response['success'] && !empty($site_response['results'])) { - $site = $site_response['results'][0]; - update_option('igny8_site_id', $site['id']); + $current_site_url = get_site_url(); + $current_domain = parse_url($current_site_url, PHP_URL_HOST); + + // Try to find matching site by domain + $matched_site = null; + foreach ($site_response['results'] as $site) { + if (!empty($site['domain'])) { + $site_domain = parse_url($site['domain'], PHP_URL_HOST); + if ($site_domain === $current_domain) { + $matched_site = $site; + break; + } + } + } + + // Fallback to first site if no match found + if ($matched_site) { + update_option('igny8_site_id', $matched_site['id']); + error_log('IGNY8: Matched site by domain: ' . $matched_site['name'] . ' (ID: ' . $matched_site['id'] . ')'); + } else { + $site = $site_response['results'][0]; + update_option('igny8_site_id', $site['id']); + error_log('IGNY8: No domain match, using first site: ' . $site['name'] . ' (ID: ' . $site['id'] . ')'); + } } add_settings_error( diff --git a/igny8-wp-plugin/admin/settings.php b/igny8-wp-plugin/admin/settings.php index cc2063ba..40a2273f 100644 --- a/igny8-wp-plugin/admin/settings.php +++ b/igny8-wp-plugin/admin/settings.php @@ -214,7 +214,30 @@ $webhook_logs = igny8_get_webhook_logs(array('limit' => 10)); - + + +

+ +

+ + + + + + + + + +

+ +

+