Skip to content

Instantly share code, notes, and snippets.

@trey8611
Last active July 1, 2024 03:41
Show Gist options
  • Save trey8611/72fec5969651d5272fcb85f99b09b8bb to your computer and use it in GitHub Desktop.
Save trey8611/72fec5969651d5272fcb85f99b09b8bb to your computer and use it in GitHub Desktop.
WP All Import - Optimize your import speed.

WP All Import Optimizations

If you have a slow import, or if you're running into a lot of server timeouts, then you can follow these steps to optimize your import.

Slow Import Guide

Follow all of the steps listed here: http://www.wpallimport.com/documentation/troubleshooting/slow-imports/.

Skip posts if their data has not changed

You can enable Skip posts if their data in your file has not changed in the import settings of your existing imports: https://d.pr/i/x4tndp. When enabled, posts will be skipped if their data hasn't changed since the last time you ran the import. If the data hasn't changed, imports that used to take hours will complete in minutes.

Important notes:

  • This setting is enabled by default in new imports created with WP All Import v4.6.2 and above.
  • The "Keep images currently in Media Library" option must be enabled in order for this option to work.

Run the import via WP-CLI

As long as you're not importing a huge amount of data, you can use WP-CLI to import your data much faster: https://www.wpallimport.com/documentation/developers/wp-cli/. Please keep in mind that larger imports may not work via WP-CLI due to server timeout limits. And, you'll need to make sure your WP All Import Add-Ons are compatible with WP-CLI.

You can disable the import history log to make WP-CLI imports even faster:

wp all-import run 1 --disable-log

Settings that decrease speed

It's possible that you can't change these settings, but if you're able to it will help with speed:


  • Scan through post content and import images wrapped in <img> tags -> Disable this to increase speed (All Import -> Edit Import -> Images).
  • Search through the Media Library for existing images before importing new images & Keep images currently in Media Library -> Enable these to increase speed in subsequent runs of the import (All Import -> Edit Import -> Images).
  • Don't check for duplicate SKUs -> Enable this to increase speed (All Import -> Edit Import -> WooCommerce Add-On -> Add-On Options).
  • Use StreamReader instead of XMLReader to parse import file -> Disable this to increase speed (All Import -> Import Settings -> Configure Advanced Settings). Make sure to test your feed/file in a new import to confirm that it still works right with this disabled.

