Skip to content

WordPress 6.6 or later · the plugin connects, no password shared

Publish your spreadsheet to WordPress. Update it from the next one.

Drop in the Excel or CSV file you already have. Content Uploader creates your posts, pages or custom post types from its columns, shows you every change before anything is written, and updates the same items from the next file.

  • Posts, pages and custom post types
  • Categories, tags, custom fields, a featured image
  • The next file updates what it published
Demo: publishing an auction house’s spring sale catalogue to WordPress

Blackwell & Hart · Spring Sale 2027

Review first

spring-sale-catalogue.xlsx

64 rows · 11 columns

  • Headers read, separator detected
  • All 11 columns found
  • 64 rows checked, field by field
  • Compared with what you published last time

spring-sale-catalogue.xlsx

64 rows checked against what you published last time

Checked
New
9
Updated
12
Unchanged
42
Errors
1
  • Updated

    Lot 17: 1961 Castellane GT Spider

    Estimate from £450,000 → £480,000 · Estimate to £550,000 → £560,000

  • New

    Lot 58: 1936 Linden Phaeton

    New category: Spring Sale 2027 › Coachbuilt

  • Error

    Row 41 · Lot 40: 1967 Varga Tipo 12

    Estimate from: The resolved value must be a number, such as 12 or 12.5.

Dropping the spring sale catalogue.

An example: the spring sale catalogue of a fictional auction house, Blackwell & Hart.

What it does for your site

Turn rows into posts, and look before anything goes live.

Content Uploader is a web service that turns a spreadsheet into content on your WordPress site. You install a small plugin and approve the connection once. Then you drop an Excel or CSV file, and it creates or updates your posts, pages or custom post types, after showing you every change.

What is Content Uploader?

  • Every field of a post, from your columns

    Title, address, status, author, date, text, excerpt, categories, tags, custom fields and a featured image, each from a column you choose, in files of up to 10,000 rows.

    What a row can fill
  • See it before it goes live

    The review lists what is new and what changes, field by field, and names every row with a problem. Nothing is written until you approve it, and new items start as drafts unless you say otherwise.

    How the review works
  • The next file is one drop

    You map the columns once. The next file updates the items Content Uploader published and adds the new rows, and what did not change is left alone.

    How it avoids duplicates
  • Categories, tags and pictures included

    Category paths such as Spring Sale 2027 › Competition cars, tags from one column or two, and photographs from a ZIP you drop with the file. Missing categories and tags can be created for you, parents first.

    Categories

How it works for WordPress

Connect once, map once. Then every file is drop, review, publish.

Your site gets a small plugin. After that, the file is the only thing you bring each time.

  1. 1

    Install the plugin and connect your site

    Download the Content Uploader plugin ZIP from the Sites page, upload it in WordPress under Plugins and activate it. Then select Connect in Settings › Content Uploader and approve the connection as a workspace owner. No WordPress password is entered anywhere.

    Installing the plugin

  2. 2

    Map your columns once

    Choose Posts, Pages or a custom post type, then say which column becomes the title, the text, the categories and so on. Columns whose names match a field are chosen for you, and the preview shows any row as it will be published before you save.

    How mapping works

  3. 3

    Drop the file, read the review, publish

    The review shows what is new, what changes and which rows have a problem. When you approve it, publishing runs in the background and you are emailed when it has finished. The next file starts here.

    Publish your changes

What a row becomes

Every field a post has, filled from the columns you choose.

A page or a custom post type works the same way. The auction house’s lots are a custom post type: pick a lot to see what WordPress would get.

Title
Required, as plain text. A template gives every row its own, as the lots below show.
Address (slug)
From a column or a template. WordPress makes it safe and unique, and makes it from the title when it is left empty.
Status
Draft or Pending review, and Published or Private when the connecting account may publish. Without a Status column, new items arrive as drafts.
Author
By name, or by user ID, username or email address when the account may list users. Left empty, a new item gets the account that publishes.
Publish date
A date and time. A future date on a published item schedules it.
Text and excerpt
As HTML, from a column that already holds it or built from several columns. The excerpt is offered for pages and for types that support it.
Comments
Open or closed, as the site’s own setting for that type unless you say otherwise.
Parent and menu order
For pages and other types that have levels.
Categories, tags and other taxonomies
Several per item, from columns or fixed. Missing ones can be created, parents first.
Custom fields
Any custom field stored as post meta, filled by its name. One the site registers as a number must hold a number.
Featured image
From a ZIP you drop with the file, a web address or the media library, with alt text, title and caption.

