WordPress plugins typically leave leftover bloat in the database after you remove them. JetPack from Automattic is no different. If you find that JetPack has way more features than you need and want to uninstall it completely, this guide will help you do that by removing the JetPack database values from the wp_options and wp_postmeta tables along with removing the scheduled cron events from the wp_cron pseudo-cron system.
Cleaning JetPack wp_options
This MySQL query will show you some of the JetPack options that could be leftover.
SELECT COUNT(CASE WHEN option_name LIKE 'jpsq\_%' THEN 1 END) AS jpsq from wp_options;You can delete them all with this query.
DELETE FROM wp_options WHERE option_name LIKE 'jpsq\_%'Here is a WP-CLI version
wp db query "DELETE FROM $(wp db prefix --allow-root)options WHERE option_name LIKE 'jpsq\_%'" --allow-rootSome of the other JetPack option_name entries contain the jetpack string
SELECT COUNT(CASE WHEN option_name LIKE 'jetpack_callables_sync%' THEN 1 END) from wp_options;This will find all of the option_name rows containing jetpack
SELECT COUNT(CASE WHEN option_name LIKE 'jetpack%' THEN 1 END) AS jetpack_options from wp_options;Delete all of the option_name values with this query
DELETE FROM wp_options WHERE option_name LIKE 'jetpack%';Here is the WP-CLI equivalent
wp db query "DELETE FROM $(wp db prefix --allow-root)options WHERE option_name LIKE 'jetpack%'" --allow-rootThat should take care of cleaning all of the JetPack values from the wp_options table.
Cleaning JetPack wp_postmeta
JetPack can also leave some values in the postmeta table, here is an example of the related posts cache.
SELECT COUNT(CASE WHEN meta_key = '_jetpack_related_posts_cache' THEN 1 END) from wp_postmeta;You can delete these with this query
DELETE from wp_postmeta WHERE meta_key = '_jetpack_related_posts_cache';And the WP-CLI version
wp db query "DELETE from $(wp db prefix --allow-root)postmeta WHERE meta_key = '_jetpack_related_posts_cache'" --allow-rootHere is yet another one for tracking which posts should not be emailed
SELECT COUNT(CASE WHEN meta_key = '_jetpack_dont_email_post_to_subs' THEN 1 END) from wp_postmeta;This is how to delete these unnecessary JetPack postmeta values
DELETE from wp_postmeta WHERE meta_key = '_jetpack_dont_email_post_to_subs';We can get more aggressive and count all of the postmeta meta_key rows that contain the name jetpack
SELECT COUNT(CASE WHEN meta_key LIKE '%jetpack%' THEN 1 END) AS jetpack_postmeta from wp_postmeta;WP-CLI version
wp db query "SELECT COUNT(CASE WHEN meta_key LIKE '%jetpack%' THEN 1 END) AS jetpack_postmeta from $(wp db prefix --allow-root)postmeta" --allow-rootThis will delete all of the JetPack postmeta values
DELETE from wp_postmeta WHERE meta_key LIKE '%jetpack%';Finally, here is the WP-CLI version
wp db query "DELETE from $(wp db prefix --allow-root)postmeta WHERE meta_key LIKE '%jetpack%'" --allow-rootNow we can move on to removing the usermeta.
Cleaning JetPack wp_usermeta
JetPack can also leave some values in the postmeta table, here is an example of the related posts cache.
SELECT COUNT(CASE WHEN meta_key = '%jetpack%' THEN 1 END) from wp_usermeta;WP-CLI version
wp db query "SELECT COUNT(CASE WHEN meta_key = '%jetpack%' THEN 1 END) FROM $(wp db prefix --allow-root)usermeta'" --allow-rootYou can delete these with this query
DELETE from wp_postmeta WHERE meta_key = '%jetpack%';And the WP-CLI version
wp db query "DELETE FROM $(wp db prefix --allow-root)usermeta WHERE meta_key = '%jetpack%'" --allow-rootNow we can move on to removing the cron events.
Clean JetPack post_type
If you check for the existing post_types in your database with this command
wp db query "SELECT DISTINCT(post_type) FROM $(wp db prefix --allow-root)posts --allow-root"You can see jetpack_migration
+-------------------+
| post_type |
+-------------------+
| amn_wpforms-lite |
| asp-products |
| attachment |
| custom_css |
| custom-css-js |
| flamingo_contact |
| flamingo_inbound |
| jetpack_migration |
| nav_menu_item |
| oembed_cache |
| omapi |
| page |
| post |
| revision |
| rp4wp_link |
| shortcoder |
| simple-pay |
| snp_popups |
| stripe_order |
| surl |
| tablepress_table |
| wpforms |
+-------------------+
We can delete these jetpack_migration posts
wp post delete $(wp post list --post_type=jetpack_migration --format=ids --allow-root)Cleaning JetPack Jobs from wp_cron
There are a ton of JetPack cron jobs that can still exist in the queue even after you uninstall JetPack.
We can list these scheduled events with WP-CLI, the wp cron event command (docs).
wp cron event listYou will get some output like this showing all of the scheduled cron events and their details
+-------------------------------------------+---------------------+--------------------+------------+
| hook | next_run_gmt | next_run_relative | recurrence |
+-------------------------------------------+---------------------+--------------------+------------+
| mm_session_reap | 2018-05-22 15:23:55 | now | 5 minutes |
| mm_check_scheduled_event_queue | 2018-05-22 15:48:55 | now | 30 minutes |
| ping_pong | 2018-05-22 16:00:18 | now | 1 day |
| wp_privacy_delete_old_export_files | 2018-05-22 16:03:55 | now | 1 hour |
| itsec_purge_logs | 2018-05-22 16:14:06 | now | 1 day |
| aiowps_hourly_cron_event | 2018-05-22 16:17:36 | now | 1 hour |
| wp_scheduled_auto_draft_delete | 2018-05-22 16:29:56 | now | 1 day |
| wp_version_check | 2018-05-22 16:29:58 | now | 12 hours |
| wp_update_plugins | 2018-05-22 16:29:58 | now | 12 hours |
| wp_update_themes | 2018-05-22 16:29:58 | now | 12 hours |
| delete_expired_transients | 2018-05-22 16:31:42 | now | 1 day |
| sm_ping_daily | 2018-05-22 16:50:43 | now | 1 day |
| grunion_scheduled_delete | 2018-05-22 16:54:32 | now | 1 day |
| mm_cron_hook | 2018-05-22 19:11:48 | now | 12 hours |
| akismet_scheduled_delete | 2018-05-22 20:37:23 | now | 1 day |
| aiowps_daily_cron_event | 2018-05-22 21:17:36 | now | 1 day |
| check_plugin_updates-thrive-visual-editor | 2018-05-22 22:28:30 | now | 12 hours |
| updraft_backup | 2018-05-22 23:05:00 | now | 1 day |
| updraft_backup_database | 2018-05-22 23:05:00 | now | 1 day |
| register_orphaned_schedules | 2018-05-23 00:35:57 | now | 1 day |
| lp_check_event | 2018-05-23 02:31:12 | now | 12 hours |
| mwp_update_public_keys | 2018-05-23 07:16:13 | now | 1 day |
| wpseo-reindex-links | 2018-05-23 07:34:12 | now | 1 day |
| puc_cron_check_updates-updraftplus | 2018-05-23 10:35:29 | 2 hours 16 minutes | 1 day |
| wp_scheduled_delete | 2018-05-23 14:24:17 | 6 hours 5 minutes | 1 day |
| jp_purge_transients_cron | 2018-05-23 14:33:27 | 6 hours 14 minutes | 1 day |
| wpseo_onpage_fetch | 2018-05-28 14:39:49 | 5 days 6 hours | 1 week |
+-------------------------------------------+---------------------+--------------------+------------+
There are a few others that can pop up like these
jetpack_display_posts_widget_cron_update
jetpack_clean_nonces
jetpack_v2_heartbeat
jp_sitemap_cron_hook
We can delete this cronjob with WP-CLI very easily
wp cron event delete jp_purge_transients_cronIf you want to delete all JetPack cronjobs we can list the wp_cron jobs with WP-CLI, show only the ones containing jp_ and delete each one with xargs processing.
wp cron event list --allow-root | grep jp_ | awk '{ print $1 }' | xargs --replace=% wp cron event delete % --allow-rootIf you want to delete any other JetPack cronjobs we can list the wp_cron jobs with WP-CLI, show only the ones containing jetpack_ and delete each one
wp cron event list --allow-root | grep jetpack_ | awk '{ print $1 }' | xargs --replace=% wp cron event delete % --allow-root
Thanks for your useful post.
I freed up 22 MB in the database thanks to your post. Great!