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

# WordPress

> Publish finished articles straight to your WordPress blog using an application password.

The WordPress connector posts articles to your site through the WordPress REST API, using an
**application password** — a revocable credential that is not your login password.

<Info>
  Works with self-hosted WordPress and WordPress.com Business (any install where the REST API is
  reachable). Requires WordPress 5.6 or newer, which is when application passwords landed.
</Info>

## Step 1 — Create an application password in WordPress

Sign in to your WordPress admin and go to **Users → Profile**, then scroll to **Application
Passwords**.

<Frame caption="WordPress admin → Users → Profile → Application Passwords">
  <img src="https://mintcdn.com/seosorted-dc17c331/vEMg5kPU9zyxc5bn/images/connectors/wp-application-passwords.png?fit=max&auto=format&n=vEMg5kPU9zyxc5bn&q=85&s=32feb403e36f49a6fe22eb6ee4b53321" alt="The Application Passwords section of the WordPress profile screen with a name field and Add Application Password button" width="1440" height="900" data-path="images/connectors/wp-application-passwords.png" />
</Frame>

Type a name you will recognise later — `seosorted.ai` works well — and click **Add Application
Password**.

<Frame caption="Copy the password now; WordPress will not show it again">
  <img src="https://mintcdn.com/seosorted-dc17c331/vEMg5kPU9zyxc5bn/images/connectors/wp-application-password-created.png?fit=max&auto=format&n=vEMg5kPU9zyxc5bn&q=85&s=55d714e9f6877412b47b6511fffc8367" alt="WordPress showing a newly generated application password in six groups of four characters, with a Copy button" width="1440" height="900" data-path="images/connectors/wp-application-password-created.png" />
</Frame>

<Warning>
  WordPress shows the password exactly once. Copy it before leaving the page. If you lose it,
  delete the entry and generate a new one — nothing else breaks.
</Warning>

The password appears in spaced groups (`tRz0 13qa Ar0q cTZP kqsx Wtxr`). Paste it exactly as
shown; the spaces are handled for you.

<Accordion title="Don't see an Application Passwords section?">
  WordPress hides it when the site is not served over HTTPS, because the credential travels as a
  basic-auth header. Serve the site over HTTPS, or — for a local development site only — set
  `WP_ENVIRONMENT_TYPE` to `local` in `wp-config.php`.

  Some security plugins (Wordfence, iThemes Security, SolidWP) also disable application passwords
  or the REST API outright. Look for a "REST API" or "Application Passwords" toggle in the plugin's
  settings.
</Accordion>

## Step 2 — Connect from SeoSorted

Go to **Project Settings → Integrations** and click **Connect** on the WordPress card.

<Frame caption="The WordPress connect form">
  <img src="https://mintcdn.com/seosorted-dc17c331/vEMg5kPU9zyxc5bn/images/connectors/wp-connect-modal.png?fit=max&auto=format&n=vEMg5kPU9zyxc5bn&q=85&s=20fe17681e5efc7c72173a3e1c2f3b2a" alt="Connect WordPress dialog with fields for Site URL, Username and Application password" width="1440" height="900" data-path="images/connectors/wp-connect-modal.png" />
</Frame>

Fill in three fields:

<ParamField path="Site URL" type="string" required>
  Your site's home URL, for example `https://seosorted.ai`. Pasting the admin URL
  (`https://seosorted.ai/wp-admin/`) is fine — the `/wp-admin` part is trimmed automatically.
</ParamField>

<ParamField path="Username" type="string" required>
  The WordPress username the application password belongs to — the login name, not the display
  name and not the email address.
</ParamField>

<ParamField path="Application password" type="string" required>
  The value from Step 1. Spaces are fine.
</ParamField>

<Frame caption="Filled in and ready to connect">
  <img src="https://mintcdn.com/seosorted-dc17c331/vEMg5kPU9zyxc5bn/images/connectors/wp-connect-modal-filled.png?fit=max&auto=format&n=vEMg5kPU9zyxc5bn&q=85&s=70f8927a3734ba04e3d5b8d2ad732f88" alt="Connect WordPress dialog filled with a site URL, username and masked application password" width="1440" height="900" data-path="images/connectors/wp-connect-modal-filled.png" />
