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

# Export from Surfer

> Send a Content Editor's content to a WordPress post, as a new draft or as an update to an existing post.

Your site must already be connected to Surfer, and your plan must include the WordPress integration. See [Availability](/integrations/wordpress/setup#availability). The export starts inside the [Content Editor](/integrations/guidelines-panel), the document Surfer builds around your target keywords, holding the guidelines and the Content Score. It spends no credits ([Credits](/integrations/guidelines-panel#credits)).

An editor opened from a share link cannot export. Its **WordPress** button is disabled, with the tooltip `Not available on shared editors`. Sign in to Surfer and open the Content Editor there.

Before exporting to a site that uses Elementor, turn on Elementor's container feature. Without it the export may fail. See [Troubleshooting](/integrations/wordpress/troubleshooting#a-notice-says-there-may-be-an-issue-with-elementor).

## Start the export

The **WordPress** button sits in the **Publish or Export** step of the Content Editor's workflow sidebar.

**1. Open the Publish or Export step**

In the Content Editor's sidebar, select **Publish or Export**, the fifth
step of the workflow.

**2. Check which site is connected**

Under **Export**, read the line below the **WordPress** button.

* A green dot with **Connected to:** names your connected site.
* With several connected sites, **Connected to:** shows their count.
* A red dot with **Not connected to any WordPress site** means no site is connected.

**Manage** opens **Settings → Integrations → WordPress** in a new tab.

**3. Select WordPress**

Select **WordPress**. The **Export to WordPress** dialog opens.

With no site connected, **WordPress** opens **Connect with WordPress** instead of the export dialog. It explains that the plugin moves content in both directions, and **How to connect** opens the WordPress settings in Surfer. Connect a site by following [Set up the WordPress plugin](/integrations/wordpress/setup). Then start the export again.

## Choose the site and the target

Choose the destination site in the first step. You can create a new draft or update an existing post.

1. Pick the site under **Select a domain**. With one connected site, the dialog shows it under **Domain** and there is nothing to pick.
2. Under **What you want to do?**, choose **Create new Draft** or **Update existing Post**.
3. Select **Next**. **Manage WordPress Integrations** in the footer opens the same settings page as **Manage**.

With **Update existing Post**, the next step lists the site's posts and pages, a page at a time. Each row shows the status and the last edit, and the info icon adds the author and the creation date. Narrow the list when you need to:

* Search by title with **Type Post title**.
* Filter by status with the tabs **All**, **Draft**, **Pending**, **Future**, and **Published**. Each tab shows a count, and private posts appear under **All** only.

Then pick the target:

1. Select the post. A post without a title reads **Title has not been added yet**.
2. Select **Next**.

When nothing matches, the list reads **No Posts yet**. When a **Connection issue** note replaces the list, see [Troubleshooting](/integrations/wordpress/troubleshooting).

## Fill in the post settings

New drafts and updates use the same settings. Confirming writes every displayed value to the post.

| Field | What it sets | Default or prefill |
| - | - | - |
| **Title** | The post title. | Updates use the post's current title. New posts, and updates with an empty title, use your document's first H1, or `(no title)` when it has none. |
| **Status** | **Draft**, **Published**, **Pending**, **Future**, or **Private**. | New posts default to **Draft**. Updates use the post's current status. |
| **Publication date** | When a **Future** post goes live. Shown only while **Status** is **Future**. | The field starts empty. The date must be in the future. |
| **Type** | **Post**, **Page**, or any other public post type the site registers. | New posts default to **Post**. Updates use the post's current type. |
| **Category** | One or more categories, from the site's 50 most used. | New posts start with no categories selected. Updates use the post's categories. |
| **Tags** | One or more tags, from the site's 50 most used. | New posts start with no tags selected. Updates use the post's tags. |
| **Author** | The post author, from the site's administrators, editors, and authors (up to 50). | New posts start with no author selected. Updates use the post's author. |
| **Meta title** | The SEO title, written to the site's SEO plugin (see [What arrives](#what-arrives-in-wordpress)). | The post's current value for an update. Otherwise, the title under **Meta tags** in the same **Publish or Export** step. |
| **Meta description** | The SEO description, written to the site's SEO plugin. | The post's current value for an update. Otherwise, the description under **Meta tags** in the same **Publish or Export** step. |

* Empty **Category**, **Tags**, and **Author** fields use defaults from the [plugin settings](/integrations/wordpress/setup), if those defaults are set.
* Changing **Type** reloads the custom fields preview for that type.
* The type, category, tag, and author lists stay the same when **Type** changes.

**Custom fields** appears below the settings when your organization has the feature enabled. Your site must also have Advanced Custom Fields (ACF) field groups for the chosen type.

* The preview shows the ACF values that the export writes.
* Values are grouped by ACF field group.
* An asterisk marks each required field.
* Surfer proposes each value from your article.
* The preview is read-only.

If the values fail to load, the dialog says so and the confirm button stays disabled. See [Troubleshooting](/integrations/wordpress/troubleshooting#the-export-dialog-cannot-load-custom-fields).

The dialog has no slug, featured image, or excerpt field. Set those in WordPress after the export.

![The Export to WordPress dialog on the post settings step for a new draft, showing the Title, Status, Type, Category, Tags, Author, Meta title, and Meta description fields and the Create New Post button.](https://mintcdn.com/surfer-1a8fda11/4kbtukCU_qZDIZlN/images/integrations/wordpress/wordpress-export-form.png?fit=max\&auto=format\&n=4kbtukCU_qZDIZlN\&q=85\&s=8d18bfff67ff4f7d960088d3a7d9a8e5)

The tour below shows the same flow.

[https://app.guideflow.com/player/dr935z6bor](https://app.guideflow.com/player/dr935z6bor)

## Confirm and finish

The dialog checks the content, title, and date before exporting. The confirm button's label identifies the action.

For a new post, the step reads **A new post will be created with the following settings:** and the button is **Create New Post**, or **Create New Page** when **Type** is a page. With **Future** as the status, the button reads **Schedule New Post**.

For an update, the dialog compares **Last edit in Surfer** with **Last edit in WordPress** below the settings. When the WordPress edit is the later one, it warns **There is a newer version of the article in WordPress**. Overwriting discards that edit. The button is **Overwrite the Post**, or **Schedule the Post** with **Future** as the status.

![The update confirmation step comparing the last edit in Surfer with the last edit in WordPress, with the newer-version warning and the Overwrite the Post button.](https://mintcdn.com/surfer-1a8fda11/4kbtukCU_qZDIZlN/images/integrations/wordpress/wordpress-export-confirm.png?fit=max\&auto=format\&n=4kbtukCU_qZDIZlN\&q=85\&s=4d3e547dbdf64c51f27fb2ebbe5558ba)

The export runs these three checks in order. It stops at the first failure.

| Check | Message |
| - | - |
| Empty content | `Empty Content` with `We can't export empty content. Please type something first.` |
| Empty title | `Title can not be empty.` under **Title**, and `Empty Title` with `We can't export post without a title.` |
| Publication date in the past | `Post scheduled date need to be set in future.` under **Publication date**, and `Wrong Date` with `Scheduled date need to be in future.` |

Site errors, including redirects and timeouts, appear in the same place with their codes. See [Troubleshooting](/integrations/wordpress/troubleshooting) for fixes.

The plugin accepts up to 5 MB of content in one export. Larger content fails with `Unknown Error`.

Select the confirm button to run the export. The success screen says that WordPress has been updated and synced with Surfer. **Edit in WordPress** opens the post in wp-admin in a new tab, and **Close** returns you to the Content Editor.

## Verify it is working

The post is in WordPress with the settings you chose, and it is linked to the Content Editor.

1. On the success screen, select **Edit in WordPress**. The post opens in wp-admin with the exported content, and the Surfer panel carries the Content Editor's guidelines for it.
2. In wp-admin, open the list for the type you chose, **Posts** or **Pages**. The post is listed with the status you picked, and its row actions include **Check in Surfer**, which opens the Content Editor. [Write in WordPress](/integrations/wordpress/write) covers the post list.

## What arrives in WordPress

The plugin rebuilds your document for the site's editor. It copies the images into the media library.

* The **Title** field becomes the post title, and the document's first H1 leaves the body. Classic Editor removes every H1.
* Headings, paragraphs, lists, quotes, code blocks, and separators become the matching blocks in Gutenberg (the block editor) and widgets in Elementor. Classic Editor receives them as HTML.
* Links keep their addresses. In Gutenberg and Classic Editor each link gets the `rel` and `target` set in the [plugin's link settings](/integrations/wordpress/setup), with separate values for internal and external links. Elementor keeps links as written.
* Tables become a table block in Gutenberg and an HTML widget in Elementor. Classic Editor receives the table as HTML.
* Meta title and meta description go to the SEO plugin selected by the [plugin settings](/integrations/wordpress/setup#plugin-settings). With no supported SEO plugin active, the plugin keeps both values for its own use, prefilling the next export of that post and sending them to Surfer with its text. Nothing prints them on the page.
* The content is built for the editor the plugin detects, Gutenberg, Classic Editor, or Elementor, unless the [plugin settings](/integrations/wordpress/setup) name one. The same settings choose the templates an Elementor post gets.

### Images

The plugin copies each image into the media library. The post points to the copy.

* Each filename comes from the last part of the image's address in Surfer.
* The plugin adds an extension when the address has none.
* The plugin keeps the alt text.
* An image Surfer generated has no filename of yours to keep, so it arrives under a generated name.
* With eight or fewer images, the plugin downloads them during the export.
* With more than eight images, the export finishes first and the site downloads the images in the background.
* Background processing downloads three images at a time and replaces each link as its copy lands.
* **Image Processing Mode** in the [plugin settings](/integrations/wordpress/setup) forces either behavior.
* An image the site cannot fetch is replaced with the plugin's placeholder image, in the background mode after three attempts.
* Exporting the document again reuses the images already in the media library and refreshes the links in the post.

The plugin copies only images within these limits:

| Limit | What happens to the rest |
| - | - |
| File type | The plugin copies only JPEG, PNG, GIF, WebP, and AVIF files. Any other file keeps its original address. |
| File size | The plugin replaces an image of 10 MB or more, or of more than 40 million pixels, with the placeholder image. |
| Images per export | Each export copies up to 100 images. Remaining images keep their original addresses until a later export copies them. |
| Background downloads | The background queue holds up to 500 images from all exports. An image that does not fit keeps its original address. |

Whether an image keeps its own filename depends on how it reached the Content Editor:

* Surfer stores images you upload from your computer under generated names. You can upload them by file picker, drag and drop, or pasting a copied image file. They arrive in WordPress under those names.
* An image Surfer imports from a page's URL also arrives in WordPress under a generated name.
* An image you copy or drag from a page where it is already hosted keeps its address. It keeps its name.
* Images in content sent from WordPress to Surfer keep their names too.

## Update a post you exported before

The export links the Content Editor to the post, and running it again with **Update existing Post** overwrites that post.

* The Surfer panel in the WordPress editor shows the Content Editor's guidelines on the exported post.
* Surfer records the one post each Content Editor last synced with. Exporting the Content Editor to a different post moves that record.
* The earlier post stays linked in WordPress. While two posts on the site are linked to one Content Editor, neither can send its text to Surfer. [Unlink](/integrations/wordpress/write#unlink-a-post) the earlier post.
* The dialog does not preselect the linked post. Choose **Update existing Post** and pick the post from the list.
* Overwriting replaces the post's title, body, status, type, categories, tags, author, meta title and description, and custom fields with the values shown in the dialog. Edits made in WordPress since the last export are lost. The newer-version warning in the confirmation step is about those edits.
* A published post keeps its original publication date. **Publication date** applies only to a **Future** status, and only when the date is in the future.

To send the WordPress text back to Surfer, use the Surfer panel in the WordPress editor. [Write in WordPress](/integrations/wordpress/write) covers it.

## Troubleshooting

Every symptom and its fix lives on the [troubleshooting page](/integrations/wordpress/troubleshooting). These are the ones an export runs into.

* [The status line reads **Not connected to any WordPress site** although you connected the site](/integrations/wordpress/troubleshooting#the-status-line-reads-not-connected-to-any-wordpress-site).
* [The post picker shows **Connection issue** instead of the list](/integrations/wordpress/troubleshooting#the-export-dialog-shows-connection-issue-or-you-dont-have-access-to-advanced-posting-options).
* [The settings warn that you do not have access to advanced posting options, and the lists stay empty](/integrations/wordpress/troubleshooting#the-export-dialog-shows-connection-issue-or-you-dont-have-access-to-advanced-posting-options).
* [The custom fields preview fails to load](/integrations/wordpress/troubleshooting#the-export-dialog-cannot-load-custom-fields).
* [The export fails with **Unknown Error**](/integrations/wordpress/troubleshooting#unknown-error).
* [Images are missing, or still point to Surfer, after the export](/integrations/wordpress/troubleshooting#images-are-missing-after-an-export).
* [After an export to a different post, WordPress says the Content Editor is already connected with another post](/integrations/wordpress/troubleshooting#this-content-editor-is-already-connected-with-another-post).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.