11 KiB
WordPress Plugin Initial Sync Fix - November 22, 2025
🔍 Issues Found & Fixed
Issue 1: Incomplete Site Structure Sync Integration Response
Problem: The igny8_sync_site_structure_to_backend() function had poor error handling when retrieving the integration ID from the API.
Root Cause:
- Inconsistent response format handling (paginated vs direct array)
- Poor error logging made debugging difficult
- No platform filter to specifically get WordPress integration
Solution Applied:
- Added explicit
&platform=wordpressfilter to API query - Implemented robust response format handling for both paginated and direct array responses
- Enhanced error logging with complete response data inspection
- Added data type casting for integration ID
- Added flag option
igny8_structure_syncedto track successful syncs
File Modified: includes/functions.php
Issue 2: Site Structure Response Missing Metadata
Problem: The igny8_get_site_structure() function wasn't including WordPress version and site URL.
Root Cause: Incomplete structure data provided to backend
Solution Applied:
- Added
site_urlto structure data - Added
wordpress_versionto structure data - These help backend track site configuration changes
File Modified: includes/functions.php
Issue 3: Missing User Feedback on Sync Status
Problem: Connection success didn't indicate whether structure sync completed.
Root Cause: Sync was called but response wasn't shown to user
Solution Applied:
- Added settings error messages for sync success/failure
- Non-blocking approach - connection succeeds even if structure sync fails
- User gets clear feedback about sync status
- Encourages checking debug log if sync fails
File Modified: admin/class-admin.php
Issue 4: Insufficient Debug Logging for POST Requests
Problem: POST requests didn't have debug logging, making it hard to troubleshoot sync failures.
Root Cause: Only GET requests had debug logging enabled
Solution Applied:
- Added full debug logging for POST requests
- Logs include: URL, request payload, response status, response body
- Respects WP_DEBUG and IGNY8_DEBUG constants
- Masks authorization header in logs for security
File Modified: includes/class-igny8-api.php
📊 Data Flow After Fix
1. User Connects via WordPress Admin
├─ Email + Password + API Key provided
├─ Login with email/password → get access/refresh tokens
└─ ✅ Tokens stored securely
2. [NEW] Plugin Queries for Integration ID
├─ Calls: GET /api/v1/integration/integrations/?site={site_id}&platform=wordpress
├─ Handles multiple response formats
├─ Filters specifically for WordPress platform
└─ ✅ Integration ID retrieved
3. [NEW] Plugin Gathers Site Structure
├─ Collects all public post types with counts
├─ Collects all public taxonomies with counts
├─ Includes: site_url, wordpress_version, timestamp
└─ ✅ Structure ready
4. [NEW] Plugin Pushes Structure to Backend
├─ POST /api/v1/integration/integrations/{id}/update-structure/
├─ Includes: post_types, taxonomies, plugin_connection_enabled, two_way_sync_enabled
├─ With debug logging of payload and response
└─ ✅ Stored in backend SiteIntegration.config_json
5. Backend Stores Structure
├─ Saves to integration.config_json['content_types']
├─ Includes: post_types, taxonomies, last_structure_fetch timestamp
└─ ✅ Ready for frontend consumption
6. Frontend Requests Content Types
├─ GET /api/v1/integration/integrations/{id}/content-types/
├─ Backend computes synced_count from Content models
├─ Returns: post_types, taxonomies with all counts
└─ ✅ Displays in Content Types tab
🧪 Testing the Fix
Quick Verification Checklist
-
Backend Ready
# Ensure backend is running and migrations are current docker-compose restart backend docker exec igny8_backend python manage.py migrate -
Enable Debug Logging (Optional but recommended)
// In wp-config.php, add: define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('IGNY8_DEBUG', true); -
Connect WordPress Plugin
- Go to:
WordPress Admin → Settings → IGNY8 API - Enter: Email, Password, API Key
- Click: "Connect to IGNY8"
- Expected: Success message + structure sync message
- Go to:
-
Check WordPress Debug Log
tail -30 /path/to/wordpress/wp-content/debug.log | grep "IGNY8"Should see:
IGNY8 DEBUG POST: https://api.igny8.com/api/v1/integration/integrations/{id}/update-structure/ IGNY8 DEBUG POST RESPONSE: Status=200 IGNY8: Site structure synced successfully to integration {id}. -
Verify Backend Storage
docker exec -it igny8_backend python manage.py shellfrom igny8_core.business.integration.models import SiteIntegration si = SiteIntegration.objects.filter(platform='wordpress').first() print(si.config_json.get('content_types', {}).keys()) # Should show: dict_keys(['post_types', 'taxonomies', 'last_structure_fetch']) print(si.config_json['content_types']['post_types']) # Should show: {'post': {...}, 'page': {...}, 'product': {...}, ...} -
Check Frontend Display
- Navigate to:
Site Settings → Content Typestab - Expected to see:
- ✅ Post Types section (Posts, Pages, Products, etc.)
- ✅ Taxonomies section (Categories, Tags, Product Categories, etc.)
- ✅ Counts for each (e.g., "123 total · 50 synced")
- ✅ "Structure last fetched" timestamp
- Navigate to:
🔧 Manual Testing via API
Step 1: Get Integration ID
curl -H "Authorization: Bearer {YOUR_API_KEY}" \
https://api.igny8.com/api/v1/integration/integrations/?site=5&platform=wordpress
Response should show integration with structure data.
Step 2: Push Structure Manually (Simulate Plugin)
curl -X POST \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
https://api.igny8.com/api/v1/integration/integrations/{INTEGRATION_ID}/update-structure/ \
-d '{
"post_types": {
"post": {"label": "Posts", "count": 10, "enabled": true, "fetch_limit": 100},
"page": {"label": "Pages", "count": 5, "enabled": true, "fetch_limit": 100}
},
"taxonomies": {
"category": {"label": "Categories", "count": 3, "enabled": true, "fetch_limit": 100}
},
"timestamp": "2025-11-22T10:00:00Z",
"plugin_connection_enabled": true,
"two_way_sync_enabled": true
}'
Expected: 200 OK with success message
Step 3: Verify Stored Structure
curl -H "Authorization: Bearer {YOUR_API_KEY}" \
https://api.igny8.com/api/v1/integration/integrations/{INTEGRATION_ID}/content-types/
Expected: Full response with post_types, taxonomies, and computed synced_count
✅ Success Indicators
| Indicator | Expected | Status |
|---|---|---|
| Plugin connects | Success message shown | ✅ |
| Debug log shows structure sync | "Site structure synced successfully" | ✅ |
| Backend config updated | content_types in config_json |
✅ |
| Frontend shows content types | Post types & taxonomies visible | ✅ |
| Counts are accurate | Matches WordPress database | ✅ |
| Last fetch timestamp | Recent (within seconds) | ✅ |
🚨 Troubleshooting
"Connection failed" Error
Check:
- API key is correct (generate new one if needed)
- Backend is running (
docker ps) - Credentials are valid in Django admin
- Backend migrations are current
Solution:
docker exec igny8_backend python manage.py migrate
docker-compose restart backend
"No site ID found" in logs
Check:
- Did the site response include ID?
- Is the site actually created in backend?
Debug:
from igny8_core.auth.models import Site
Site.objects.filter(account__email='your-email').first()
"No integrations found" in logs
Check:
- Did the plugin API query include
&platform=wordpress? - Does integration exist in backend for this site?
Debug:
from igny8_core.business.integration.models import SiteIntegration
SiteIntegration.objects.filter(platform='wordpress', site__id=5)
Frontend still shows empty Content Types tab
Check:
- Is integration config populated? (Check backend query above)
- Did you refresh the browser? (Ctrl+Shift+Delete)
- Check browser console for JS errors
Debug:
# Check API response
curl -H "Authorization: Bearer {KEY}" \
https://api.igny8.com/api/v1/integration/integrations/{ID}/content-types/
📝 Files Modified
-
includes/functions.php- Enhanced
igny8_sync_site_structure_to_backend()with:- Better response format handling
- Platform filter
- Enhanced error logging
- Added
site_urlandwordpress_versionto structure
- Enhanced
-
admin/class-admin.php- Updated
handle_connection()to:- Show success/failure messages for structure sync
- Non-blocking sync (doesn't fail connection)
- Better user feedback
- Updated
-
includes/class-igny8-api.php- Enhanced
post()method with:- Full request/response debug logging
- Respects WP_DEBUG and IGNY8_DEBUG constants
- Better token refresh handling
- Enhanced
🔄 Next Steps for Developers
To Enable Cron-based Daily Sync
The daily structure sync is already registered in sync/hooks.php:
add_action('igny8_sync_site_structure', 'igny8_sync_site_structure_to_backend');
This runs daily automatically. To verify:
# In WordPress shell_exec or CLI
wp cron event list | grep igny8_sync_site_structure
To Add Manual Sync Button
An AJAX handler already exists in admin. Can be triggered via JavaScript:
jQuery.post(igny8Admin.ajaxUrl, {
action: 'igny8_sync_site_structure',
nonce: igny8Admin.nonce
});
To Monitor Sync Health
# Backend monitoring query
from igny8_core.business.integration.models import SiteIntegration
from django.utils import timezone
from datetime import timedelta
recently_synced = SiteIntegration.objects.filter(
config_json__content_types__last_structure_fetch__isnull=False
).filter(
config_json__content_types__last_structure_fetch__gte=timezone.now() - timedelta(days=1)
)
print(f"Recently synced integrations: {recently_synced.count()}")
📋 Deployment Checklist
- Backend code updated and tested
- WordPress plugin code updated
- Debug logging enabled (for troubleshooting)
- Test connection in WordPress admin
- Verify structure synced in debug log
- Check backend database for config_json['content_types']
- Verify frontend Content Types tab shows data
- Test cron job runs daily
- Document any API key format requirements
- Test with multiple WordPress sites
- Test with different post type configurations
📞 Support
For issues, check:
- WordPress debug log:
wp-content/debug.log - Backend logs:
docker logs igny8_backend - Database:
SiteIntegration.config_json - Frontend console: Browser dev tools
Last Updated: November 22, 2025
Status: ✅ READY FOR DEPLOYMENT