# SEO Meta Data Workflow Fix

**Last Updated:** 2026-03-06  
**Issue:** Meta data was not properly set and synced for new blog posts

## Problem Identified

When creating new blog posts, the SEO meta data workflow was incomplete:

1. **Missing step:** After setting SEO meta, entries were not added to `v2/data/blog/seo-meta.json`
2. **Missing sync:** `sync-meta-to-posts.php` was not run after adding meta to `seo-meta.json`
3. **Script bug:** `sync-meta-to-posts.php` was setting `post.title` with " - Ordio" suffix, but per BLOG_SEO_TITLE_STANDARDS.md, `post.title` should NOT have the brand suffix

## Root Cause

**Meta generator priority** (`blog-meta-generator.php`):
1. Centralized SEO meta store (`seo-meta.json`) ← **Primary source**
2. Post JSON `meta.title` (backward compatibility)
3. Auto-generate from `post.title`

**Without `seo-meta.json` entry:** Meta generator falls back to post JSON, which may have placeholder values.

**Without sync:** Post JSON meta remains outdated even if `seo-meta.json` is correct.

## Solution Implemented

### 1. Fixed Sync Script

**File:** `v2/scripts/blog/sync-meta-to-posts.php`

**Change:** Remove " - Ordio" suffix from `post.title` when syncing:

```php
// Sync post.title from meta.title (remove " - Ordio" suffix if present)
$display_title = trim($meta['title']);
// Remove " - Ordio" suffix if present (post.title should not have brand suffix)
$display_title = preg_replace('/\s*-\s*Ordio\s*$/i', '', $display_title);
if (!empty($display_title)) {
    $post_data['title'] = trim($display_title);
}
```

**Rationale:** Per BLOG_SEO_TITLE_STANDARDS.md:
- `post.title` = No brand suffix (e.g. "Human Resource Management (HRM): Definition & Strategien")
- `meta.title` = With brand suffix (e.g. "Human Resource Management (HRM): Definition & Strategien - Ordio")

### 2. Updated Workflow Documentation

**File:** `.cursor/rules/blog-new-post-creation.mdc`

**Added:** Step 3 "SEO Meta" with explicit instructions:

```markdown
3. **SEO Meta** – Set SEO title and description. **CRITICAL:** After setting meta, add to `v2/data/blog/seo-meta.json` AND run `sync-meta-to-posts.php`:
   ```bash
   # 1. Add entry to v2/data/blog/seo-meta.json manually:
   "{category}/{slug}": {
       "title": "{SEO Title} - Ordio",
       "description": "{Meta description 150-160 chars}",
       "source": "manual",
       "updated_at": "{ISO 8601 timestamp}"
   }
   
   # 2. Sync to post JSON:
   php v2/scripts/blog/sync-meta-to-posts.php --post={slug} --category={category}
   ```
   **Why:** Meta generator checks `seo-meta.json` first (primary source). Without sync, post JSON meta remains outdated.
```

### 3. Fixed HRM Post Meta Data

**Action taken:**
1. Added entry to `v2/data/blog/seo-meta.json`:
   ```json
   "lexikon/human-resource-management": {
       "title": "Human Resource Management (HRM): Definition & Strategien - Ordio",
       "description": "HRM ist das englische Synonym für Personalmanagement mit Fokus auf strategische, internationale und digitale Aspekte. Erfahre Definition, Strategic HRM, eHRM, Unterschied zu Personalmanagement und praktische Umsetzung.",
       "source": "manual",
       "updated_at": "2026-03-06T19:10:00Z"
   }
   ```

2. Ran sync script:
   ```bash
   php v2/scripts/blog/sync-meta-to-posts.php --post=human-resource-management --category=lexikon
   ```

3. Fixed `post.title` (removed " - Ordio" suffix)

## Correct Workflow (Going Forward)

### Step-by-Step Process

1. **Set SEO meta** (via `set-seo-meta` todo or manually):
   - Determine SEO title (50-60 chars keyword phrase + " - Ordio")
   - Determine meta description (150-160 chars)

2. **Add to `seo-meta.json`:**
   ```json
   "{category}/{slug}": {
       "title": "{SEO Title} - Ordio",
       "description": "{Meta description}",
       "source": "manual",
       "updated_at": "{ISO 8601 timestamp}"
   }
   ```

3. **Sync to post JSON:**
   ```bash
   php v2/scripts/blog/sync-meta-to-posts.php --post={slug} --category={category}
   ```

4. **Verify:**
   - Check `v2/data/blog/posts/{category}/{slug}.json`:
     - `meta.title` = "{SEO Title} - Ordio" ✅
     - `meta.description` = "{Meta description}" ✅
     - `post.title` = "{SEO Title}" (NO " - Ordio") ✅

## Prevention

### Updated Documentation

- ✅ `.cursor/rules/blog-new-post-creation.mdc` - Added explicit SEO Meta step
- ✅ `docs/content/blog/posts/lexikon/human-resource-management/META_DATA_FIX.md` - Documented issue and fix

### Validation Checklist

**Add to validation scripts:**
- Check for placeholder meta descriptions in post JSON
- Check if post exists in `seo-meta.json`
- Verify `post.title` doesn't have " - Ordio" suffix

### Future Improvements

1. **Automate meta sync:** Add automatic sync to `create-new-blog-post.php` or `run-new-post-pipeline.php`
2. **Validation script:** Create `validate-seo-meta-completeness.php` to check:
   - Post exists in `seo-meta.json`
   - Meta is not placeholder
   - `post.title` matches `meta.title` (without suffix)
3. **Template reminder:** Add meta sync step to `NEW_POST_TODO_TEMPLATE.md`

## Files Modified

- ✅ `v2/scripts/blog/sync-meta-to-posts.php` (fixed post.title suffix removal)
- ✅ `v2/data/blog/seo-meta.json` (added HRM entry)
- ✅ `v2/data/blog/posts/lexikon/human-resource-management.json` (synced meta, fixed title)
- ✅ `.cursor/rules/blog-new-post-creation.mdc` (added SEO Meta step)
- ✅ `docs/content/blog/posts/lexikon/human-resource-management/META_DATA_FIX.md` (documented fix)

## Testing

**Verified:**
- ✅ Meta entry added to `seo-meta.json`
- ✅ Sync script runs successfully
- ✅ Post JSON meta updated correctly
- ✅ `post.title` does NOT have " - Ordio" suffix
- ✅ `meta.title` DOES have " - Ordio" suffix

## Related Documentation

- `docs/content/blog/SEO_META_MANAGEMENT.md` - Complete SEO meta management guide
- `docs/content/blog/BLOG_SEO_TITLE_STANDARDS.md` - Title format standards
- `.cursor/rules/blog-templates-seo.mdc` - SEO requirements for blog templates
