# Complete Wix SEO Metadata Implementation
## 📊 SEO Metadata Generated vs Posted
### ✅ FULLY POSTED TO WIX
#### 1. **SEO Keywords** (in `seoData.settings.keywords`)
- ✅ `focus_keyword` → Main keyword (`isMain: true`)
- ✅ `blog_tags` → Additional keywords (`isMain: false`)
- ✅ `social_hashtags` → Additional keywords (`isMain: false`)
#### 2. **Meta Tags** (in `seoData.tags`)
- ✅ `meta_description` → ``
- ✅ `seo_title` → ``
#### 3. **Open Graph Tags** (in `seoData.tags`)
- ✅ `open_graph.title` → `og:title`
- ✅ `open_graph.description` → `og:description`
- ✅ `open_graph.image` → `og:image` (HTTP/HTTPS URLs only)
- ✅ `og:type` → Always set to `article`
- ✅ `open_graph.url` or `canonical_url` → `og:url`
#### 4. **Twitter Card Tags** (in `seoData.tags`)
- ✅ `twitter_card.title` → `twitter:title`
- ✅ `twitter_card.description` → `twitter:description`
- ✅ `twitter_card.image` → `twitter:image` (HTTP/HTTPS URLs only)
- ✅ `twitter_card.card` → `twitter:card` (default: `summary_large_image`)
#### 5. **Canonical URL** (in `seoData.tags`)
- ✅ `canonical_url` → ``
#### 6. **Blog Categories** (in `draftPost.categoryIds`)
- ✅ `blog_categories` → Lookup/create categories → `categoryIds` (UUIDs)
- **Implementation**: `lookup_or_create_categories()` method
- **Behavior**: Case-insensitive lookup, auto-create if missing
#### 7. **Blog Tags** (in `draftPost.tagIds`)
- ✅ `blog_tags` → Lookup/create tags → `tagIds` (UUIDs)
- **Implementation**: `lookup_or_create_tags()` method
- **Behavior**: Case-insensitive lookup, auto-create if missing
- **Note**: `blog_tags` are also used in SEO keywords, but separately as post tags
### ❌ NOT POSTED (Optional/Future)
1. **JSON-LD Structured Data** (`json_ld_schema`)
- **Reason**: Wix doesn't support JSON-LD in backend API
- **Solution**: Would require frontend implementation using `@wix/site-seo` package
- **Status**: Not implemented (would need to be added to Wix site code)
2. **URL Slug** (`url_slug`)
- **Reason**: Wix auto-generates URLs from title
- **Status**: Could be implemented if Wix API supports custom slugs
3. **Reading Time** (`reading_time`)
- **Reason**: Metadata only, not part of Wix blog post structure
- **Status**: Not applicable
4. **Optimization Score** (`optimization_score`)
- **Reason**: Internal metadata for ALwrity, not Wix field
- **Status**: Not applicable
## 🔄 Conversion Methods
### Markdown to Ricos Conversion
**Primary Method**: Wix Official Ricos Documents API
- **Endpoint**: Tries multiple paths to find correct endpoint
- **Benefits**: Official conversion, handles all edge cases
- **Fallback**: Custom parser if API unavailable
**Fallback Method**: Custom Markdown Parser
- **Location**: `backend/services/integrations/wix/content.py`
- **Supports**: Headings, paragraphs, lists, bold, italic, links, images, blockquotes
## 📋 Complete Post Structure
When publishing to Wix, the blog post includes:
```json
{
"draftPost": {
"title": "SEO optimized title",
"memberId": "author-member-id",
"richContent": { /* Ricos JSON document */ },
"excerpt": "First 200 chars of content",
"categoryIds": ["uuid1", "uuid2"], // From blog_categories
"tagIds": ["uuid1", "uuid2"], // From blog_tags
"media": { /* Cover image if provided */ },
"seoData": {
"settings": {
"keywords": [
{ "term": "main keyword", "isMain": true },
{ "term": "tag1", "isMain": false },
{ "term": "tag2", "isMain": false }
]
},
"tags": [
{ "type": "meta", "props": { "name": "description", "content": "..." } },
{ "type": "meta", "props": { "name": "title", "content": "..." } },
{ "type": "meta", "props": { "property": "og:title", "content": "..." } },
{ "type": "meta", "props": { "property": "og:description", "content": "..." } },
{ "type": "meta", "props": { "property": "og:image", "content": "..." } },
{ "type": "meta", "props": { "property": "og:type", "content": "article" } },
{ "type": "meta", "props": { "property": "og:url", "content": "..." } },
{ "type": "meta", "props": { "name": "twitter:title", "content": "..." } },
{ "type": "meta", "props": { "name": "twitter:description", "content": "..." } },
{ "type": "meta", "props": { "name": "twitter:image", "content": "..." } },
{ "type": "meta", "props": { "name": "twitter:card", "content": "summary_large_image" } },
{ "type": "link", "props": { "rel": "canonical", "href": "..." } }
]
}
},
"publish": true
}
```
## ✅ Implementation Status
### Fully Implemented ✅
- SEO keywords (main + additional)
- Meta description and title
- Open Graph tags (all standard fields)
- Twitter Card tags (all standard fields)
- Canonical URL
- **Blog categories** (lookup/create)
- **Blog tags** (lookup/create)
- Wix Ricos API integration (with fallback)
### Partially Implemented ⚠️
- Image handling (only HTTP/HTTPS URLs, base64 skipped)
### Not Implemented ❌
- JSON-LD structured data (requires frontend)
- URL slug customization
- Reading time (not applicable)
- Optimization score (not applicable)
## 🎯 Summary
**All major SEO metadata fields are now being posted to Wix:**
- ✅ Keywords
- ✅ Meta tags
- ✅ Open Graph
- ✅ Twitter Cards
- ✅ Canonical URL
- ✅ Categories (auto-lookup/create)
- ✅ Tags (auto-lookup/create)
The only missing piece is JSON-LD structured data, which requires frontend implementation in the Wix site code using the `@wix/site-seo` package.