- Added a new API endpoint in the `IntegrationViewSet` to update the WordPress site structure, including post types and taxonomies. - Implemented a function to retrieve the site structure and sync it to the IGNY8 backend after establishing a connection. - Scheduled a daily cron job to keep the site structure updated. - Enhanced the WordPress plugin to trigger synchronization upon successful API connection. - Updated relevant files to support the new synchronization feature, improving integration capabilities.
237 lines
5.9 KiB
Markdown
237 lines
5.9 KiB
Markdown
# WordPress Plugin Sync Fix - Executive Summary
|
|
|
|
## 🎯 The Issue
|
|
|
|
The WordPress plugin was connecting to IGNY8 successfully, but the **Content Types tab remained empty** because the plugin never told the backend about the WordPress site's structure (post types, taxonomies).
|
|
|
|
```
|
|
🔗 Plugin connects ✅
|
|
📝 Test passes ✅
|
|
📊 Content Types tab ❌ EMPTY
|
|
```
|
|
|
|
**Root Cause**: The backend endpoint that retrieves content types was looking for data that the plugin never sent.
|
|
|
|
---
|
|
|
|
## 🔧 The Fix - 3 Parts
|
|
|
|
### Part 1: Backend Endpoint (New)
|
|
**File**: `backend/igny8_core/modules/integration/views.py`
|
|
|
|
Added new endpoint that accepts site structure from WordPress plugin:
|
|
```
|
|
POST /api/v1/integration/integrations/{id}/update-structure/
|
|
```
|
|
- Stores post types, taxonomies, and counts
|
|
- Saves to `integration.config_json['content_types']`
|
|
- Timestamps the update
|
|
|
|
### Part 2: Plugin Function (New)
|
|
**File**: `igny8-wp-plugin/includes/functions.php`
|
|
|
|
Added `igny8_sync_site_structure_to_backend()`:
|
|
- Gathers WordPress post types and taxonomies
|
|
- Counts items in each
|
|
- Sends to backend endpoint
|
|
- Handles errors gracefully
|
|
|
|
### Part 3: Integration Hook (Updated)
|
|
**File**: `igny8-wp-plugin/admin/class-admin.php`
|
|
|
|
After successful connection:
|
|
- Calls structure sync function
|
|
- Updates happen immediately after connection
|
|
- Also scheduled as daily cron job
|
|
|
|
---
|
|
|
|
## 📊 What Changed
|
|
|
|
### Before (Broken)
|
|
```
|
|
WordPress Plugin ──[Connects]──→ IGNY8 Backend
|
|
──[But never sends structure]→
|
|
|
|
Frontend Content Types Tab: EMPTY ❌
|
|
```
|
|
|
|
### After (Fixed)
|
|
```
|
|
WordPress Plugin ──[Connects]──→ IGNY8 Backend
|
|
──[Sends structure]→ ✅
|
|
──[Daily sync]→ ✅
|
|
|
|
Frontend Content Types Tab: Shows all post types & taxonomies ✅
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 What's Now Working
|
|
|
|
| Feature | Before | After |
|
|
|---------|--------|-------|
|
|
| Plugin connection | ✅ | ✅ |
|
|
| API key auth | ✅ | ✅ |
|
|
| Test connection | ✅ | ✅ |
|
|
| Send structure | ❌ | ✅ |
|
|
| Content Types tab | Empty | **Shows data** |
|
|
| Sync counts | N/A | **Live updates** |
|
|
| Daily updates | N/A | **Active** |
|
|
|
|
---
|
|
|
|
## 📋 Implementation Details
|
|
|
|
### Endpoint: `POST /api/v1/integration/integrations/{id}/update-structure/`
|
|
|
|
**What it does**:
|
|
- Receives post types and taxonomies from WordPress
|
|
- Stores in `SiteIntegration.config_json`
|
|
- Timestamps the fetch
|
|
|
|
**Called by**:
|
|
- Plugin immediately after connection
|
|
- Plugin daily via cron job
|
|
|
|
**Example payload**:
|
|
```json
|
|
{
|
|
"post_types": {
|
|
"post": {"label": "Posts", "count": 123, "enabled": true},
|
|
"page": {"label": "Pages", "count": 45, "enabled": true},
|
|
"product": {"label": "Products", "count": 67, "enabled": false}
|
|
},
|
|
"taxonomies": {
|
|
"category": {"label": "Categories", "count": 12, "enabled": true},
|
|
"post_tag": {"label": "Tags", "count": 89, "enabled": true}
|
|
},
|
|
"plugin_connection_enabled": true,
|
|
"two_way_sync_enabled": true
|
|
}
|
|
```
|
|
|
|
### Plugin Functions: `includes/functions.php`
|
|
|
|
**`igny8_get_site_structure()`**:
|
|
- Retrieves all public post types
|
|
- Counts posts in each type
|
|
- Retrieves all public taxonomies
|
|
- Counts terms in each taxonomy
|
|
- Returns structured array
|
|
|
|
**`igny8_sync_site_structure_to_backend()`**:
|
|
- Calls `igny8_get_site_structure()`
|
|
- Finds integration ID
|
|
- Sends to backend via `update-structure` endpoint
|
|
- Logs success/failure
|
|
|
|
### Cron Job: Daily Structure Sync
|
|
|
|
- Scheduled during plugin activation
|
|
- Runs daily to keep counts up-to-date
|
|
- Non-blocking (handles failures gracefully)
|
|
- Can be triggered manually in WordPress WP-Cron
|
|
|
|
---
|
|
|
|
## ✅ Verification Steps
|
|
|
|
### 1. Backend Ready
|
|
```bash
|
|
docker-compose restart backend
|
|
```
|
|
|
|
### 2. Test Connection
|
|
WordPress Admin → Settings → IGNY8 API → Connect
|
|
|
|
### 3. Verify in Backend
|
|
```bash
|
|
docker exec igny8_backend python manage.py shell
|
|
|
|
from igny8_core.business.integration.models import SiteIntegration
|
|
si = SiteIntegration.objects.get(platform='wordpress')
|
|
print(si.config_json) # Should show content_types
|
|
```
|
|
|
|
### 4. Check Frontend
|
|
Navigate to: Site Settings → Content Types tab
|
|
- Should see: Post Types (Posts, Pages, Products)
|
|
- Should see: Taxonomies (Categories, Tags, etc.)
|
|
- Should see: Counts and sync status
|
|
|
|
---
|
|
|
|
## 🔄 Data Flow (Complete)
|
|
|
|
```
|
|
1. WordPress User Connects
|
|
├─ Email + Password + API Key
|
|
└─ ✅ Successful
|
|
|
|
2. [NEW] Plugin Pushes Structure
|
|
├─ Gathers post types & taxonomies
|
|
├─ Sends to update-structure endpoint
|
|
└─ ✅ Stored in backend
|
|
|
|
3. Frontend Requests Content Types
|
|
├─ Reads from stored structure
|
|
├─ Counts synced content
|
|
└─ ✅ Displays in Content Types tab
|
|
|
|
4. [NEW] Daily Cron Job
|
|
├─ Re-syncs structure daily
|
|
├─ Keeps counts current
|
|
└─ ✅ Running in background
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 Key Changes Summary
|
|
|
|
| File | Change | Reason |
|
|
|------|--------|--------|
|
|
| `views.py` | Added `update_site_structure()` action | Accept structure from plugin |
|
|
| `class-admin.php` | Call sync after connection | Push structure on connect |
|
|
| `functions.php` | Added structure functions | Gather & send site info |
|
|
| `sync/hooks.php` | Added cron hook | Daily periodic sync |
|
|
|
|
---
|
|
|
|
## 🔐 Security
|
|
|
|
- ✅ Endpoint requires authentication
|
|
- ✅ Site-level access control
|
|
- ✅ Only active sites can push
|
|
- ✅ API key authentication used
|
|
- ✅ Secure option storage for credentials
|
|
|
|
---
|
|
|
|
## 📞 Testing
|
|
|
|
See: `QUICK-SYNC-TEST.md` for complete testing guide
|
|
|
|
Quick test:
|
|
1. Connect plugin
|
|
2. Check WordPress logs for "Site structure synced successfully"
|
|
3. Go to Site Settings → Content Types tab
|
|
4. Should see post types and taxonomies with counts
|
|
|
|
---
|
|
|
|
## 🎊 Result
|
|
|
|
✅ **WordPress plugin now syncs bidirectionally with IGNY8 backend**
|
|
|
|
- Content Types tab displays WordPress post types and taxonomies
|
|
- Counts are accurate and update daily
|
|
- Full data structure available for sync operations
|
|
- Two-way sync can now proceed with complete information
|
|
|
|
---
|
|
|
|
_Fix implemented: November 22, 2025_
|
|
_Status: 🟢 READY FOR TESTING_
|
|
|