Clean Jetpack Database Bloat after Uninstalling from WordPress

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-root

Some 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-root

That 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-root

Here 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;

This 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-root

Now we can move on to removing the cron events.

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 list

You 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_cron

If 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-root

If 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

Sources

How to remove WordPress’ Jetpack plugin completely?