Files
igny8/docs/wordpress-integration-and-other/WP-REFACTOR-IMPLEMENTATION-SUMMARY.md
IGNY8 VPS (Salman) 5d96e1a2bd cleanup docs
2025-12-03 07:40:25 +00:00

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

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_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:

{
  "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:

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:

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

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

  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

# 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

  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

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