Every field and what it accepts: WordPress content types and fields.

spring-sale-catalogue.xlsx

Pick a row to preview

Sample spreadsheet rows. Choose one to preview its page.
PreviewLotYearMarqueModelEstimate fromCategoryTags
171961CastellaneGT Spider480000Spring Sale 2027 > Competition carsMatching numbers, Concours
181958VargaSport 750310000Spring Sale 2027 > Competition carsOne owner, Matching numbers
241964LindenAlbany Coupé95000Spring Sale 2027 > Grand tourersConcours
311972DelmareBerlinetta140000Spring Sale 2027 > Grand tourersOne owner

Title ← Lot {{ Lot }}: {{ Year }} {{ Marque }} {{ Model }}

Slug ← lot-{{ Lot }}-{{ Year }}-{{ Marque }}-{{ Model }}

Category ← Category, read as a path · Tags ← Tags, split on commas

Featured image ← Photo, from the ZIP · Custom fields ← Year, Chassis no., Estimate from, Estimate to

Preview · row 2

Nothing is written to your site

Spring Sale 2027 › Competition cars

Lot 17: 1961 Castellane GT Spider

yoursite.com/lots/lot-17-1961-castellane-gt-spider/

Year
1961
Marque
Castellane
Estimate from
£480,000
  • Matching numbers
  • Concours

Status: DraftRecord ID 17

The title is Lot {{ Lot }}: {{ Year }} {{ Marque }} {{ Model }}, written once for every lot. Nothing here is written to a site. Custom post types appear when WordPress’s REST API makes them available and the connecting account may edit them.

What you set up once, and what you read each time

The parts that save the most work.

These pictures are from the Help Center’s tutorials: a sailing magazine, not the auction house above.

Categories and tags

A whole category path in one cell

Write the path with the parent first, Spring Sale 2027 > Competition cars, and the lot goes in the last level. The levels above it are used, or created, too. Tags work the same way, from one column or several, each with its own separator.

Before anything is created, the review lists the categories and tags it will make, with the parents they add, so a typo shows up as a stray new category while you can still fix the file.

Categories · Tags · New categories and tags in the review

The category settings: a Category path column, Parse paths ticked, the separator and the option to add new categories
1: the column that holds the path. 2: read paths such as Parent > Child. 3: the separator. 4: create the categories that are missing.

The next file

The next file is compared with what was last published

The second file of the Help Center’s example has ten rows. Two are new, three are updated and five are unchanged, so five rows are written. An updated item lists just the fields that change, with the value last published struck through.

Updating content that is already published · Update existing content from the next spreadsheet

The review summary for the second file: two new, three updated, five unchanged
Two new, three updated, five unchanged: 10 rows, of which five will be written. 1: new. 2: updated. 3: unchanged. 4: what the numbers are compared with.

Titles, addresses and bodies

Built from your columns, with a template

A title such as Lot {{ Lot }}: {{ Year }} {{ Marque }} {{ Model }} gives every row its own, and the same works for the address and the excerpt. For the text, a column that already holds HTML goes in as it is. Or write the body in an editor with a toolbar and drop columns where you want them.

Templates and placeholders · Content and HTML · Publish formatted text

The Content field set to Template: the list of columns, the editor’s toolbar and a body with a heading and two placeholders
1: the columns. 2: one is inserted at the cursor. 3: the HTML source. 4: the body.

When a row has a problem

The row is named, and the rest goes ahead

A custom field the site registers as a number must hold one, so lot 40’s estimate of TBC is listed under Errors with its row number, and the rest of the file goes ahead. Fix the cell and upload the file again: the corrected row is published and the others show as unchanged.

Row errors: read them, fix them, upload again

The review’s Errors list: four rows with errors, grouped by message, each with its row number
1: the Errors count. 2: a problem with its rows. The Help Center’s example file has four, one for each common mistake.

Said plainly

What it does not do.

