Alternative CSV Importer plugin. Simple and powerful, best for geeks. Category support Tag support Custom field support Smart Custom Fields support Custom Field Suite support Advanced Custom Fields support Custom Taxonomy support Custom Post Type support Filter hook for dry-run-testing Filter hooks
PricingFree downloadThe WordPress.org download is free. Pro versions, add-ons or external services may cost extra.
CompatibilityRequires WordPress 3.6.
SourceWordPress plugins · Oct 19, 2026
01 / Source details
About this tool.
Alternative CSV Importer plugin. Simple and powerful, best for geeks.
Category support
Tag support
Custom field support
Smart Custom Fields support
Custom Field Suite support
Advanced Custom Fields support
Custom Taxonomy support
Custom Post Type support
Filter hook for dry-run-testing
Filter hooks for customized csv data importing to database
Action hook for update post data after importing to database
You can get example CSV files in /wp-content/plugins/really-simple-csv-importer/sample directory.
Available column names and values:
ID or post_id : (int) post id. This value is not required. The post ID is already exists in your blog, importer will update that post data. If the ID is not exists, importer will trying to create a new post with suggested ID.
post_author : (login or ID) The user name or user ID number of the author.
post_author_login : The user name of the author.
post_date : (string) The time of publish date.
post_content : (string) The full text of the post.
post_title : (string) The title of the post.
post_excerpt : (string) For all your post excerpt needs.
post_status : (‘draft’ or ‘publish’ or ‘pending’ or ‘future’ or ‘private’ or custom registered status) The status of the post. ‘draft’ is default.
post_password : (string) The password to protect the post. The password is limited to 20 characters.
post_name : (string) The slug of the post.
post_parent : (int) The post parent id. Used for page or hierarchical post type.
post_type : (‘post’ or ‘page’ or any other post type name) (required) The post type slug, not labels.
post_thumbnail : (string) The uri or path of the post thumbnail. E.g. http://example.com/example.jpg or /path/to/example.jpg
post_category : (string, comma separated) slug of post categories
post_tags : (string, comma separated) name of post tags
tax_{taxonomy} : (string, comma separated) Any field prefixed with tax_ will be used as a custom taxonomy. Taxonomy must already exist. Entries are names or slugs of terms.
{custom_field_key} : (string) Any other column labels used as custom field
cfs_{field_name} : (string) If you would like to import data to custom fields set by Custom Field Suite, please add prefix cfs_ to column header name.
scf_{field_name} : (string) If you would like to import data to custom fields set by Smart Custom Fields, please add prefix scf_ to column header name.
comment_status : (‘closed’ or ‘open’) Default is the option ‘default_comment_status’, or ‘closed’.
Note: Empty cells in the csv file means “keep it”, not “delete it”. Note: To set the page template of a page, use custom field key of _wp_page_template . Note: If providing a post_status of ‘future’ you must specify the post_date in order for WordPress to know when to publish your post. Note: If the post_type value is attachment , you can use post_thumbnail field to define media URL or path.
Advanced Custom Fields plugin integrate
If advanced custom field key is exists, importer will trying to use update_field function instead of built-in add_post_meta function. How to find advanced custom field key: Finding the field key
Official public repository
This plugin is now maintained by websoudan , taking over from the original author Takuro Hishikawa (@hissy). Thank you hissy for all the years of work! Add star and read future issues about rs-csv-importer on GitHub !
Thanks
Cover banner designed by @ luchino__
How to debug import data
Really Simple CSV Importer Debugger add-on enables you to dry-run-testing and show more detailed post, meta, taxonomy data of each csv row. Download from gist .
How to customize import post data
There are three filters available in the importer.
really_simple_csv_importer_save_post
This filter is applied to post data.
Parameters:
$post – (array)(required) post data
$is_update – (bool) update existing post data, or insert new post data
Example:
function really_simple_csv_importer_save_post_filter( $post, $is_update ) { // remove specific tag from import data if (isset($post['post_tags'])) { $_tags = array(); foreach ($post['post_tags'] as $tag) { if ($tag != 'Apple') { $_tags[] = $tag; } } $post['post_tags'] = $_tags; } return $post; } add_filter( 'really_simple_csv_importer_save_post', 'really_simple_csv_importer_save_post_filter', 10, 2 );
$post_thumbnail – (string)(required) the thumbnail file path or distant URL
$post – (array) post data
$is_update – (bool)
Example:
function really_simple_csv_importer_save_thumbnail_filter( $post_thumbnail, $post, $is_update ) { // Import a local file from an FTP directory if (!empty($post_thumbnail) && file_exists($post_thumbnail)) { $upload_dir = wp_upload_dir(); $target_path = $upload_dir['path'] . DIRECTORY_SEPARATOR . basename($post_thumbnail); if (copy($post_thumbnail, $target_path)) { $post_thumbnail = $target_path; } } return $post_thumbnail; } add_filter( 'really_simple_csv_importer_save_thumbnail', 'really_simple_csv_importer_save_thumbnail_filter', 10, 3 );
How to customize the post data after importing to database
really_simple_csv_importer_post_saved
This action provides availability to run some tasks after importing.
Example: Download image from remote url to custom field (Download from gist )
How to customize the importing process entirely
really_simple_csv_importer_class
This filter provides availability to completely replace the RS_CSV_Importer#save_post method.
Example: Update row based on a custom field ID/key match (Download from gist )
02 / Source details
Getting started.
01Upload All files to the /wp-content/plugins/ directory.
02Activate the plugin through the ‘Plugins’ menu in WordPress.
03Go to the Import page under Tools menu.
04Click CSV link, read the notification, then just upload and import.
03 / Source details
Frequently asked questions.
Should I fill all columns of post data?
No. Only columns which you want to update.
Can I update existing post data?
Yes. Please use ID field to specify the existing post.
Can I insert post with specific post id?
Yes. Please use ID field to specify the new post ID.
Can I import custom field/custom taxonomy of the post?
Yes. You can use column names same as wp_post table, but if the column name does not match, it creates a custom field (post meta) data. Importing custom taxonomy is a bit more complicated, “tax_{taxonomy}” means, “tax_” is prefix, and {taxonomy} is name of custom taxonomy (not labels).
or some other urls of files you want to import, and then use the really_simple_csv_importer_save_meta filter to hook into the import process,
add_filter( 'really_simple_csv_importer_save_meta', 'rsc_import_images',10,3); function rsc_import_images( $meta, $post, $is_update ) { //convert to an array $images = explode("|",$meta['cf47rs_images']); $meta['cf47rs_images']=array();//reset the meta field //directory to import images to $artDir = 'wp-content/uploads/imported_cf47rs_images/'; //if the directory doesn't exist, create it if(!file_exists(ABSPATH.$artDir)) { mkdir(ABSPATH.$artDir); } require_once(ABSPATH . 'wp-load.php'); require_once(ABSPATH . 'wp-admin/includes/image.php'); global $wpdb; //loop through each photos that need to be imported foreach($images as $file_url){ //let's get the image file name $new_filename = array_pop(explode("/", $file_url)); //move the file to our custom import folder if (@fclose(@fopen($file_url, "r"))) { //make sure the file actually exists $siteurl = get_option('siteurl'); $skip_attachment_insert=false; //check if this image has already been imported, if(file_exists(ABSPATH.$artDir.$new_filename) ){ //file already imported //either change the name of the file UNCOMMENT the following line //$new_filename = date("Y-m-d H:i:s").$new_filename; //.... or overwrite it, COMMENT OUT the next 3 lines of code if you choose to uncomment the renaming of file name. //in which case we want to find the attachment ID and store it in our meta field $attach_id = attachment_url_to_postid($siteurl.'/'.$artDir.$new_filename); $meta['cf47rs_images'][$attach_id] = $siteurl.'/'.$artDir.$new_filename; //no need to insert a new attachment, we reuse the same $skip_attachment_insert=true; } //(over)write the new file copy($file_url, ABSPATH.$artDir.$new_filename); if($skip_attachment_insert) continue; $file_info = getimagesize(ABSPATH.$artDir.$new_filename); //create an array of attachment data to insert into wp_posts table $artdata = array( 'post_author' => 1, 'post_date' => current_time('mysql'), 'post_date_gmt' => current_time('mysql'), 'post_title' => $new_filename, 'post_status' => 'inherit', 'comment_status' => 'closed', 'ping_status' => 'closed', 'post_name' => sanitize_title_with_dashes(str_replace("_", "-", $new_filename)), 'post_modified' => current_time('mysql'), 'post_modified_gmt' => current_time('mysql'), 'post_type' => 'attachment', 'guid' => $siteurl.'/'.$artDir.$new_filename, 'post_mime_type' => $file_info['mime'] ); $uploads = wp_upload_dir(); $save_path = $uploads['basedir'].'/imported_cf47rs_images/'.$new_filename; //insert the database record $attach_id = wp_insert_attachment( $artdata, $save_path ); $meta['cf47rs_images'][$attach_id] = $siteurl.'/'.$artDir.$new_filename; //generate metadata and thumbnails, comment this out if you don't want thumbnails if ($attach_data = wp_generate_attachment_metadata( $attach_id, $save_path)) { wp_update_attachment_metadata($attach_id, $attach_data); } } } return $meta; }
Website LLMs.txt and LLMs-Full.txt Generator is an LLMs.txt generator and llms-full.txt generator for WordPress. It helps site owners generate, manage, preview, validate, and serve AI discovery files from published public content. Use it to create structured /llms.txt and optional /llms-full.txt end
EngageDock AI is a customizable floating contact widget for WordPress websites that want more leads and faster visitor communication. It helps small businesses turn website traffic into calls, texts, emails, and callback requests from one clean contact panel. Key Features: Click-to-Call – One tap ca
Altify AI is an auto ALT text and AI ALT text plugin for WordPress images. It helps generate descriptive image ALT text for accessibility and image SEO. Use bulk image ALT text tools for your Media Library, generate featured image ALT text automatically, and scale WooCommerce image ALT updates with
The Accepted Payment Methods plugin is a straightforward, lightweight solution that enhances your website by displaying visually appealing icons of the payment methods you accept. This plugin is ideal for a variety of websites, including e-commerce platforms, service-oriented websites, and informati