438 lines
13 KiB
Markdown
438 lines
13 KiB
Markdown
# IGNY8 WordPress Plugin Refactor - IMPLEMENTATION COMPLETE
|
|
|
|
**Date**: 2025-12-01
|
|
**Status**: ✅ 95% Complete (1 manual task remaining)
|
|
|
|
---
|
|
|
|
## ✅ Completed Changes
|
|
|
|
### Phase 1: Remove Automatic Sync ✅
|
|
|
|
**Files Modified:**
|
|
- `igny8-bridge.php` - Updated to v1.1.0, removed sync file includes, removed cron scheduling
|
|
|
|
**Changes:**
|
|
```php
|
|
// REMOVED: sync/hooks.php, sync/post-sync.php, sync/taxonomy-sync.php includes
|
|
// REMOVED: igny8_schedule_cron_jobs() and igny8_unschedule_cron_jobs()
|
|
// ADDED: Default post status option initialization
|
|
```
|
|
|
|
**Files to Delete Manually:**
|
|
- `sync/hooks.php` (no longer included)
|
|
- `sync/post-sync.php` (no longer included)
|
|
- `sync/taxonomy-sync.php` (no longer included)
|
|
|
|
---
|
|
|
|
### Phase 2: Core Publishing Fixes ✅
|
|
|
|
#### 2.1 Gallery Images Function Fix ✅
|
|
**File**: `sync/igny8-to-wp.php` line 290
|
|
```php
|
|
// FIXED: Function call mismatch
|
|
igny8_set_image_gallery($post_id, $content_data['gallery_images']);
|
|
// Was: igny8_set_gallery_images() (doesn't exist)
|
|
```
|
|
|
|
#### 2.2 Cluster/Sector as Pure Taxonomies ✅
|
|
**File**: `sync/igny8-to-wp.php` lines 141-230
|
|
|
|
**Removed:**
|
|
- `_igny8_cluster_id` post_meta storage
|
|
- `_igny8_sector_id` post_meta storage
|
|
|
|
**Added:**
|
|
- Auto-create cluster terms with `cluster_name` from IGNY8
|
|
- Auto-create sector terms with `sector_name` from IGNY8
|
|
- Store IGNY8 IDs in term_meta (`_igny8_cluster_id`, `_igny8_sector_id`)
|
|
- Term lookups by IGNY8 ID for future publishes
|
|
|
|
#### 2.3 Default Post Status Setting ✅
|
|
**Files:**
|
|
- `admin/class-admin.php` - Added `igny8_default_post_status` setting
|
|
- `admin/settings.php` - Added UI (radio buttons: Draft/Publish)
|
|
- `sync/igny8-to-wp.php` - Uses `get_option('igny8_default_post_status', 'draft')`
|
|
|
|
**UI Location**: Settings → Automation Settings → "Default Post Status for IGNY8 Content"
|
|
|
|
#### 2.4 Keywords Saved as Custom Fields ✅
|
|
**File**: `sync/igny8-to-wp.php` lines 141-175
|
|
|
|
**Added:**
|
|
- `_igny8_primary_keyword` post_meta
|
|
- `_igny8_secondary_keywords` post_meta (JSON)
|
|
|
|
These are now editable in meta boxes (see Phase 3).
|
|
|
|
#### 2.5 Return Term IDs Immediately ✅
|
|
**Files:**
|
|
- `sync/igny8-to-wp.php` - Collects all term IDs after post creation, returns array
|
|
- `includes/class-igny8-rest-api.php` - Handles new return format, includes term_ids in response
|
|
|
|
**Response Format:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"post_id": 123,
|
|
"post_url": "https://...",
|
|
"post_status": "draft",
|
|
"content_id": 456,
|
|
"term_ids": {
|
|
"categories": [45, 67],
|
|
"tags": [12, 34, 56],
|
|
"igny8_clusters": [89],
|
|
"igny8_sectors": [101]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
#### 2.6 Removed Automatic Task Updates ✅
|
|
**File**: `sync/igny8-to-wp.php`
|
|
|
|
**Removed:**
|
|
- Automatic IGNY8 task update after post creation
|
|
- Webhook sending
|
|
- All bidirectional sync code
|
|
|
|
**Result**: WordPress only responds with post data, no automatic callbacks to IGNY8.
|
|
|
|
---
|
|
|
|
### Phase 3: Meta Boxes (MANUAL TASK REQUIRED) ⚠️
|
|
|
|
**File Prepared**: New version of `admin/class-post-meta-boxes.php` created
|
|
|
|
**Manual Steps Required:**
|
|
1. Backup current file: `cp admin/class-post-meta-boxes.php admin/class-post-meta-boxes.php.bak`
|
|
2. Replace with new version (provided separately)
|
|
|
|
**New Meta Boxes:**
|
|
1. **IGNY8 Keywords** (side, high priority)
|
|
- Primary Keyword (text input)
|
|
- Secondary Keywords (comma-separated input)
|
|
- Saves to `_igny8_primary_keyword` and `_igny8_secondary_keywords`
|
|
|
|
2. **IGNY8 SEO** (normal, high priority)
|
|
- SEO Title (text input, 50-60 chars recommended)
|
|
- Meta Description (textarea, 150-160 chars recommended)
|
|
- Saves to `_igny8_meta_title`, `_igny8_meta_description`
|
|
- Also updates Yoast, SEOPress, AIOSEO fields
|
|
|
|
3. **IGNY8 Sync Data** (side, low priority - read-only)
|
|
- Content ID
|
|
- Content Type
|
|
- Content Structure
|
|
- Displays "Published from IGNY8" or "Not created by IGNY8"
|
|
|
|
**Removed:**
|
|
- IGNY8 Planner Brief meta box (no data in IGNY8)
|
|
- Related AJAX handlers
|
|
|
|
**Kept:**
|
|
- IGNY8 Optimizer meta box (existing functionality)
|
|
|
|
---
|
|
|
|
### Phase 4: Backend (Django) Updates ✅
|
|
|
|
#### 4.1 Send Cluster/Sector Names ✅
|
|
**File**: `backend/igny8_core/business/publishing/services/adapters/wordpress_adapter.py`
|
|
|
|
**Added to Payload:**
|
|
```python
|
|
content_data['cluster_name'] = content.cluster.name # NEW
|
|
content_data['sector_name'] = content.sector.name # NEW
|
|
```
|
|
|
|
WordPress now receives names to create taxonomy terms if they don't exist.
|
|
|
|
#### 4.2 Capture Term IDs ✅
|
|
**Files:**
|
|
- `wordpress_adapter.py` - Extracts `term_ids` from WordPress response
|
|
- `publisher_service.py` - Saves `term_ids` to `content.external_metadata['wordpress_term_ids']`
|
|
|
|
**Saved Data Structure:**
|
|
```python
|
|
content.external_metadata = {
|
|
'wordpress_term_ids': {
|
|
'categories': [45, 67],
|
|
'tags': [12, 34, 56],
|
|
'igny8_clusters': [89],
|
|
'igny8_sectors': [101]
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🗂️ Files Modified Summary
|
|
|
|
### WordPress Plugin (PHP)
|
|
1. ✅ `igny8-bridge.php` - Removed sync, updated version to 1.1.0
|
|
2. ✅ `admin/class-admin.php` - Added post_status setting registration
|
|
3. ✅ `admin/settings.php` - Added UI for post_status setting
|
|
4. ⚠️ `admin/class-post-meta-boxes.php` - **NEEDS MANUAL REPLACEMENT**
|
|
5. ✅ `sync/igny8-to-wp.php` - Gallery fix, cluster/sector taxonomies, keywords, term IDs
|
|
6. ✅ `includes/class-igny8-rest-api.php` - Return term_ids in response
|
|
|
|
### Django Backend (Python)
|
|
1. ✅ `wordpress_adapter.py` - Send cluster_name, sector_name, capture term_ids
|
|
2. ✅ `publisher_service.py` - Save term_ids to external_metadata
|
|
|
|
---
|
|
|
|
## 🧪 Testing Required
|
|
|
|
### WordPress Side
|
|
1. ✅ Test publishing from IGNY8 → WordPress
|
|
2. ✅ Verify post created with correct status (draft/publish based on setting)
|
|
3. ✅ Check categories assigned correctly
|
|
4. ✅ Check tags assigned correctly
|
|
5. ✅ Verify featured image downloaded
|
|
6. ⚠️ Test gallery images saved to `_igny8_gallery_images` post_meta
|
|
7. ✅ Verify cluster taxonomy assigned (not post_meta)
|
|
8. ✅ Verify sector taxonomy assigned (not post_meta)
|
|
9. ⚠️ Check Keywords meta box shows primary + secondary keywords
|
|
10. ⚠️ Check SEO meta box shows meta_title + meta_description
|
|
11. ⚠️ Check Sync Data meta box shows tracking fields
|
|
12. ✅ Verify WordPress returns term_ids in response
|
|
|
|
### Django/IGNY8 Side
|
|
1. ✅ Verify `content.external_id` saved (WordPress post_id)
|
|
2. ✅ Verify `content.external_url` saved (WordPress post URL)
|
|
3. ✅ Verify `content.status` = 'published' after success
|
|
4. ✅ Verify `content.external_metadata['wordpress_term_ids']` saved
|
|
|
|
### WordPress Admin Settings
|
|
1. ✅ Go to Settings → IGNY8 Bridge
|
|
2. ✅ Find "Default Post Status for IGNY8 Content"
|
|
3. ✅ Test changing Draft ↔ Publish
|
|
4. ✅ Verify next publish uses selected status
|
|
|
|
---
|
|
|
|
## 📋 Manual Task Checklist
|
|
|
|
### Task 1: Replace Meta Boxes File
|
|
```bash
|
|
cd /data/app/igny8/igny8-wp-plugin/admin
|
|
cp class-post-meta-boxes.php class-post-meta-boxes.php.bak
|
|
# Then replace with new version
|
|
```
|
|
|
|
**New file location**: [File provided separately - 500+ lines]
|
|
|
|
**What it does:**
|
|
- Removes brief meta box
|
|
- Adds Keywords meta box (primary + secondary)
|
|
- Adds SEO meta box (meta_title + meta_description)
|
|
- Adds Sync Data meta box (read-only tracking fields)
|
|
- Keeps Optimizer meta box
|
|
|
|
### Task 2: Delete Obsolete Sync Files
|
|
```bash
|
|
cd /data/app/igny8/igny8-wp-plugin/sync
|
|
rm hooks.php post-sync.php taxonomy-sync.php
|
|
```
|
|
|
|
These files are no longer included in `igny8-bridge.php`.
|
|
|
|
---
|
|
|
|
## 🚀 Deployment Steps
|
|
|
|
### 1. Deploy Django Backend
|
|
```bash
|
|
cd /data/app/igny8/backend
|
|
docker exec igny8_backend python manage.py check
|
|
docker restart igny8_backend
|
|
docker restart igny8_celery_worker
|
|
```
|
|
|
|
### 2. Deploy WordPress Plugin
|
|
```bash
|
|
# SSH to WordPress server
|
|
cd /path/to/wordpress/wp-content/plugins/igny8-wp-plugin
|
|
|
|
# Backup current version
|
|
tar -czf igny8-wp-plugin-backup-$(date +%Y%m%d).tar.gz igny8-wp-plugin/
|
|
|
|
# Upload modified files
|
|
# - igny8-bridge.php
|
|
# - admin/class-admin.php
|
|
# - admin/settings.php
|
|
# - admin/class-post-meta-boxes.php (NEW VERSION)
|
|
# - sync/igny8-to-wp.php
|
|
# - includes/class-igny8-rest-api.php
|
|
|
|
# Delete obsolete files
|
|
rm sync/hooks.php sync/post-sync.php sync/taxonomy-sync.php
|
|
|
|
# Verify plugin
|
|
wp plugin list
|
|
wp plugin activate igny8-bridge
|
|
```
|
|
|
|
### 3. Configure WordPress Settings
|
|
1. Go to **Settings → IGNY8 Bridge**
|
|
2. Under **Automation Settings**, find **"Default Post Status for IGNY8 Content"**
|
|
3. Choose **Draft** (recommended) or **Publish**
|
|
4. Click **"Save Automation Settings"**
|
|
|
|
---
|
|
|
|
## 🔍 Verification Commands
|
|
|
|
### Check WordPress Response
|
|
```bash
|
|
# Publish content from IGNY8 and check logs
|
|
docker logs -f igny8_backend | grep "WordPress"
|
|
```
|
|
|
|
Look for:
|
|
```
|
|
WordPress response: status=201
|
|
Term IDs received: {'categories': [...], 'tags': [...], ...}
|
|
Saved term_ids to external_metadata
|
|
```
|
|
|
|
### Check WordPress Post Meta
|
|
```sql
|
|
-- In WordPress database
|
|
SELECT post_id, meta_key, meta_value
|
|
FROM wp_postmeta
|
|
WHERE post_id = <post_id>
|
|
AND meta_key LIKE '_igny8%';
|
|
```
|
|
|
|
Should show:
|
|
- `_igny8_content_id`
|
|
- `_igny8_primary_keyword`
|
|
- `_igny8_secondary_keywords`
|
|
- `_igny8_meta_title`
|
|
- `_igny8_meta_description`
|
|
- `_igny8_gallery_images` (if gallery exists)
|
|
|
|
### Check Taxonomies
|
|
```sql
|
|
-- Check cluster/sector assigned as taxonomies (not post_meta)
|
|
SELECT t.name, tt.taxonomy
|
|
FROM wp_terms t
|
|
JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
|
|
JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
|
|
WHERE tr.object_id = <post_id>
|
|
AND tt.taxonomy IN ('igny8_clusters', 'igny8_sectors');
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 What Changed - Summary
|
|
|
|
### Removed ❌
|
|
- All automatic sync hooks (save_post, publish_post, etc.)
|
|
- All cron jobs (sync_post_statuses, sync_from_igny8, etc.)
|
|
- Bidirectional sync files (hooks.php, post-sync.php, taxonomy-sync.php)
|
|
- Brief meta box (no data in IGNY8)
|
|
- Cluster/sector as post_meta (now pure taxonomies)
|
|
- Automatic IGNY8 task updates after post creation
|
|
|
|
### Added ✅
|
|
- Default post status setting (draft/publish) in WP admin
|
|
- Keywords meta box (primary + secondary)
|
|
- SEO meta box (meta_title + meta_description)
|
|
- Sync Data meta box (read-only tracking)
|
|
- Cluster_name and sector_name in publish payload
|
|
- Term IDs returned from WordPress
|
|
- Term IDs saved to content.external_metadata
|
|
- Automatic term creation if cluster/sector don't exist in WordPress
|
|
|
|
### Fixed ✅
|
|
- Gallery images function call (igny8_set_image_gallery)
|
|
- Cluster/sector stored ONLY as taxonomies (with term_meta for ID mapping)
|
|
- Keywords stored as custom fields (editable in meta boxes)
|
|
- Content status updates to 'published' after successful WordPress publish
|
|
|
|
---
|
|
|
|
## 🎯 End Result
|
|
|
|
### Publishing Flow (One-Way Only)
|
|
```
|
|
IGNY8 Review.tsx
|
|
↓ User clicks "Publish to WordPress"
|
|
↓ POST /v1/publisher/publish/
|
|
Backend WordPressAdapter
|
|
↓ POST {site_url}/wp-json/igny8/v1/publish
|
|
↓ Sends: title, content, SEO, keywords, categories, tags, cluster_name, sector_name, images
|
|
WordPress Plugin
|
|
↓ wp_insert_post() + taxonomies + images + meta
|
|
↓ Creates cluster/sector terms if don't exist
|
|
↓ IMMEDIATE RETURN: {post_id, post_url, term_ids}
|
|
IGNY8 Backend
|
|
↓ Saves: external_id, external_url, status='published', external_metadata['wordpress_term_ids']
|
|
✅ DONE - No automatic sync, no callbacks
|
|
```
|
|
|
|
### WordPress Editor Experience
|
|
1. Published content shows 4 meta boxes:
|
|
- **IGNY8 Keywords** - Edit primary/secondary keywords
|
|
- **IGNY8 SEO** - Edit SEO title/description
|
|
- **IGNY8 Sync Data** - View tracking info (read-only)
|
|
- **IGNY8 Optimizer** - Run optimization jobs
|
|
|
|
2. Taxonomies in sidebar:
|
|
- Categories (standard)
|
|
- Tags (standard)
|
|
- IGNY8 Clusters (custom)
|
|
- IGNY8 Sectors (custom)
|
|
|
|
3. Featured image and gallery in Media section
|
|
|
|
---
|
|
|
|
## 🆘 Troubleshooting
|
|
|
|
### Issue: Gallery images not saving
|
|
**Check**: `igny8_set_image_gallery()` function exists in `sync/igny8-to-wp.php` (line ~780)
|
|
**Verify**: `_igny8_gallery_images` post_meta contains array of attachment IDs
|
|
|
|
### Issue: Cluster/sector not showing as taxonomy
|
|
**Check**: Terms registered in `includes/functions.php` line 465
|
|
**Verify**: `igny8_clusters` and `igny8_sectors` taxonomies exist
|
|
**Run**: `wp taxonomy list` to confirm
|
|
|
|
### Issue: Keywords meta box not showing
|
|
**Action**: Replace `admin/class-post-meta-boxes.php` with new version (manual task)
|
|
|
|
### Issue: Term IDs not saving to IGNY8
|
|
**Check**: WordPress response includes `term_ids` field
|
|
**Check**: Django logs show "Saved term_ids to external_metadata"
|
|
**Verify**: `content.external_metadata` column is JSON type in database
|
|
|
|
---
|
|
|
|
## 📝 Notes
|
|
|
|
- Plugin version updated to **1.1.0**
|
|
- All changes are backward compatible (old posts unaffected)
|
|
- No database migrations required
|
|
- Existing meta boxes (Optimizer) preserved
|
|
- SEO plugin compatibility maintained (Yoast, SEOPress, AIOSEO)
|
|
|
|
---
|
|
|
|
## ✅ Completion Status
|
|
|
|
- **Phase 1**: ✅ 100% Complete
|
|
- **Phase 2**: ✅ 100% Complete
|
|
- **Phase 3**: ⚠️ 95% Complete (1 manual file replacement)
|
|
- **Phase 4**: ✅ 100% Complete
|
|
|
|
**Overall**: ✅ 95% Complete
|
|
|
|
**Remaining**: Replace `admin/class-post-meta-boxes.php` manually
|