So that you do not find out after you start.

  • Posts made by hand are not matched

    Content Uploader updates the items it published. A post written by hand, or published with another tool, is not matched by anything, so a row with the same title makes a new post beside it. Try the first import on a copy of your site.

  • Nothing is deleted

    A row you take out of the file does not take its post off your site. Posts, pages, files and categories are only created and updated.

  • You upload each file

    A spreadsheet is never fetched from a web address or from the cloud, and nothing runs on a schedule. A person drops each file.

  • One site and one content type at a time

    A configuration publishes to one site and one content type. The site needs HTTPS at a public address; WordPress multisite networks, sites on a private address and sites behind a password are not supported.

  • The file wins over edits made on the site

    Matching looks at what was last published, not at the live item. When a row changes, every mapped field is sent, so an edit made on the site to one of them is replaced. Set a field to Keep existing on updates to let the site own it.

  • Fields other plugins keep elsewhere

    Custom fields are post meta: a plugin that keeps its data in its own tables cannot be filled. Menus, users and comments are not offered, and a post has one featured image and no gallery.

Can I update posts I created by hand? · Every known limitation

Try it

Start with the example files.

Small files from the Help Center’s tutorials, about a made-up sailing magazine. Use a test site: publishing creates real posts.

  • A first import, and the same file again later

    Eight sailing articles with an ID, a title, an HTML body, a category and tags. In the second file, two are new, three are edited and five are unchanged: the review of an update.

  • Categories and tags

    Twelve articles with a category path, a section and topic pair, and two tag columns with different separators.

  • Articles with pictures

    Twelve articles with a slug, a summary, a category path, tags, an author, a publish date, a status, an image, its description and a custom field. Drop the workbook together with the ZIP of its twelve images.

  • Rows with problems

    Seven articles, four of them with a problem: an empty title, a repeated ID, a date that is not a date and an unknown status.

To see a whole file go through, follow Create one hundred WordPress posts from one spreadsheet, about 15 minutes.

FAQ

What people ask before they connect a site.

The questions that come up before the first file.

Will I get duplicate posts?

Not if each item keeps the same record ID in every file. A known ID is always an update, the same file twice finds everything unchanged, and a retry cannot make a second copy. Without an ID column, the title (or the slug) is what identifies a row, so a renamed title is a new item. The review shows every row as new, updated or unchanged before you publish.

Can I update posts I created by hand?

Not directly. Content Uploader matches rows only against items it published itself, to the same site and content type. A post written by hand, or published with another tool, is not matched by ID, slug or title, so a row with the same title makes a new post beside it. To bring such content under its control, publish it from a spreadsheet first, tidy up the old copy by hand, and try the first import on a staging copy of your site.

Will my posts go live straight away?

Only if you choose. When the file has no Status column, new items are created as drafts for you to read on the site. Map a Status column, or set a fixed Published, when you want them live. WordPress schedules a published item that has a future date, and Published and Private are offered only when the connecting account may publish.

Which content types can I publish to?

Posts, pages and the custom post types that WordPress’s REST API makes available and that the connecting account may edit, and, on a shop with WooCommerce 9.0 or later, products and their variations. The Sites page lists exactly what your site offers. A type that is missing is usually not exposed to the REST API, or the account may not edit it.

Can I fill custom fields?

Yes: any custom field stored as post meta, by its name, from a column, a fixed value or a template. One the site registers as a number, a whole number or yes/no is checked against that type, and an empty cell removes the value. A plugin that keeps its data in its own tables cannot be filled, and one that needs more than the plain value, such as a hidden reference to the field’s definition, may not show a value written by name: try one item first.

What does my site need?

WordPress 6.6 or later and PHP 8.1 or later, served over HTTPS at a public address, not a development machine or an intranet address. A WordPress administrator installs the plugin and starts the connection, and a workspace owner approves it. Multisite networks are not supported.

Do I have to share my WordPress password?

No. You install the plugin on your site and approve the connection there. Content Uploader is never signed in to your site: each request is checked against the permissions of the administrator who approved the connection, limited to content, and it can never delete anything. You can disconnect from either side at any time.

What about WooCommerce?

A shop is a WordPress site, so the same plugin connects it, and with WooCommerce 9.0 or later Products appears beside Posts and Pages, with its own checks for prices, stock and sales.

Publish your first file.

Create your workspace, connect your site and drop your spreadsheet. Nothing is written to your site until you have looked at the review.

Selling things? Update a WooCommerce shop. A page for every town or service? Location pages. Listings that keep changing? Listings and directories. Moving from another system? Migration from an export. Choosing between tools? Content Uploader and WP All Import. Not ready yet? Start with the quick start.