Importundo

Reference · since 1.2.0 · needs ACF active

Advanced Custom Fields

Choose the content type and the mapping screen lists that type's ACF fields under their own heading, labelled the way your field group labels them — so a column called Page count maps itself. Everything else still applies: the preview, the whole-file check, the unchanged-row skip and the rollback all work the same way.

An ACF field is two rows, not one

ACF stores every value twice: once under the field's name, and once under the same name with an underscore in front, holding the field key. The second row is how ACF knows which field definition owns the value.

Write only the first — which is what writing a custom field by hand does — and the result reads back correctly from get_post_meta(), the import reports success, and the edit screen shows the field empty. As far as the field is concerned nothing was ever set, so the next save writes that emptiness back over your import.

So values go through ACF's own update_field(). Which is also what makes the second half work.

A spreadsheet says one thing; ACF stores another

A CSV holds what a person would type. ACF stores what a template expects to read back. Those are rarely the same thing, and writing the raw cell into any of these produces a value that looks plausible in the database and breaks the template reading it — a checkbox field that returns a string instead of an array is a fatal in every foreach that touches it.

The translation happens on the way in:

Field typeWrite in the cell
Text, textarea, WYSIWYG, email, URL, password, colour, oEmbedThe value itself.
Number, rangeNumbers only. Anything else is reported and the field left alone.
True / falseyes or no. 1, true, y and an empty cell are all understood.
Select, radio, button groupEither the label you see in the dropdown or the value stored behind it — Hardback and hb both work.
CheckboxSeveral of the same, separated by commas. Stored as the list ACF expects, not as the text of the cell.
Date picker, date and time picker, time pickerA date in any format the importer reads. It is stored in the form ACF keeps, whatever the spreadsheet had, so two files written in different countries import to the same day.
Post object, page link, relationshipThe title, slug or ID of the content to point at. Several separated by commas. The field's own post-type restriction is respected.
UserA username, email address or user ID.
TaxonomyTerm names separated by commas. Names that do not exist yet are created when the field is set to allow it, and reported when it is not.
Image, fileA full web address. Downloaded into your media library, and a file already there is reused rather than fetched twice.
LinkAn address, optionally followed by a vertical bar and the link text: https://example.com | Read more.
Google MapAn address, or a latitude and longitude separated by a comma.

A value a field will not take is named in the preview, before anything is written — a misspelled choice is a minute's work in the spreadsheet, and only worth knowing while the spreadsheet is still the thing you are editing. The row still imports; only that one field is left alone.

Tabs, accordions and messages are not offered. They draw the edit screen and hold no value, so a column mapped to one would import cleanly and write nothing.

Repeaters

Needs Importundo Pro. Without it, the free importer names the field, says it is a Pro repeater, and leaves it alone rather than half-writing it.

ACF Pro

A repeater is mapped one column per field inside it, rather than as a whole. Each column holds that field down the rows, separated by a vertical bar, and the rows are rebuilt by position. That is also the shape a spreadsheet exports a list in, so the columns are often already there.

post_title,Chapter title,Chapter pages,Chapter kind
The Long Way Round,One | Two | Three,10|20|30,Prose|Verse|Prose

That row makes three chapters. The vertical bar separates rows rather than a comma, because a repeater row very often contains a value with a comma in it, and a file that has to escape its own separator is a file people get wrong.

Ragged columns are fine. Three chapters where only two have a page count is ordinary, so the row count comes from the longest column and the missing value is simply empty. Taking the shortest would silently drop a row the file plainly describes.

Everything in the table above applies inside a row too: a choice sub-field written as its label is stored as its value, a date is reformatted, a number is a number.

Nested repeaters are not offered. The outer rows and the inner rows would both need a separator, and the file would have to say which was which.

Galleries

Needs Importundo Pro. Without it, the field is left alone and the preview says so.

ACF Pro

A column of web addresses separated by commas, in the order the gallery should show them. Each is downloaded into your media library, and one already there is reused rather than fetched twice.

One picture that cannot be fetched does not lose the others: it is reported and the rest of the gallery is kept, because a gallery missing its third image is far more use than no gallery at all.

Clones and groups

ACF Pro

Nothing special to do. ACF stores what a clone or a group contains as ordinary fields of the post — its own documentation is explicit that cloning does not change the data structure — so that is how they are offered: as the fields themselves, under the names ACF actually writes, including the prefix when a clone adds one.

Flexible content is not imported

ACF Pro

This is the one that is refused, and deliberately.

Every row of a flexible-content field picks its own layout, and each layout has a different set of sub-fields. A fixed set of spreadsheet columns cannot say which layout row three is — and a file that got it wrong would not fail. It would quietly build the wrong page.

So it is not offered as a target, and a saved mapping that names one is answered with that reason rather than with silence. Set those fields on the edit screen.

What undo covers

All of it, including the field-key row. Restoring a value without the key beside it would leave a field ACF cannot see — the very state this exists to prevent, reached by the undo instead of the import — so both rows are captured before the row is written and both are put back.

For a repeater that means every row it holds, not only the count: an import that turned three chapters into four is undone to three, with no fourth left behind. The rollback reference covers the limits, which are unchanged.