13 KiB
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:
// 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
// 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_idpost_meta storage_igny8_sector_idpost_meta storage
Added:
- Auto-create cluster terms with
cluster_namefrom IGNY8 - Auto-create sector terms with
sector_namefrom 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- Addedigny8_default_post_statussettingadmin/settings.php- Added UI (radio buttons: Draft/Publish)sync/igny8-to-wp.php- Usesget_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_keywordpost_meta_igny8_secondary_keywordspost_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 arrayincludes/class-igny8-rest-api.php- Handles new return format, includes term_ids in response
Response Format:
{
"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:
- Backup current file:
cp admin/class-post-meta-boxes.php admin/class-post-meta-boxes.php.bak - Replace with new version (provided separately)
New Meta Boxes:
-
IGNY8 Keywords (side, high priority)
- Primary Keyword (text input)
- Secondary Keywords (comma-separated input)
- Saves to
_igny8_primary_keywordand_igny8_secondary_keywords
-
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
-
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:
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- Extractsterm_idsfrom WordPress responsepublisher_service.py- Savesterm_idstocontent.external_metadata['wordpress_term_ids']
Saved Data Structure:
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)
- ✅
igny8-bridge.php- Removed sync, updated version to 1.1.0 - ✅
admin/class-admin.php- Added post_status setting registration - ✅
admin/settings.php- Added UI for post_status setting - ⚠️
admin/class-post-meta-boxes.php- NEEDS MANUAL REPLACEMENT - ✅
sync/igny8-to-wp.php- Gallery fix, cluster/sector taxonomies, keywords, term IDs - ✅
includes/class-igny8-rest-api.php- Return term_ids in response
Django Backend (Python)
- ✅
wordpress_adapter.py- Send cluster_name, sector_name, capture term_ids - ✅
publisher_service.py- Save term_ids to external_metadata
🧪 Testing Required
WordPress Side
- ✅ Test publishing from IGNY8 → WordPress
- ✅ Verify post created with correct status (draft/publish based on setting)
- ✅ Check categories assigned correctly
- ✅ Check tags assigned correctly
- ✅ Verify featured image downloaded
- ⚠️ Test gallery images saved to
_igny8_gallery_imagespost_meta - ✅ Verify cluster taxonomy assigned (not post_meta)
- ✅ Verify sector taxonomy assigned (not post_meta)
- ⚠️ Check Keywords meta box shows primary + secondary keywords
- ⚠️ Check SEO meta box shows meta_title + meta_description
- ⚠️ Check Sync Data meta box shows tracking fields
- ✅ Verify WordPress returns term_ids in response
Django/IGNY8 Side
- ✅ Verify
content.external_idsaved (WordPress post_id) - ✅ Verify
content.external_urlsaved (WordPress post URL) - ✅ Verify
content.status= 'published' after success - ✅ Verify
content.external_metadata['wordpress_term_ids']saved
WordPress Admin Settings
- ✅ Go to Settings → IGNY8 Bridge
- ✅ Find "Default Post Status for IGNY8 Content"
- ✅ Test changing Draft ↔ Publish
- ✅ Verify next publish uses selected status
📋 Manual Task Checklist
Task 1: Replace Meta Boxes File
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
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
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
# 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
- Go to Settings → IGNY8 Bridge
- Under Automation Settings, find "Default Post Status for IGNY8 Content"
- Choose Draft (recommended) or Publish
- Click "Save Automation Settings"
🔍 Verification Commands
Check WordPress Response
# 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
-- 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
-- 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
-
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
-
Taxonomies in sidebar:
- Categories (standard)
- Tags (standard)
- IGNY8 Clusters (custom)
- IGNY8 Sectors (custom)
-
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