364 lines
11 KiB
Markdown
364 lines
11 KiB
Markdown
# 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=wordpress` filter 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_synced` to 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_url` to structure data
|
|
- Added `wordpress_version` to 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
|
|
|
|
1. **Backend Ready**
|
|
```bash
|
|
# Ensure backend is running and migrations are current
|
|
docker-compose restart backend
|
|
docker exec igny8_backend python manage.py migrate
|
|
```
|
|
|
|
2. **Enable Debug Logging** (Optional but recommended)
|
|
```php
|
|
// In wp-config.php, add:
|
|
define('WP_DEBUG', true);
|
|
define('WP_DEBUG_LOG', true);
|
|
define('IGNY8_DEBUG', true);
|
|
```
|
|
|
|
3. **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
|
|
|
|
4. **Check WordPress Debug Log**
|
|
```bash
|
|
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}.
|
|
```
|
|
|
|
5. **Verify Backend Storage**
|
|
```bash
|
|
docker exec -it igny8_backend python manage.py shell
|
|
```
|
|
|
|
```python
|
|
from 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': {...}, ...}
|
|
```
|
|
|
|
6. **Check Frontend Display**
|
|
- Navigate to: `Site Settings → Content Types` tab
|
|
- 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
|
|
|
|
---
|
|
|
|
## 🔧 Manual Testing via API
|
|
|
|
### Step 1: Get Integration ID
|
|
```bash
|
|
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)
|
|
```bash
|
|
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
|
|
```bash
|
|
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**:
|
|
```bash
|
|
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**:
|
|
```python
|
|
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**:
|
|
```python
|
|
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**:
|
|
```bash
|
|
# Check API response
|
|
curl -H "Authorization: Bearer {KEY}" \
|
|
https://api.igny8.com/api/v1/integration/integrations/{ID}/content-types/
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 Files Modified
|
|
|
|
1. **`includes/functions.php`**
|
|
- Enhanced `igny8_sync_site_structure_to_backend()` with:
|
|
- Better response format handling
|
|
- Platform filter
|
|
- Enhanced error logging
|
|
- Added `site_url` and `wordpress_version` to structure
|
|
|
|
2. **`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
|
|
|
|
3. **`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
|
|
|
|
---
|
|
|
|
## 🔄 Next Steps for Developers
|
|
|
|
### To Enable Cron-based Daily Sync
|
|
The daily structure sync is already registered in `sync/hooks.php`:
|
|
```php
|
|
add_action('igny8_sync_site_structure', 'igny8_sync_site_structure_to_backend');
|
|
```
|
|
|
|
This runs daily automatically. To verify:
|
|
```bash
|
|
# 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:
|
|
```javascript
|
|
jQuery.post(igny8Admin.ajaxUrl, {
|
|
action: 'igny8_sync_site_structure',
|
|
nonce: igny8Admin.nonce
|
|
});
|
|
```
|
|
|
|
### To Monitor Sync Health
|
|
```python
|
|
# 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:
|
|
1. WordPress debug log: `wp-content/debug.log`
|
|
2. Backend logs: `docker logs igny8_backend`
|
|
3. Database: `SiteIntegration.config_json`
|
|
4. Frontend console: Browser dev tools
|
|
|
|
---
|
|
|
|
_Last Updated: November 22, 2025_
|
|
_Status: ✅ READY FOR DEPLOYMENT_
|
|
|