</Frame>

Click **Connect**. We call your site once to confirm the credentials work before saving anything,
so a green **Connected** badge means the connection is genuinely live.

<Frame caption="Connected, showing the site the workspace publishes to">
  <img src="https://mintcdn.com/seosorted-dc17c331/vEMg5kPU9zyxc5bn/images/connectors/wp-connected.png?fit=max&auto=format&n=vEMg5kPU9zyxc5bn&q=85&s=5b6a92065afc0e94931e8447faa18100" alt="The WordPress card showing a Connected badge, the site URL and a Disconnect button" width="1440" height="900" data-path="images/connectors/wp-connected.png" />
</Frame>

## Step 3 — Publish an article

Open any finished article and click **Publish** in the top right, pick **WordPress**, then
**Publish now**.

<Frame caption="Choosing WordPress as the destination">
  <img src="https://mintcdn.com/seosorted-dc17c331/vEMg5kPU9zyxc5bn/images/connectors/publish-modal.png?fit=max&auto=format&n=vEMg5kPU9zyxc5bn&q=85&s=571b86dfd8ff135968277b04a02859d0" alt="Publish article dialog with WordPress selected as the destination" width="1440" height="900" data-path="images/connectors/publish-modal.png" />
</Frame>

<Frame caption="Published — the link goes to the live post">
  <img src="https://mintcdn.com/seosorted-dc17c331/vEMg5kPU9zyxc5bn/images/connectors/wp-publish-success.png?fit=max&auto=format&n=vEMg5kPU9zyxc5bn&q=85&s=1d0d9877fddfae4162ff2e01f283b532" alt="Publish dialog showing Published with a link to the new WordPress post" width="1440" height="900" data-path="images/connectors/wp-publish-success.png" />
</Frame>

The article opens on your site as a published post.

<Frame caption="The article live on WordPress">
  <img src="https://mintcdn.com/seosorted-dc17c331/vEMg5kPU9zyxc5bn/images/connectors/wp-live-post.png?fit=max&auto=format&n=vEMg5kPU9zyxc5bn&q=85&s=97acf2b50fc29814475a08c8ea1a5c98" alt="The published article rendered on the WordPress blog" width="1440" height="900" data-path="images/connectors/wp-live-post.png" />
</Frame>

## What gets sent

| Article field    | Lands in WordPress as                                       |
| ---------------- | ----------------------------------------------------------- |
| Title            | Post title                                                  |
| Body             | Post content (HTML), with JSON-LD article schema prepended  |
| Slug             | Post slug                                                   |
| Meta description | Post excerpt                                                |
| Featured image   | Uploaded to the Media Library and set as the featured image |

Posts are created with status **publish**, author = the connected user, and no category, so they
land in your default category.

<Note>
  Re-publishing the same article creates a **new** post rather than updating the existing one.
  Edit in WordPress after the first publish, or use the [webhook connector](/connectors/webhook)
  if you need update semantics.
</Note>

## Common problems

<AccordionGroup>
  <Accordion title="“WordPress rejected those credentials”">
    The username or application password is wrong. Check you used the *username*, not the email,
    and generate a fresh application password — a copied password with a missing character fails
    silently in most password managers.
  </Accordion>

  <Accordion title="“Couldn't reach the WordPress REST API”">
    We tried both `/wp-json/` and `?rest_route=` and neither returned JSON. Usually one of:

    * a security plugin blocking the REST API,
    * the site sitting behind HTTP basic auth, a staging password, or Cloudflare "Under Attack" mode,
    * a site that is not reachable from the public internet.

    Test it yourself: open `https://yoursite.com/wp-json/wp/v2/types` in a browser. You should
    see JSON, not a login page or a 403.
  </Accordion>

  <Accordion title="Publishing works but the featured image is missing">
    Image uploads need a writable `wp-content/uploads` directory. If WordPress can't write there,
    the post still publishes — just without its image.
  </Accordion>
</AccordionGroup>
