Files
igny8/igny8-wp-plugin/SYNC-FIX-REPORT.md
alorig 3b3be535d6 1
2025-11-22 14:34:28 +05:00

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=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

    # 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)

    // 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

    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

    docker exec -it igny8_backend python manage.py shell
    
    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

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

  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:

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:

  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