> ## Documentation Index
> Fetch the complete documentation index at: https://docs.siftly.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# WordPress Integration

> Connect Siftly to WordPress.com or a self-hosted WordPress.org site and publish GEO-optimized content directly as blog posts.

<Frame>
  <img src="https://mintcdn.com/siftly/IwND2vAxRbhCiRev/images/cms-integrations.svg?fit=max&auto=format&n=IwND2vAxRbhCiRev&q=85&s=2704e9affce00587d23137bf707339c7" alt="Supported CMS platforms including WordPress" className="rounded-xl" width="900" height="280" data-path="images/cms-integrations.svg" />
</Frame>

## Overview

This guide is for WordPress users who want to publish Siftly-generated GEO content and apply Siftly's SEO/GEO recommendations directly from their dashboard. After following it, you'll be able to push optimized content to WordPress and ensure all meta fields, structured data, and tags are correctly applied.

**Difficulty:** ✅ Non-tech friendly — no coding required for basic setup.

Siftly supports two WordPress connection methods so you can publish regardless of how your site is hosted:

| Connection type                 | Who it's for                                   | Auth method                     |
| ------------------------------- | ---------------------------------------------- | ------------------------------- |
| **WordPress.com**               | Sites hosted at wordpress.com or using Jetpack | OAuth2 — no passwords needed    |
| **Self-hosted (WordPress.org)** | Your own server running WordPress              | Application Passwords (WP 5.6+) |

Once connected, you can publish Siftly-generated content to WordPress with a single click from the content editor.

***

## Which connection type do I need?

**Use WordPress.com if:**

* Your site URL ends in `.wordpress.com`, or
* You use Jetpack to connect a self-hosted site to WordPress.com's infrastructure

**Use Self-hosted (WordPress.org) if:**

* You installed WordPress on your own server or a managed host (e.g., WP Engine, Kinsta, Flywheel, SiteGround), or
* Your site URL is a custom domain and you manage your own hosting

<Tip>
  Not sure which you have? Log in to your WordPress dashboard. If the URL is `wordpress.com/home/yoursite`, you're on WordPress.com. If it's `yoursite.com/wp-admin`, you're self-hosted.
</Tip>

***

## Connecting WordPress.com (OAuth2)

### Prerequisites

* A **WordPress.com** account
* A WordPress.com site with a blog enabled (free and paid plans are both supported)

### Step 1: Start the OAuth connection

Siftly uses WordPress.com's official OAuth2 flow — you never share your password with Siftly.

1. In Siftly, go to **Settings → Integrations**
2. Click **Connect** next to **WordPress**
3. On the type selection screen, click **Connect WordPress.com**
4. You'll be redirected to **WordPress.com** to authorize access
5. Log in with your WordPress.com credentials if prompted
6. Click **Approve** to grant Siftly permission to publish posts on your behalf

WordPress.com redirects you back to Siftly automatically once authorized.

<Tip>
  The authorization grants Siftly **post write** and **media upload** access — it can create posts and upload images to your media library. It cannot read your private data, change your account settings, or access other sites on your WordPress.com account.
</Tip>

### Step 2: Verify the connection

After authorizing, Siftly displays your connected site URL. If you see an error instead, see [Troubleshooting](#troubleshooting).

***

## Connecting a Self-hosted Site (WordPress.org)

Self-hosted WordPress sites use **Application Passwords** — a built-in WordPress feature since version 5.6 that lets you grant API access without sharing your main account password.

### Prerequisites

Before connecting, make sure your site meets these requirements:

<Steps>
  <Step title="WordPress 5.6 or later">
    Application Passwords are built into WordPress 5.6+. Check **Dashboard → Updates** to confirm your version. Most managed hosts keep WordPress updated automatically.
  </Step>

  <Step title="Pretty permalinks enabled">
    The WordPress REST API requires pretty permalinks (any setting except **Plain**).

    Go to **Settings → Permalinks** and select any option other than **Plain** (e.g., **Post name** is recommended). Click **Save Changes**.

    <Warning>
      If permalinks are set to **Plain**, the REST API routes are not registered and Siftly will not be able to connect or publish — you'll see a "REST API not found" error.
    </Warning>
  </Step>

  <Step title="Generate an Application Password">
    1. Log in to your WordPress admin panel
    2. Go to **Users → Your Profile** (or **Users → All Users → Edit** for another user)
    3. Scroll down to the **Application Passwords** section
    4. Enter a name for the password (e.g., `Siftly`)
    5. Click **Add New Application Password**
    6. **Copy the generated password immediately** — it is shown only once

    <Warning>
      Application Passwords look like `xxxx xxxx xxxx xxxx xxxx xxxx` (24 characters with spaces). Copy it exactly as shown — spaces are part of the password and must be included.
    </Warning>
  </Step>

  <Step title="HTTPS enabled (strongly recommended)">
    Application Passwords send credentials over HTTP Basic Auth. Without HTTPS, credentials are transmitted in plain text. Most managed WordPress hosts include SSL by default. You can verify by checking that your site loads at `https://`.

    <Note>
      On some WordPress configurations, Application Passwords are disabled when HTTPS is not detected. If you don't see the **Application Passwords** section in your profile, this may be the cause.
    </Note>
  </Step>
</Steps>

### Step 1: Connect in Siftly

1. In Siftly, go to **Settings → Integrations**
2. Click **Connect** next to **WordPress**
3. On the type selection screen, click **Connect Self-hosted**
4. Fill in the three fields:

| Field                    | What to enter                                                    |
| ------------------------ | ---------------------------------------------------------------- |
| **Site URL**             | The root URL of your WordPress site, e.g. `https://yoursite.com` |
| **Username**             | Your WordPress admin username (not your email address)           |
| **Application Password** | The password generated in your profile (spaces included)         |

5. Click **Connect Site**

Siftly validates your credentials immediately by calling your site's REST API. If validation succeeds, you'll see the connected confirmation with your site URL.

### Step 2: Verify the connection

After connecting, Siftly displays your site URL and username. If you see an error, check the [Troubleshooting](#troubleshooting) section.

***

## Field Mapping

WordPress uses the unified 3-tier field mapping system. WordPress post fields have fixed API names, so required fields are pre-configured.

### Required Fields

| Siftly Field | WordPress Post Field | Notes                                 |
| ------------ | -------------------- | ------------------------------------- |
| **Title**    | `title`              | Pre-configured — WordPress post title |
| **Slug**     | `slug`               | Pre-configured — custom URL slug      |
| **Body**     | `content`            | Pre-configured — post content (HTML)  |

### Optional Fields

When mapped, these are auto-populated from your content data.

| Siftly Field         | WordPress Post Field | Notes                                                              |
| -------------------- | -------------------- | ------------------------------------------------------------------ |
| **Meta Title**       | —                    | Not natively supported by WordPress REST API (requires SEO plugin) |
| **Meta Description** | `excerpt`            | Mapped to WordPress post excerpt                                   |
| **Keywords**         | `tags`               | Mapped to WordPress tags (created if they don't exist)             |
| **Categories**       | `categories`         | Mapped to WordPress categories                                     |
| **JSON-LD**          | —                    | Not natively supported by WordPress REST API                       |
| **Word Count**       | —                    | Not natively supported by WordPress REST API                       |

<Note>
  WordPress's REST API has limited support for SEO-specific fields like meta title and JSON-LD. If you use an SEO plugin (Yoast, Rank Math, etc.), those fields may be available through the plugin's API extensions.
</Note>

***

## Custom Fields

Add extra fields your WordPress posts require that aren't part of Siftly's standard content schema. Custom fields are sent as WordPress post meta.

### Field Types

| Type    | Description                  | Example                           |
| ------- | ---------------------------- | --------------------------------- |
| String  | Plain text                   | Author name, subtitle             |
| Number  | Numeric value                | Priority, reading time            |
| Boolean | True/false                   | Featured post, comments enabled   |
| JSON    | Structured object            | SEO config, social media metadata |
| Select  | Pick from predefined options | Category, status, content type    |

### Select Options with Separate Labels and Values

When adding a **Select** custom field, you define the available options in a textarea. Each option can have a separate **value** (sent to CMS) and **label** (shown in the dropdown):

```
value:label
```

**Example — Labels differ from values:**

```
1:Health
2:Tech
3:Food
4:Fashion
```

The dropdown shows `Health`, `Tech`, etc., but Siftly sends `1`, `2`, etc. to the CMS API.

**Example — Labels same as values:**

```
food
tech
health
fashion
```

When no `:` is present, the option text is used as both the label and value. This is backward-compatible with existing configurations.

<Tip>
  Use the `value:label` format when your CMS expects specific IDs, slugs, or enum values that differ from the human-readable names shown to content editors.
</Tip>

### Default Values

Set a default value when adding a custom field. This value pre-fills at publish time — you can override it for each post.

### Use Existing Field

Instead of setting a manual default, you can link a custom field to an existing content field. For example, map a custom WordPress meta field to use the same value as **Meta Description**.

This is useful when your WordPress setup has multiple fields that should contain the same data (e.g., a Yoast `_yoast_wpseo_metadesc` field and the post excerpt both using your meta description).

***

## Publishing

### Draft vs Published

When publishing, choose between:

* **Draft** — content is pushed to WordPress as a draft post for review in the WordPress editor
* **Published** — the post is created and immediately published to your live site

### Custom Fields at Publish Time

If you've defined custom fields, they appear in the publish dialog pre-filled with their default values (or auto-filled from linked fields). You can edit them before publishing.

Standard fields (title, slug, body, excerpt, tags, categories) are auto-populated from your content — no manual input needed.

***

## Rich text and formatting

Siftly publishes content as **HTML**. Standard formatting is preserved:

* Headings (H1-H4)
* Bold and italic text
* Ordered and unordered lists
* Hyperlinks (including internal links generated by Siftly)
* Blockquotes

Both the WordPress Block Editor (Gutenberg) and the Classic Editor render the HTML correctly.

<Tip>
  Siftly uploads the hero image and all inline content images to your WordPress media library automatically at publish time. The hero image is set as the post's **featured image** when the field is mapped. No manual image uploads needed.
</Tip>

***

## Where to apply Siftly's recommendations on WordPress

Siftly generates recommendations for SEO/GEO fields alongside your content. Here's where each field lives in WordPress and how to apply Siftly's values.

### Meta Title

WordPress doesn't have a native meta title field — it uses the post title as the page title by default.

**With Yoast SEO:**
Go to the post editor → scroll to the **Yoast SEO** panel → **SEO title** field. Paste Siftly's recommended meta title here.

**With Rank Math:**
Go to the post editor → click the **Rank Math** icon in the top bar → **Edit Snippet → SEO Title**. Paste Siftly's recommendation.

**Without an SEO plugin:**
The `<title>` tag defaults to your post title. To override it, you'd need a custom `wp_head` hook — we recommend using Yoast or Rank Math instead.

### Meta Description

**With Yoast SEO:**
Post editor → **Yoast SEO panel → Meta description** field. Paste Siftly's recommended description.

**With Rank Math:**
Post editor → **Rank Math → Edit Snippet → Description**. Paste Siftly's recommendation.

**Without an SEO plugin:**
WordPress has no native meta description. The post excerpt is used by some themes as a fallback. We recommend Yoast or Rank Math for proper meta description control.

<Tip>
  Siftly auto-populates the WordPress `excerpt` field on publish using your content's meta description. For Yoast/Rank Math fields, you'll need to edit them directly in WordPress after publishing — the WordPress REST API does not expose SEO plugin fields natively.
</Tip>

### Open Graph Image / Social Share Image

**With Yoast SEO:**
Post editor → **Yoast SEO → Social tab → Facebook image / Twitter image**. Upload or paste the URL of the image Siftly recommends.

**With Rank Math:**
Post editor → **Rank Math → Social tab → Facebook Thumbnail / Twitter Thumbnail**.

**Without an SEO plugin:**
WordPress uses the Featured Image as the Open Graph image in most themes. Set your Featured Image and most social platforms will pick it up.

### Canonical URL

WordPress auto-generates canonical URLs for each post. Both Yoast and Rank Math add `<link rel="canonical">` automatically.

To override (e.g., for syndicated content):

* **Yoast:** Post editor → Yoast → **Advanced → Canonical URL**
* **Rank Math:** Post editor → Rank Math → **Advanced → Canonical URL**

<Note>
  Siftly does not currently push canonical URL overrides. The default WordPress canonical (your post's permalink) is correct for original content published through Siftly.
</Note>

### Tags & Categories

Siftly maps keywords to WordPress **Tags** and categories to WordPress **Categories** automatically during publish. These are set in the standard WordPress post sidebar panels.

Tags created by Siftly that don't already exist in WordPress are created automatically. Categories must exist beforehand — if a category name doesn't match an existing WordPress category, it's skipped.

### JSON-LD Structured Data

WordPress doesn't have native JSON-LD support. Here's how to add it:

**With Yoast SEO (automatic):**
Yoast auto-generates Article schema, Organization schema, and BreadcrumbList schema. Siftly's JSON-LD recommendation can supplement this with FAQ, HowTo, or other specialized schemas.

To add Siftly's JSON-LD alongside Yoast's auto-generated schema, install the **Custom HTML** block in your post and paste:

```html theme={null}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Your question here",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Your answer here"
      }
    }
  ]
}
</script>
```

**With Rank Math:**
Rank Math has a built-in **Schema** tab in the post editor. Click **Schema Generator** to add FAQ, HowTo, Article, or custom schema types. Paste values from Siftly's JSON-LD recommendation into the relevant fields.

**Without an SEO plugin:**
Add a **Custom HTML** block at the bottom of your post with the full `<script type="application/ld+json">` tag.

<Warning>
  If you use Yoast or Rank Math, do NOT duplicate the Article schema they already generate. Siftly's JSON-LD recommendations are designed to supplement (FAQ, HowTo, Product) — not replace — your plugin's base schema.
</Warning>

### Keywords

The HTML `<meta name="keywords">` tag is deprecated by Google but still parsed by some AI engines and internal search systems.

* **Yoast SEO:** Does not support meta keywords (removed in 2018).
* **Rank Math:** Post editor → Rank Math → **Focus Keyword** field. This is used for on-page optimization guidance, not rendered as a meta tag.
* **For AI parsers:** If you want a keywords meta tag rendered in `<head>`, use a plugin like **Add Meta Tags** or add a custom field that your theme renders.

Siftly maps keywords to WordPress Tags by default, which is sufficient for content organization and many AI crawlers.

***

## Pushing Siftly recommendations automatically

Siftly pushes content to WordPress in a single publish action. However, WordPress's REST API has limited SEO field support — here's what's automated and what's manual:

**Pushed automatically on publish:**

* Title
* Slug
* Body (full HTML content with images hosted in WordPress media library)
* Excerpt (from Siftly's meta description)
* Hero image → set as featured image (uploaded to WordPress media library)
* All inline content images (uploaded to WordPress media library)

**Must be applied manually after publishing:**

* Meta title (via Yoast/Rank Math in WordPress editor)
* Meta description (via Yoast/Rank Math — the excerpt is pushed but the SEO plugin field is separate)
* JSON-LD structured data (via Custom HTML block or SEO plugin schema)
* Tags and categories (not currently pushed via API)

<Steps>
  <Step title="Generate content in Siftly">
    Use Siftly's content editor to generate or optimize your article. Siftly produces meta title, meta description, keywords, and JSON-LD recommendations alongside the content.
  </Step>

  <Step title="Click Publish → WordPress">
    In the content editor, click **Publish** and select **WordPress**. Choose Draft or Published status.
  </Step>

  <Step title="Content + excerpt pushed automatically">
    Siftly sends title, slug, body (HTML), and excerpt in a single API call to WordPress.
  </Step>

  <Step title="Apply SEO fields manually in WordPress">
    Open the post in WordPress editor. Copy Siftly's recommendations for meta title, meta description, and JSON-LD into your SEO plugin (Yoast/Rank Math). Add tags and a featured image.
  </Step>
</Steps>

<Note>
  WordPress's REST API does not expose Yoast or Rank Math SEO fields. These must be set directly in the WordPress post editor after publishing from Siftly.
</Note>

***

## Platform-specific quirks & limitations

<Warning>
  **REST API limitations:** WordPress's REST API does not expose Yoast SEO or Rank Math fields. Siftly can push title, slug, body, and excerpt — but meta title, meta description (the SEO plugin field), JSON-LD, and tags must be applied manually in the WordPress editor after publishing.
</Warning>

<Note>
  **Excerpt vs Meta Description:** Siftly pushes your meta description as the WordPress `excerpt`. Some themes use the excerpt as the meta description fallback, but Yoast/Rank Math use their own separate field. After publishing, copy the excerpt into your SEO plugin's description field if they don't auto-sync.
</Note>

* **Block Editor vs Classic Editor:** Siftly's HTML content works in both editors. The Block Editor wraps it in a single Classic block. No action needed.
* **Multisite:** Siftly connects to one site at a time. For WordPress Multisite, connect each subsite separately.
* **Caching plugins:** After publishing, if your site uses WP Super Cache, W3 Total Cache, or a CDN, the new post may not appear immediately. Purge cache or wait for TTL expiry.
* **Security plugins:** Wordfence and iThemes Security can block REST API access. Whitelist Siftly's server IP or ensure the REST API is not disabled.

***

## Validating the setup

After publishing your first post with Siftly's recommendations applied:

<Steps>
  <Step title="View the live page source">
    Open your published post in a browser. Right-click → **View Page Source**. Search for:

    * `<title>` — should contain your Siftly meta title
    * `<meta name="description"` — should contain your Siftly meta description
    * `<script type="application/ld+json">` — should contain your JSON-LD
  </Step>

  <Step title="Run Google Rich Results Test">
    Go to [Google Rich Results Test](https://search.google.com/test/rich-results) and paste your post URL. Confirm your JSON-LD is detected and valid.
  </Step>

  <Step title="Run Schema.org Validator">
    Go to [Schema.org Validator](https://validator.schema.org/) and paste your post URL. Check for errors or warnings in your structured data.
  </Step>

  <Step title="Check Open Graph tags">
    Use [Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/) or [Twitter Card Validator](https://cards-dev.twitter.com/validator) to confirm OG image, title, and description are rendering correctly.
  </Step>
</Steps>

***

## Difficulty & setup recap

<Card title="WordPress Setup Summary" icon="wordpress">
  | Aspect                  | Rating                                                |
  | ----------------------- | ----------------------------------------------------- |
  | **Initial setup**       | ✅ Easy — OAuth or Application Password, no code       |
  | **Applying SEO fields** | ✅ Easy with Yoast/Rank Math, manual without           |
  | **JSON-LD**             | ⚠️ Requires SEO plugin or custom theme code           |
  | **Ongoing editing**     | ✅ Easy — publish from Siftly, edit in WordPress       |
  | **Developer needed?**   | No (unless you want automated JSON-LD via theme hook) |
</Card>

***

## Related

<CardGroup cols={2}>
  <Card title="CMS Integrations Overview" icon="grid-2" href="/integrations/overview">
    Compare all supported platforms and the unified field mapping system.
  </Card>

  <Card title="Quickstart Guide" icon="rocket" href="/quickstart">
    Set up your brand and run your first GEO analysis.
  </Card>

  <Card title="Content Generation" icon="file-pen" href="/features/content-generation">
    How Siftly generates GEO-optimized content and recommendations.
  </Card>

  <Card title="Choosing a CMS for AI Visibility" icon="book" href="https://siftly.ai/blog/cms-and-ai-visibility">
    Our guide to picking the right CMS for GEO optimization.
  </Card>
</CardGroup>

***

## Reconnecting or switching sites

**WordPress.com:** OAuth tokens can expire or be revoked (e.g., if you change your password). To reconnect, go to **Settings → Integrations → WordPress**, click **Disconnect**, then click **Connect** again to restart the OAuth flow.

**Self-hosted:** Application Passwords remain valid until you delete them in WordPress. If credentials change (e.g., you regenerated the password), disconnect and reconnect using the new password.

Each reconnect replaces the stored credential with the new one. You can also use this to switch to a different site.

***

## Disconnecting WordPress

1. Go to **Settings → Integrations**
2. Click **Disconnect** next to **WordPress**

This permanently deletes your stored credentials from Siftly's database. It does not affect posts already published to WordPress.

**For WordPress.com:** This does not revoke Siftly's app authorization on the WordPress.com side. To fully revoke access, go to [WordPress.com → Security → Connected Apps](https://wordpress.com/me/security/connected-applications) and remove **Siftly**.

**For self-hosted:** To invalidate the Application Password entirely, go to **WordPress Admin → Users → Your Profile → Application Passwords** and delete the Siftly entry.

***

## Troubleshooting

<AccordionGroup>
  <Accordion title="WordPress.com: I was redirected back with an error">
    This happens if you clicked **Deny** on the WordPress.com authorization screen, or if the OAuth flow timed out (the authorization window is valid for 10 minutes). Go to **Settings → Integrations → WordPress** and click **Connect** again.
  </Accordion>

  <Accordion title="WordPress.com: Token invalid or expired (403 error when publishing)">
    WordPress.com OAuth tokens are revoked when you change your account password or remove the app's access. Go to **Settings → Integrations → WordPress**, click **Disconnect**, then **Connect** again to get a fresh token.
  </Accordion>

  <Accordion title="Self-hosted: 'Basic Auth headers stripped' error (.htaccess fix)">
    Some shared hosting environments (cPanel, Plesk, LiteSpeed) strip the HTTP `Authorization` header before it reaches WordPress, which means your Application Password is never actually checked — even though the REST API itself is reachable.

    Add the following lines to your `.htaccess` file inside the WordPress block, **before** the `RewriteRule . /index.php [L]` line:

    ```apache theme={null}
    RewriteCond %{HTTP:Authorization} ^(.*) [NC,OR]
    RewriteCond %{HTTP:Authorization} ^(.*) [NC]
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%1]
    ```

    Alternatively, if your host uses Apache's `mod_setenvif`, add this line anywhere in `.htaccess`:

    ```apache theme={null}
    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
    ```

    After saving `.htaccess`, try connecting again in Siftly.
  </Accordion>

  <Accordion title="Self-hosted: 'REST API not found' error">
    This means the WordPress REST API is not accessible at `{site_url}/wp-json/wp/v2/`. The most common cause is **Plain permalinks** being selected.

    Go to **Settings → Permalinks** in your WordPress admin, select any option other than **Plain** (e.g., **Post name**), and click **Save Changes**. Then try connecting again.

    Other causes include security plugins (e.g., Wordfence, iThemes Security) that disable the REST API, or a WAF/CDN that blocks API requests.
  </Accordion>

  <Accordion title="Self-hosted: Invalid credentials (401 error)">
    Double-check your **username** (not your email address — use the username shown in your WordPress profile) and make sure you copied the **Application Password** exactly as generated, including the spaces.

    If you're unsure, go to **Users → Your Profile → Application Passwords**, delete the existing Siftly entry, generate a new one, and reconnect.
  </Accordion>

  <Accordion title="Self-hosted: Application Passwords section is missing from my profile">
    This happens when:

    * Your site is not using HTTPS (Application Passwords require SSL on some configurations)
    * A security plugin has disabled Application Passwords
    * You are on WordPress.com with a plan that doesn't support this feature (use the OAuth connection instead)

    To re-enable via `wp-config.php`, add: `define('WP_APPLICATION_PASSWORDS_ENABLED', true);`
  </Accordion>

  <Accordion title="'WordPress not connected' error when publishing">
    The integration was disconnected or the stored credentials are no longer valid. Go to **Settings → Integrations → WordPress** and reconnect.
  </Accordion>

  <Accordion title="Post published but content looks wrong in WordPress">
    Open the post in your WordPress editor and switch to **HTML** or **Code Editor** view to inspect the raw markup. If formatting is broken, check for unsupported HTML tags in the generated content. You can edit the post directly in WordPress after publishing.
  </Accordion>

  <Accordion title="Post doesn't appear on my site after publishing">
    If you published with **Published** status, posts should be live immediately. Check **WordPress → Posts → Published**. If you published as **Draft**, look under **WordPress → Posts → Drafts**. If the post isn't in either location, check the Siftly publish response for errors.
  </Accordion>

  <Accordion title="I connected the wrong site">
    Go to **Settings → Integrations → WordPress**, click **Disconnect**, then click **Connect** and either log in with the correct WordPress.com account or enter the credentials for the correct self-hosted site.
  </Accordion>
</AccordionGroup>