Slow cron imports

  • Make sure the "processing" cron job is running every 2 minutes (or 1 minute).
  • Make sure "Cron Sleep" is empty at All Import › Settings.
  • Set "Cron Processing Time Limit" to 120. If the server times out the processing script, lower this until you find the optimal setting (highest number without hitting your server's timeout limits).
  • If the above settings don't help, try a full conflict test: https://gist.github.com/trey8611/72fec5969651d5272fcb85f99b09b8bb#full-conflict-test.

Speeding up "Existing Items" Imports

When using Manual Record Matching (see documentation) the fastest and most versatile option is "Post ID". If you don't have the Post ID in your file, you can use a custom PHP function to find the ID: see documentation.

As an example, if you're updating WooCommerce products and you're using these settings: https://d.pr/i/XzCxWm, you can switch to Post ID and use this function to greatly increase the speed of the import:

(NOTE: The latest version of WP All Import Pro and the WooCommerce Add-On do this automatically, but I'm keeping this here as an example)

[wc_get_product_id_by_sku({sku[1]})]

See: https://d.pr/i/tDncIB.

Actions from other plugins

In an attempt to stop other plugins from running a bunch of actions during post save/updates, try enabling Increase speed by disabling do_action calls in wp_insert_post during import (All Import -> Manage Imports -> Import Settings -> Configure Advanced Settings): https://d.pr/c8LRQ. Make sure to check your imported posts and confirm that they're correct with this setting enabled.

In some cases, this change can significantly improve the import speed.

Database Clean Up

Before you clean up your database, it's extremely important to make a back up that you can roll back to. After you've made a back up, you can use one of the following plugins to clear transients and orphaned data:

External Images

Downloading external images is one of the most common reasons for slow imports, and it can be one of the toughest to troubleshoot (for example, the external host could be throttling the downloads or could just be slow).

Sometimes it's unavoidable and you must download images from an external host, but if it's an option, we strongly suggest moving the images to the /wp-content/uploads/wpallimport/files/ folder or the Media Library and using one of those options in the import.

Keep in mind that you can't manually move images into the Media Library folder without registering them using a plugin like this: https://wordpress.org/plugins/media-sync/.

Disable Image Optimization Plugins

If you're using a plugin like EWWW Image Optimizer, or Smush Pro, you should disable them before you start your import. These types of plugins can cause the imports to run extremely slowly.

Disable image sizes

Depending on your active plugins and theme, it could take a long time to generate all of the supported image sizes. You can use a plugin like this to disable everything except for the necessary size: https://wordpress.org/plugins/image-sizes/. If that helps, you can generate the necessary sizes after the import using the same plugin, or this plugin: https://wordpress.org/plugins/regenerate-thumbnails/.

Full Conflict Test

If other plugins (or your theme) are running a lot of do_action calls during the import, it could cause things to crawl. We see this affect cron job imports a lot. Check it by running a full conflict test: http://www.wpallimport.com/documentation/troubleshooting/plugin-theme-conflicts/. If possible, it's best to do this on a staging copy of your site: https://themeisle.com/blog/wordpress-staging-site/.

MyISAM Storage Engine

If your database tables are using MyISAM, you should switch to InnoDB: https://kinsta.com/knowledgebase/convert-myisam-to-innodb/.

Slow Queries

Here's a detailed guide on troubleshooting a slow WordPress install in general: https://carlalexander.ca/troubleshoot-wordpress-performance/.

Resource Usage

If the import is causing your server to max out its resources (CPU/Memory), the import will run extremely slowly. Sometimes the only way to fix this is to upgrade your server, but it's possible that changing some settings in WP All Import could help.

These are the things that increase CPU/Memory usage:

  • Low number of records per iteration (see: https://d.pr/i/Vakkd3).
  • Huge amount of images.
  • Huge amount of taxonomy terms per record (categories/tags/product attributes/etc).
  • Huge amount of variations per product (in a WooCommerce import).

To remedy some of these issues, you can:

  • Enable 'Increase speed by disabling do_action calls in wp_insert_post during import.' option in the Import Settings (see: https://d.pr/i/c8LRQ).
  • Increase 'In each iteration, process X records' to at least 20 records. Important: this only applies to resource usage. If you're running into timeouts instead, it's bad to increase this setting.
  • Disable 'Split file up into X record chunks' option (see: https://d.pr/i/RpqLTm).
  • Remove the images/taxonomies/etc in the main import, then set up a separate import that only imports those items: http://www.wpallimport.com/documentation/recurring/manual-record-matching/.
  • Add a sleep with the "Cron Sleep" setting via All Import › Settings, or add a sleep with the PHP sleep() function and our pmxi_saved_post hook: https://d.pr/n/ryHX31. This will slow down the import significantly but help with reduced performance during imports. It should only be necessary if your server has low resources.

Increase speed after optimizations

Once you've done everything listed above, you can try increasing the records per iteration via the Import Settings to speed things up: https://d.pr/i/Vakkd3. The higher you can set this, the faster the import will run.

Troubleshooting terminations / failures

If you set the records per iteration higher and the server terminates the import, you can work with your web host to find the error in the logs on your server to see what's causing the termination and fix it: https://gist.github.com/mbissett/d98d1acdf4b2ba11bc67d6f652d4497c.

If they can't find anything in the logs, try using the error-revealer plugin to log the error yourself: https://github.com/mbissett/error-revealer. Make sure to follow the directions closely and revert the changes to your wp-config.php file when you're done.

Some common problem areas are:

  • (Server) CPU Usage
  • (Server) Memory Usage
  • (PHP) max_execution_time
  • (PHP) max_input_vars
  • (PHP/Apache) FcgidIOTimeout
  • (PHP/Apache) FcgidBusyTimeout
  • (PHP) mysql.connect_timeout
  • (PHP) default_socket_timeout
  • (MySQL) wait_timeout
  • (MySQL) interactive_timeout

Web Host

The web host and server you choose will have a direct impact on the speed of your imports. If you're trying to import a lot of data on a bad server, it's going to be slow no matter what you do. If you follow all of the steps above and nothing increases the speed, try switching to a good web host like one of the following:

  • Kinsta
  • LiquidWeb
  • Nexcess

Third Party Solutions

WP Intense

Some WP All Import users have reported huge speed increases by using the Scalability Pro plugin from WP Intense: https://www.wpintense.com/product/scalability-pro/. You can find some articles on their website outlining how they've sped up imports in certain environments in the past.

NOTE: Soflyy/WP All Import is not affiliated with WP Intense in any way, and this is not an official recommendation to use them, it's simply added for information and for you to use at your own risk.


Advanced

Skip updating the posts

Sometimes the act of updating an entire product can fire off a lot of other code that slows down the import. Consider a scenario where you only want to update the stock level for your products - with this workaround, you'll update the stock field specifically, then skip the act of updating the product via WP All Import.

You must read the comments in the code and make the necessary changes for it to work with the data on your site. Keep in mind that the import summary is going to say that every single product was skipped - this is expected, and you need to download the history log to view the custom log entries and see what was updated.

function my_is_post_to_update( $continue_import, $post_id, $xml_node, $import_id ) {
	/*********
	 * Change this to your import ID.
	 * You can find the import ID on the "Manage Imports" page.
	 * *******/
	if ( $import_id == 1 ) {
	
		/*****
		* You need to change 'column_2' to the correct stock element name in your import.
		* column_2 in this case means that the import element is {column_2[1]}.
		* If your stock import element is {stock[1]}, change this to:
		* $xml_node['stock'];
		* *****/
		
		$new_stock = $xml_node['column_2'];

		/*****
		 * Programmatically update the stock value only.
		 * ***/
		$prod = wc_get_product( $post_id );
		$prod->set_stock_quantity( $new_stock );
		$prod->save();

		/********
		 * Make a log entry since it's going to look like all products are skipped.
		 * *****/
		$logger = function($m) {printf("<div class='progress-msg'>[%s] $m</div>\n", date("H:i:s"));flush();};
		call_user_func($logger, "<b>Workaround:</b> Stock for ".$prod->get_name()." set to: ".$xml_node['column_2']);

		/*****
		 * Return "false" so that other actions are not fired and the entire
		 * product is not updated.
		 * ***/
		return false;
	}
	return $continue_import;
}

add_filter( 'wp_all_import_is_post_to_update', 'my_is_post_to_update', 10, 4 );

Skip duplicate checks

WARNING: Follow these instructions closely or you will end up with many duplicate posts.

On the very first run of your import, if you're sure that there are no duplicate posts in your import file, you can use this method to import your posts very quickly:

  1. Add the following code in the Function Editor at All Import -> Settings:
add_filter( 'wp_all_import_is_check_duplicates', 'wpai_is_check_duplicates', 10, 2 );
function wpai_is_check_duplicates( $is_check_duplicates, $import_id ) {
	return false;
}
  1. Create and/or run your import.
  2. Very important: remove the above code from the Function Editor. If you do not remove the code then every import will create duplicate posts every time you run them.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment