drupal / import_csv
Create nodes, users, taxonomy terms, etc. from CSV files.
Installs: 10
Dependents: 0
Suggesters: 0
Security: 0
Type:drupal-recipe
pkg:composer/drupal/import_csv
Requires
- drupal/migrate_plus: ^6.0.5
- drupal/migrate_source_csv: ^3.7
- drupal/migrate_source_ui: ^1.2
Conflicts
- drupal/core: <10.3
README
This recipe lets you import data into your Drupal site from CSV files (plain-text spreadsheets).
Installation
Installation is standard. You need Drupal core 10.3.0 or later. If you have
installed drush, and this recipe is under the recipes/ directory, then you
can install Drupal and apply the recipe:
drush site:install
drush recipe recipes/import_csv
Usage
- Prepare an input file.
- Log in as an admin user.
- Visit Administration > Content > Migrate source UI
(
/admin/content/migrate_source_ui). - Choose a migration from the select list.
- Upload your CSV file.
- Submit the form (
Migrate).
Any spreadsheet program (or Google Sheets) can export in CSV format. For a
friendly view of the examples, you can save them in .csv files and open them
in a spreadsheet program.
The sections below (corresponding to the options in Step 4) specify the required column headers.
The id column
Each option has a required id column. Internally, Drupal keeps track of the
values in this column. If you ever import an item using the same migration and
the same id, then Drupal will either update the existing item or skip that row
of data, depending on whether you select the "Update existing records" option
before submitting the form.
Nodes
The source is a CSV file with the following columns:
id(required)type(required)title(required)body(optional, defaults to '')text_format(optional, defaults tobasic_html)user_id(optional, defaults to 0 for Anonymous)tag_ids(optional, colon-separated)
The type should be the machine name of a content type, such as page or
article (as in the Standard profile).
This recipe does not ensure that the basic_html text format is available.
Either make sure that is available (e.g., by applying the
core/recipes/basic_html_format_editor recipe) or treat the text_format
column as required.
The user_id column accepts values from the id column of the
import_csv_users migration, and the tag_ids column accepts values from the
id column of the import_csv_terms migration. If you want to assign more than
one tag, then separate them with colons (:).
The migration adds the tags to field_tags. If there is no such field on the
type content type, then this has no effect. You are responsible for choosing
terms from vocabularies that are allowed in the field_tags configuration. The
Standard profile adds field_tags to the Article (article) content type, and
configures it to use terms from the Tags (tags) vocabulary, but your site may
be different.
For example, if you
- Install the Standard profile.
- Apply this recipe.
- Import terms and users from the example CSV files in the sections below.
- Import the following CSV file
then you will get two Basic page (page) nodes (authored by Anonymous and
alice) and one Article (article) node (authored by bob) with two terms
from the Tags vocabulary.
id,type,title,body,text_format,user_id,tag_ids
1,page,First Test Page,,,,
2,page,Second Test Page,Some <strong>bold</strong> and <em>italicized</em> text.,full_html,alice,
3,article,Test Article,,,bob,1:2
Taxonomy terms
The source is a CSV file with the following columns:
id(required)name(required)description(optional, defaults to none)vocabulary(optional, defaults totags)parent(optional, defaults to none)
This recipe installs the same Tags vocabulary (machine name tags) as the
Standard profile. That is used as the default. To create a term in another
vocabulary, enter the machine name of the vocabulary in the vocabulary column.
The optional parent column references values from the id column in this or a
previously imported CSV file.
For example, if you create the Test Vocabulary (machine name test_vocabulary),
then you can import this CSV file. You will get two terms in the Tags vocabulary
and five terms in the Test Vocabulary. Term 4 will have two child terms and one
grandchild term.
id,name,description,vocabulary,parent
1,Term 1,,,
2,Term 2,Description of Term 2,tags,
3,Term 3,Description of Term 3,test_vocabulary,
4,Term 4,,test_vocabulary,
5,Term 5,,test_vocabulary,4
6,Term 6,,test_vocabulary,4
7,Term 7,,test_vocabulary,6
Users
The source is a CSV file with the following columns:
id(required)email(required)status(optional, defaults to Active)roles(optional, colon-separated, defaults to none)
The id value is also used as the username, so it must be a valid Drupal
username.
If there is already a user account with the same username, then that row of
the CSV file will be skipped, and the migration will save a migration message.
The status column should be "Active" or "Blocked" (or empty).
This recipe does not assume any particular roles exist. The roles column
should contain machine names of roles on the site. For example, if you install
the Standard profile, then use content_editor for the "Content editor" role.
(Actually, the migration will convert the values to valid machine names, so
"Content editor" also works.)
For example, if your site has roles "Role 1", "Role 2", and "Role 3",
then you can import this CSV file. The alice and bob accounts will have no
user roles (except for the Authenticated role that every account gets). The
actor account will have three roles.
id,email,status,roles
alice,alice@example.com,Active,
bob,bob@example.com,Blocked,
actor,actor@example.com,,role_1:role_2:role_3
Behind the scenes
These contrib modules do the real work: