Linchpin by Creaholik Pro

Last scanned 23 hours ago · 24 plugins · 12,247 files · 4.12s

Reads every plugin's code and rebuilds the report. Nothing is changed, activated or deactivated — it only looks. Takes a few seconds per plugin.Loads your own site once per plugin, each time with that one plugin switched off, and times the difference. That is what tells you a plugin costs 180ms rather than guessing from its file size. It changes nothing for real visitors — the plugin is only disabled inside Linchpin's own test request.The speed probe is running. It is a small must-use file that lets Linchpin time your site with one plugin switched off at a time, and it does nothing on a normal page load. Click to remove it — measuring stops until you put it back.
0
Critical
Fatal if both load
25
High
Breaks silently
20
Medium
Silent breakage
2
Low
Worth knowing
7
Load-bearing
Other plugins depend on them
768.7ms
Slowest plugin
arprice

What to do, in plain English ready

One summary of everything found on this site, and the order to work through it.

Where your site stands

Nothing here is an emergency — no finding says your site is currently broken or under attack. What you do have is a lot of conflict risk: many plugins are carrying their own copies of the same underlying code, and a few plugins secretly depend on each other without saying so. That's the kind of thing that causes odd, hard-to-diagnose breakage later, not damage happening right now.

Do these, in this order

  1. Update these three plugins by hand: WPBakery (js_composer), WooCommerce Subscriptions, and ARPrice. These don't come from the official WordPress plugin directory, so they don't update themselves — you have to download and install the new versions yourself. This comes first because outdated versions are the root cause of most of the duplicate-code conflicts below, and updating clears many of them for free.
  2. Decide whether to turn on two fixes that are ready but currently switched off: one for Heartbeat Control (a script-naming clash with WooCommerce) and one for UpdraftPlus (a clash over a caching setting shared with Litespeed Cache and the Stripe payment plugin). These are already built and tested, but someone needs to approve switching them on, since disabling something automatically isn't a decision a tool should make alone.
  3. Apply the 16 automatic fixes available. These require no manual work and clear the bulk of the remaining findings safely.
  4. Before removing or deactivating any plugin, check the dependency list first. Several plugins quietly rely on others to work: WooCommerce is needed by 8 other plugins, UpdraftPlus is needed by ARPrice and Litespeed Cache, and a few more chains like this exist. Removing the wrong one will break plugins that depend on it.
  5. Have someone look at ARPrice's performance impact. It's the one plugin in the measurements that clearly adds load time to every page (769 milliseconds), while the others measured showed no such cost. A person should decide whether to keep it as-is, replace it, or ask the plugin maker about optimizing it.
  6. Re-run the audit after steps 1–3 to see what's left. Some of the "two plugins using the same name" conflicts (for scripts like jQuery) may resolve once the manual updates are in, and the rest can be prioritized then.

Written 2 hours ago.

Reports used this month: 1 of 6 included.

Update first 4

Most conflicts are old versions. Clear these, re-scan, and what is left is real.

PluginVersionSafe to take?
WooCommerce8 plugins depend on this one: all-in-one-seo-pack, js_composer, litespeed-cache, ocean-extra, woocommerce-gateway-stripe, woocommerce-subscriptions, wp-mail-smtp, wpforms-lite11.0.0 → 11.0.1Not checked yet.
WPBakery Page Builder ignored1 plugin depends on this one: wpforms-lite6.7.0 → 9.0.1Not from WordPress.org — Linchpin cannot read it before it installs. Premium and nulled plugins update through their own channel. Take this one by hand.
WooCommerce Subscriptions ignored1 plugin depends on this one: woocommerce-gateway-stripe3.0.7 → 9.1.0Not from WordPress.org — Linchpin cannot read it before it installs. Premium and nulled plugins update through their own channel. Take this one by hand.
ARPrice - Premium WordPress Pricing Table Plugin ignored3.9 → 4.2.2Not from WordPress.org — Linchpin cannot read it before it installs. Premium and nulled plugins update through their own channel. Take this one by hand.

Plugin children 3

Our corrections, in their own folders, loading before the plugins they correct. Plugin updates cannot delete them and you can switch any of them off.

offarpricefix
Two plugins claim the script handle "jquery"
File
wp-content/linchpin-children/arprice/overlay.php
Size
75 lines, 3221 bytes
Written for
arprice 3.9
Symbol
jquery
Loads
before the plugin it corrects, on every request
What this file does

It loads before the plugin and takes over a declaration the plugin guards, so the plugin skips its own copy and the conflict never happens. Nothing inside the plugin is changed, and deleting this file returns everything to how it was.

It was checked before it was written — it parses, it declares nothing unguarded, it runs no dynamic code, and your site was loaded once with it active to prove it does not break anything.

Show the code
<?php
/**
 * Compat overlay: protect the "jquery" script handle from being silently
 * re-registered by arprice / migrate-guru / ocean-extra / updraftplus.
 *
 * None of these plugins should ever *register* jquery with a custom src -
 * WordPress core already provides it (as a dependency group pointing to
 * jquery-core + jquery-migrate). UpdraftPlus contains a legacy code path
 * (only meant for WP < 3.3) that calls wp_deregister_script('jquery') and
 * then wp_register_script('jquery', <cdn url>, ...). If that path is ever
 * triggered (or any other plugin does something similar), it silently
 * clobbers the handle for every plugin that runs after it, and whichever
 * plugin enqueues last "wins" with no error logged.
 *
 * This overlay does not touch any plugin file. It simply verifies, very
 * late on wp_enqueue_scripts / admin_enqueue_scripts / login_enqueue_scripts,
 * that the "jquery" handle still points at core's dependency-group
 * definition (src === false). If some plugin swapped it for a real URL,
 * we restore the core definition so the platform stays consistent
 * regardless of plugin load order.
 */

if ( ! function_exists( 'linchpin_restore_core_jquery_handle' ) ) {
	function linchpin_restore_core_jquery_handle() {
		if ( ! did_action( 'wp_default_scripts' ) && ! function_exists( 'wp_scripts' ) ) {
			return;
		}

		$scripts = wp_scripts();

		if ( ! isset( $scripts->registered['jquery'] ) ) {
			return;
		}

		$jquery = $scripts->registered['jquery'];

		// Core's own registration always uses src === false and relies on
		// jquery-core + jquery-migrate as dependencies. If src is truthy,
		// some plugin has replaced the handle with its own copy/CDN URL.
		if ( ! empty( $jquery->src ) ) {
			// Make sure the underlying pieces core relies on still exist;
			// if a plugin also clobbered those, leave things alone rather
			// than guessing at a version/URL.
			if ( isset( $scripts->registered['jquery-core'] ) && isset( $scripts->registered['jquery-migrate'] ) ) {
				wp_deregister_script( 'jquery' );
				wp_register_script( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), null );
			}
		}
	}
}

if ( ! function_exists( 'linchpin_reenqueue_jquery_if_needed' ) ) {
	function linchpin_reenqueue_jquery_if_needed() {
		linchpin_restore_core_jquery_handle();

		// If jquery was already queued for output before we fixed the
		// registration above, re-enqueue it so the corrected definition
		// (with proper deps) actually gets printed.
		if ( function_exists( 'wp_script_is' ) && wp_script_is( 'jquery', 'enqueued' ) ) {
			wp_enqueue_script( 'jquery' );
		}
	}
}

if ( ! function_exists( 'linchpin_guard_jquery_handle_boot' ) ) {
	function linchpin_guard_jquery_handle_boot() {
		// Run after every plugin's own enqueue callbacks have had a chance
		// to (mis)register the handle, but still before scripts are printed.
		add_action( 'wp_enqueue_scripts', 'linchpin_reenqueue_jquery_if_needed', PHP_INT_MAX );
		add_action( 'admin_enqueue_scripts', 'linchpin_reenqueue_jquery_if_needed', PHP_INT_MAX );
		add_action( 'login_enqueue_scripts', 'linchpin_reenqueue_jquery_if_needed', PHP_INT_MAX );
	}
}

add_action( 'init', 'linchpin_guard_jquery_handle_boot' );
offheartbeat-controlfix
Two plugins claim the script handle "iris"
File
wp-content/linchpin-children/heartbeat-control/overlay.php
Size
78 lines, 2758 bytes
Written for
heartbeat-control 2.0.1
Symbol
iris
Loads
before the plugin it corrects, on every request
What this file does

It loads before the plugin and takes over a declaration the plugin guards, so the plugin skips its own copy and the conflict never happens. Nothing inside the plugin is changed, and deleting this file returns everything to how it was.

It was checked before it was written — it parses, it declares nothing unguarded, it runs no dynamic code, and your site was loaded once with it active to prove it does not break anything.

Show the code
<?php
/**
 * Overlay: fix duplicate script handle "iris".
 *
 * heartbeat-control ships a bundled copy of CMB2 which, on the front end,
 * re-registers the "iris" script pointing at admin_url( 'js/iris.min.js' )
 * instead of the core copy at wp-includes/js/iris.min.js. WooCommerce's
 * admin screens depend on wp_enqueue_script( 'iris' ) resolving to the
 * real WordPress core Iris color-picker library. Depending on hook order,
 * CMB2's registration can silently clobber the correct one (or vice
 * versa), leaving either WooCommerce's color pickers or CMB2's color
 * pickers broken with no error in the logs.
 *
 * This overlay does not edit either plugin. It simply re-asserts the
 * correct core registration for the "iris" handle after both plugins
 * have had a chance to register their scripts, so the handle always
 * points at the genuine core file regardless of load order.
 */

if ( ! function_exists( 'linchpin_fix_iris_script_handle' ) ) {
	/**
	 * Ensure the "iris" script handle points at the real WordPress core
	 * Iris library, no matter which plugin registered it last.
	 */
	function linchpin_fix_iris_script_handle() {
		if ( ! function_exists( 'wp_scripts' ) ) {
			return;
		}

		$scripts = wp_scripts();

		if ( ! isset( $scripts->registered['iris'] ) ) {
			return;
		}

		$registered = $scripts->registered['iris'];
		$src        = isset( $registered->src ) ? $registered->src : '';

		// Core's own registration lives under wp-includes/js/iris.min.js.
		// If the currently registered "iris" handle points anywhere else
		// (e.g. admin_url( 'js/iris.min.js' ) from a bundled CMB2 copy),
		// restore the correct core registration.
		$core_path = 'wp-includes/js/iris.min.js';

		if ( false !== strpos( $src, $core_path ) ) {
			return; // Already correct.
		}

		$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';

		wp_deregister_script( 'iris' );
		wp_register_script(
			'iris',
			includes_url( "js/iris{$suffix}.js" ),
			array( 'jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch' ),
			get_bloginfo( 'version' ),
			1
		);
	}
}

if ( ! function_exists( 'linchpin_reassert_iris_frontend' ) ) {
	function linchpin_reassert_iris_frontend() {
		linchpin_fix_iris_script_handle();
	}
}

if ( ! function_exists( 'linchpin_reassert_iris_admin' ) ) {
	function linchpin_reassert_iris_admin() {
		linchpin_fix_iris_script_handle();
	}
}

// Hook late (priority 9999) so this runs after both heartbeat-control's
// CMB2 bundle and WooCommerce have registered their own copies of the
// "iris" handle via wp_enqueue_scripts / admin_enqueue_scripts.
add_action( 'wp_enqueue_scripts', 'linchpin_reassert_iris_frontend', 9999 );
add_action( 'admin_enqueue_scripts', 'linchpin_reassert_iris_admin', 9999 );
offupdraftplusfix
Unguarded redeclaration of constant DONOTCACHEPAGE
File
wp-content/linchpin-children/updraftplus/overlay.php
Size
21 lines, 868 bytes
Written for
updraftplus 1.26.6
Symbol
DONOTCACHEPAGE
Loads
before the plugin it corrects, on every request
Linchpin would not write this file today. The generated overlay defines a constant. An overlay loads before the plugins it sits beside, so defining a constant would decide its value for the whole site — and the plugins in this conflict disagree about that value. It was discarded; this finding needs a file patch.
What this file does

It loads before the plugin and takes over a declaration the plugin guards, so the plugin skips its own copy and the conflict never happens. Nothing inside the plugin is changed, and deleting this file returns everything to how it was.

It was checked before it was written — it parses, it declares nothing unguarded, it runs no dynamic code, and your site was loaded once with it active to prove it does not break anything.

Show the code
<?php
/**
 * Compatibility overlay: DONOTCACHEPAGE constant collision.
 *
 * updraftplus (class-updraftplus.php:783) defines DONOTCACHEPAGE without
 * checking defined() first, while litespeed-cache and
 * woocommerce-gateway-stripe both guard their own definitions. Depending on
 * load order, updraftplus's unguarded define() can run after another plugin
 * has already defined the constant, triggering a duplicate-definition
 * warning/fatal under strict error handling.
 *
 * Fix: define the constant here, as early as possible (mu-plugins load
 * before regular plugins), guarded by defined(). This guarantees the
 * constant already exists by the time any plugin tries to (re)define it, and
 * since our own definition is guarded, it never causes a duplicate
 * declaration itself.
 */

if ( ! defined( 'DONOTCACHEPAGE' ) ) {
	define( 'DONOTCACHEPAGE', true );
}

Severity

  • Critical0
  • High25
  • Medium20
  • Low2
  • Info6

Measured cost

Your front page, loaded without each plugin.

Front page: 2686.7ms. Run-to-run variation was 523.7ms, so anything smaller is reported as below the noise floor rather than as a number.

arprice768.7msmeasured
all-in-one-seo-packbelow noise
woocommercebelow noise
autoptimizebelow noise
wpforms-litebelow noise
woocommerce-gateway-stripebelow noise
user-access-shortcodes-587.1msmeasured
sucuri-scanner-600.6msmeasured
wp-mail-smtp-603.2msmeasured
migrate-guru-604msmeasured
ocean-sticky-header-606.5msmeasured
when-last-login-639.8msmeasured
duplicate-page-643.2msmeasured
ocean-extra-663.4msmeasured
litespeed-cache-671.6msmeasured
forget-about-shortcode-buttons-730.7msmeasured
tinymce-advanced-731.1msmeasured
login-recaptcha-834.3msmeasured
updraftplus-954.8msmeasured
heartbeat-control-1182.1msmeasured
ocean-social-sharing-1397.8msmeasured
js_composer-1594msmeasured
worker-1703.8msmeasured

Weight on every request

492 KB of autoloaded options

woocommerce8 KBno cron
autoptimize785 Bno cron
heartbeat-control390 Bno cron
duplicate-page316 Bno cron
wp-mail-smtp301 Bno cron
login-recaptcha147 Bno cron
woocommerce-subscriptions107 Bno cron
arprice76 Bno cron
wpforms-lite50 B2 cron jobs
updraftplus36 Bno cron

13 scheduled jobs with no owner
Scheduled to run, but no installed plugin registers them — usually left behind by a plugin deleted without cleaning up. They fire forever and do nothing.

urpro_schedule_clear_cacheurpro_clear_cachewpseo-reindex-linksjp_purge_transients_cronjetpack_waf_rules_update_cronput_do_weekly_actionaioseop_cron_check_remote_noticeswcj_check_site_keywpseo_permalink_structure_checkwpseo_home_url_checkwpseo-reindexwpseo_ryte_fetch

Linchpin can write these fixes 16

Each one becomes a plugin child: your own file beside the plugin, checked before it is enabled, removable in one click, and untouched by plugin updates.

mediumTwo plugins claim the script handle "iris"
2 plugins register the same script handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
heartbeat-control★ woocommerce

Recommended owner: woocommerce. It registers this from its own code, while heartbeat-control only registers it from a bundled copy of a shared library — that copy would do the same inside any plugin shipping it, so it is the incidental one.

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the script handle "jquery"
4 plugins register the same script handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
arpricemigrate-guruocean-extraupdraftplus

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the script handle "jquery-touch-punch"
2 plugins register the same script handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
woocommercewpforms-lite

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the script handle "jquery-ui-autocomplete"
2 plugins register the same script handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
woocommercejs_composer

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the script handle "jquery-ui-draggable"
2 plugins register the same script handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
js_composerwpforms-lite

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the script handle "jquery-ui-sortable"
3 plugins register the same script handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
woocommercejs_composerwpforms-lite

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the script handle "underscore"
3 plugins register the same script handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
ocean-extrajs_composerwp-mail-smtp

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the script handle "updates"
2 plugins register the same script handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
ocean-extrawoocommerce

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the script handle "wc-add-to-cart-variation"
2 plugins register the same script handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
woocommercewoocommerce-subscriptions

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the script handle "wp-color-picker"
3 plugins register the same script handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
heartbeat-controlocean-extrajs_composer

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the script handle "wp-pointer"
4 plugins register the same script handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
all-in-one-seo-packocean-extrajs_composerwpforms-lite

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the style handle "select2"
3 plugins register the same style handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
ocean-extraupdraftpluswoocommerce

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the style handle "woocommerce-activation"
2 plugins register the same style handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
woocommercewoocommerce-subscriptions

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the style handle "woocommerce_admin_styles"
2 plugins register the same style handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
woocommercewoocommerce-subscriptions

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the style handle "wp-color-picker"
5 plugins register the same style handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
forget-about-shortcode-buttonsheartbeat-controlocean-extrawoocommercejs_composer

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

mediumTwo plugins claim the style handle "wp-pointer"
5 plugins register the same style handle. There is no error — the last registration silently replaces the earlier one, so one plugin's feature stops working with nothing in the logs to say why.
all-in-one-seo-packocean-extrawoocommerce-subscriptionsjs_composerwpforms-lite

Counts as one generated file against your plan. If it fails any check it is discarded and does not count.

Use only the part you need

Most plugins do far more than the one thing you installed them for, and the rest still runs on every page. Pick a plugin to see what it is made of, and switch off what you do not use. The plugin stays installed and keeps updating — nothing is deleted, and every switch flips back.

Worth doing 37

None of this is urgent and none of it is broken. Each one is a small improvement — most are "keep this plugin updated" and nothing more.

do this one4 plugins each bundle their own composer
1 duplicated function including Composer\Autoload\includeFile. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • This particular library is built to be bundled more than once — it detects the copies and runs the newest. In practice this rarely breaks anything.
  • Keep every plugin listed up to date. The problem only appears when one plugin is far behind and its old copy wins the race.
  • Plugins involved: arprice, heartbeat-control, ocean-extra, updraftplus
arpriceheartbeat-controlocean-extraupdraftplus
do this one4 plugins each bundle their own woocommerce/action-scheduler
2 duplicated functions including as_has_scheduled_action, as_supports. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • This particular library is built to be bundled more than once — it detects the copies and runs the newest. In practice this rarely breaks anything.
  • Keep every plugin listed up to date. The problem only appears when one plugin is far behind and its old copy wins the race.
  • Plugins involved: all-in-one-seo-pack, woocommerce, wpforms-lite, wp-mail-smtp
all-in-one-seo-packwoocommercewpforms-litewp-mail-smtp
do this one4 plugins each bundle their own woocommerce/action-scheduler
14 duplicated classes including Action_Scheduler\WP_CLI\System_Command, Action_Scheduler\WP_CLI\Action_Command, Action_Scheduler\WP_CLI\Action\Create_Command. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • This particular library is built to be bundled more than once — it detects the copies and runs the newest. In practice this rarely breaks anything.
  • Keep every plugin listed up to date. The problem only appears when one plugin is far behind and its old copy wins the race.
  • Plugins involved: all-in-one-seo-pack, woocommerce, wpforms-lite, wp-mail-smtp
all-in-one-seo-packwoocommercewpforms-litewp-mail-smtp
do this one5 plugins each bundle their own woocommerce/action-scheduler
15 duplicated functions including wc_schedule_single_action, wc_schedule_recurring_action, wc_schedule_cron_action. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • This particular library is built to be bundled more than once — it detects the copies and runs the newest. In practice this rarely breaks anything.
  • Keep every plugin listed up to date. The problem only appears when one plugin is far behind and its old copy wins the race.
  • Plugins involved: all-in-one-seo-pack, woocommerce, woocommerce-subscriptions, wpforms-lite, wp-mail-smtp
all-in-one-seo-packwoocommercewoocommerce-subscriptionswpforms-litewp-mail-smtp
do this one5 plugins each bundle their own woocommerce/action-scheduler
78 duplicated classes including ActionScheduler_Store_Deprecated, ActionScheduler_Abstract_QueueRunner_Deprecated, ActionScheduler_Schedule_Deprecated. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • This particular library is built to be bundled more than once — it detects the copies and runs the newest. In practice this rarely breaks anything.
  • Keep every plugin listed up to date. The problem only appears when one plugin is far behind and its old copy wins the race.
  • Plugins involved: all-in-one-seo-pack, woocommerce, woocommerce-subscriptions, wpforms-lite, wp-mail-smtp
all-in-one-seo-packwoocommercewoocommerce-subscriptionswpforms-litewp-mail-smtp
do this one8 plugins each bundle their own composer
1 duplicated class including Composer\InstalledVersions. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • This particular library is built to be bundled more than once — it detects the copies and runs the newest. In practice this rarely breaks anything.
  • Keep every plugin listed up to date. The problem only appears when one plugin is far behind and its old copy wins the race.
  • Plugins involved: all-in-one-seo-pack, heartbeat-control, ocean-extra, updraftplus, woocommerce, woocommerce-gateway-stripe, wpforms-lite, wp-mail-smtp
all-in-one-seo-packheartbeat-controlocean-extraupdraftpluswoocommercewoocommerce-gateway-stripewpforms-litewp-mail-smtp
do this one9 plugins each bundle their own composer
1 duplicated class including Composer\Autoload\ClassLoader. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • This particular library is built to be bundled more than once — it detects the copies and runs the newest. In practice this rarely breaks anything.
  • Keep every plugin listed up to date. The problem only appears when one plugin is far behind and its old copy wins the race.
  • Plugins involved: all-in-one-seo-pack, arprice, heartbeat-control, ocean-extra, updraftplus, woocommerce, woocommerce-gateway-stripe, wpforms-lite, wp-mail-smtp
all-in-one-seo-packarpriceheartbeat-controlocean-extraupdraftpluswoocommercewoocommerce-gateway-stripewpforms-litewp-mail-smtp
do this oneUnguarded redeclaration of constant DONOTCACHEPAGE
One plugin declares this defensively and another does not. Load order decides whether the site survives: if the unguarded one loads second, PHP fatals.
  • Only one of these declarations is guarded. If the unguarded one loads second, PHP raises a fatal error and the site goes white.
  • Update both plugins first — this is usually fixed upstream once an author notices.
  • If it persists, report it to the author of the plugin that declares the name without a guard. It is a one-line fix on their side.
  • Plugins involved: litespeed-cache, updraftplus, woocommerce-gateway-stripe
litespeed-cacheupdraftpluswoocommerce-gateway-stripe
do this oneall-in-one-seo-pack needs woocommerce, but does not say so
all-in-one-seo-pack calls 4 symbols defined by woocommerce (wc_get_page_id, wc_get_product, wc_price, wc_help_tip) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating woocommerce, and when they do, all-in-one-seo-pack fatals with no warning.
  • all-in-one-seo-pack calls code that lives in woocommerce without checking it exists first. Deactivating woocommerce white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove woocommerce, deactivate the plugins that depend on it first, in the same maintenance window.
all-in-one-seo-packwoocommerce
do this onearprice and woocommerce both bundle maxmind-db/reader
5 duplicated classes including MaxMind\Db\Reader\Metadata, MaxMind\Db\Reader\Decoder, MaxMind\Db\Reader\Util. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • Update every plugin listed. Most collisions of this kind disappear when the copies converge on the same version.
  • If one of these plugins has not been updated in a long time, it is the one carrying the old copy — and the one to replace.
  • You cannot fix this by editing the library. Whichever copy loads first wins for the whole site, and editing a plugin's vendor directory is undone by its next update.
  • Plugins involved: arprice, woocommerce
arpricewoocommerce
do this onearprice needs updraftplus, but does not say so
arprice calls 1 symbol defined by updraftplus (authenticationexception) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating updraftplus, and when they do, arprice fatals with no warning.
  • arprice calls code that lives in updraftplus without checking it exists first. Deactivating updraftplus white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove updraftplus, deactivate the plugins that depend on it first, in the same maintenance window.
arpriceupdraftplus
do this onejs_composer needs woocommerce, but does not say so
js_composer calls 8 symbols defined by woocommerce (wc_get_attribute_taxonomies, wc_get_product, wc, wc_product, …) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating woocommerce, and when they do, js_composer fatals with no warning.
  • js_composer calls code that lives in woocommerce without checking it exists first. Deactivating woocommerce white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove woocommerce, deactivate the plugins that depend on it first, in the same maintenance window.
js_composerwoocommerce
do this onelitespeed-cache needs updraftplus, but does not say so
litespeed-cache calls 1 symbol defined by updraftplus (ioexception) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating updraftplus, and when they do, litespeed-cache fatals with no warning.
  • litespeed-cache calls code that lives in updraftplus without checking it exists first. Deactivating updraftplus white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove updraftplus, deactivate the plugins that depend on it first, in the same maintenance window.
litespeed-cacheupdraftplus
do this onelitespeed-cache needs woocommerce, but does not say so
litespeed-cache calls 1 symbol defined by woocommerce (wc_get_product) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating woocommerce, and when they do, litespeed-cache fatals with no warning.
  • litespeed-cache calls code that lives in woocommerce without checking it exists first. Deactivating woocommerce white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove woocommerce, deactivate the plugins that depend on it first, in the same maintenance window.
litespeed-cachewoocommerce
do this oneocean-extra needs woocommerce, but does not say so
ocean-extra calls 4 symbols defined by woocommerce (wc, wc_get_page_id, wc_shipping_legacy_free_shipping, wc_price) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating woocommerce, and when they do, ocean-extra fatals with no warning.
  • ocean-extra calls code that lives in woocommerce without checking it exists first. Deactivating woocommerce white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove woocommerce, deactivate the plugins that depend on it first, in the same maintenance window.
ocean-extrawoocommerce
do this oneupdraftplus and wpforms-lite both bundle symfony/polyfill-mbstring
1 duplicated class including Symfony\Polyfill\Mbstring\Mbstring. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • Update every plugin listed. Most collisions of this kind disappear when the copies converge on the same version.
  • If one of these plugins has not been updated in a long time, it is the one carrying the old copy — and the one to replace.
  • You cannot fix this by editing the library. Whichever copy loads first wins for the whole site, and editing a plugin's vendor directory is undone by its next update.
  • Plugins involved: updraftplus, wpforms-lite
updraftpluswpforms-lite
do this oneupdraftplus needs worker, but does not say so
updraftplus calls 1 symbol defined by worker (crypt_rijndael) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating worker, and when they do, updraftplus fatals with no warning.
  • updraftplus calls code that lives in worker without checking it exists first. Deactivating worker white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove worker, deactivate the plugins that depend on it first, in the same maintenance window.
updraftplusworker
do this onewoocommerce and woocommerce-subscriptions both bundle class-wc-datetime.php
1 duplicated class including WC_DateTime. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • Update every plugin listed. Most collisions of this kind disappear when the copies converge on the same version.
  • If one of these plugins has not been updated in a long time, it is the one carrying the old copy — and the one to replace.
  • You cannot fix this by editing the library. Whichever copy loads first wins for the whole site, and editing a plugin's vendor directory is undone by its next update.
  • Plugins involved: woocommerce, woocommerce-subscriptions
woocommercewoocommerce-subscriptions
do this onewoocommerce needs ocean-extra, but does not say so
woocommerce calls 1 symbol defined by ocean-extra (wxr_parser) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating ocean-extra, and when they do, woocommerce fatals with no warning.
  • woocommerce calls code that lives in ocean-extra without checking it exists first. Deactivating ocean-extra white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove ocean-extra, deactivate the plugins that depend on it first, in the same maintenance window.
woocommerceocean-extra
do this onewoocommerce-gateway-stripe needs woocommerce-subscriptions, but does not say so
woocommerce-gateway-stripe calls 4 symbols defined by woocommerce-subscriptions (wcs_get_subscriptions, wcs_get_human_time_diff, wcs_get_subscription, wcs_admin_notice) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating woocommerce-subscriptions, and when they do, woocommerce-gateway-stripe fatals with no warning.
  • woocommerce-gateway-stripe calls code that lives in woocommerce-subscriptions without checking it exists first. Deactivating woocommerce-subscriptions white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove woocommerce-subscriptions, deactivate the plugins that depend on it first, in the same maintenance window.
woocommerce-gateway-stripewoocommerce-subscriptions
do this onewoocommerce-subscriptions needs woocommerce, but does not say so
woocommerce-subscriptions calls 95 symbols defined by woocommerce (wc_get_endpoint_url, wc_get_page_permalink, wc_get_order, wc_date_format, …) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating woocommerce, and when they do, woocommerce-subscriptions fatals with no warning.
  • woocommerce-subscriptions calls code that lives in woocommerce without checking it exists first. Deactivating woocommerce white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove woocommerce, deactivate the plugins that depend on it first, in the same maintenance window.
woocommerce-subscriptionswoocommerce
do this onewp-mail-smtp needs woocommerce, but does not say so
wp-mail-smtp calls 1 symbol defined by woocommerce (wc_help_tip) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating woocommerce, and when they do, wp-mail-smtp fatals with no warning.
  • wp-mail-smtp calls code that lives in woocommerce without checking it exists first. Deactivating woocommerce white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove woocommerce, deactivate the plugins that depend on it first, in the same maintenance window.
wp-mail-smtpwoocommerce
do this onewpforms-lite needs js_composer, but does not say so
wpforms-lite calls 1 symbol defined by js_composer (vc_map) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating js_composer, and when they do, wpforms-lite fatals with no warning.
  • wpforms-lite calls code that lives in js_composer without checking it exists first. Deactivating js_composer white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove js_composer, deactivate the plugins that depend on it first, in the same maintenance window.
wpforms-litejs_composer
do this onewpforms-lite needs woocommerce, but does not say so
wpforms-lite calls 1 symbol defined by woocommerce (wc_help_tip) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating woocommerce, and when they do, wpforms-lite fatals with no warning.
  • wpforms-lite calls code that lives in woocommerce without checking it exists first. Deactivating woocommerce white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove woocommerce, deactivate the plugins that depend on it first, in the same maintenance window.
wpforms-litewoocommerce
do this onewpforms-lite needs wp-mail-smtp, but does not say so
wpforms-lite calls 1 symbol defined by wp-mail-smtp (wp_mail_smtp) with no existence check and no "Requires Plugins" header. Nothing stops somebody deactivating wp-mail-smtp, and when they do, wpforms-lite fatals with no warning.
  • wpforms-lite calls code that lives in wp-mail-smtp without checking it exists first. Deactivating wp-mail-smtp white-screens the site.
  • There is nothing to repair — both plugins are working. The risk is that nothing warns you before you switch the wrong one off.
  • If you ever need to remove wp-mail-smtp, deactivate the plugins that depend on it first, in the same maintenance window.
wpforms-litewp-mail-smtp
optional3 plugins each bundle their own symfony/polyfill-mbstring
3 duplicated constants including MB_CASE_UPPER, MB_CASE_LOWER, MB_CASE_TITLE. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • Update every plugin listed. Most collisions of this kind disappear when the copies converge on the same version.
  • If one of these plugins has not been updated in a long time, it is the one carrying the old copy — and the one to replace.
  • You cannot fix this by editing the library. Whichever copy loads first wins for the whole site, and editing a plugin's vendor directory is undone by its next update.
  • Plugins involved: updraftplus, wpforms-lite, wp-mail-smtp
updraftpluswpforms-litewp-mail-smtp
optionalupdraftplus and wp-mail-smtp both bundle symfony/polyfill-intl-idn
36 duplicated constants including U_IDNA_PROHIBITED_ERROR, U_IDNA_ERROR_START, U_IDNA_UNASSIGNED_ERROR. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • Update every plugin listed. Most collisions of this kind disappear when the copies converge on the same version.
  • If one of these plugins has not been updated in a long time, it is the one carrying the old copy — and the one to replace.
  • You cannot fix this by editing the library. Whichever copy loads first wins for the whole site, and editing a plugin's vendor directory is undone by its next update.
  • Plugins involved: updraftplus, wp-mail-smtp
updraftpluswp-mail-smtp
optionalwoocommerce and wpforms-lite both bundle Symfony/Polyfill
1 duplicated constant including FILTER_VALIDATE_BOOL. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • Update every plugin listed. Most collisions of this kind disappear when the copies converge on the same version.
  • If one of these plugins has not been updated in a long time, it is the one carrying the old copy — and the one to replace.
  • You cannot fix this by editing the library. Whichever copy loads first wins for the whole site, and editing a plugin's vendor directory is undone by its next update.
  • Plugins involved: woocommerce, wpforms-lite
woocommercewpforms-lite
optionalworker and updraftplus both bundle phpseclib/phpseclib
9 duplicated constants including NET_SFTP_QUEUE_SIZE, CRYPT_RSA_MODE, MATH_BIGINTEGER_OPENSSL_DISABLE. Only one copy can load, so whichever plugin loses the race runs against a version of the library it was never tested against. This is one of the most common causes of "it works alone but breaks together", and neither plugin author can see it from their side.
  • Update every plugin listed. Most collisions of this kind disappear when the copies converge on the same version.
  • If one of these plugins has not been updated in a long time, it is the one carrying the old copy — and the one to replace.
  • You cannot fix this by editing the library. Whichever copy loads first wins for the whole site, and editing a plugin's vendor directory is undone by its next update.
  • Plugins involved: worker, updraftplus
workerupdraftplus
optionalTwo plugins define constant FS_CHMOD_DIR
Both guard the declaration, so there is no fatal error — but only one definition is ever used, and which one depends on plugin load order. If the two implementations differ, one plugin is silently running on the other's code.
  • Both plugins check before declaring, so there is no error. Only one definition is ever used and which one depends on load order.
  • If the two plugins behave differently in a way you can see, this is the reason. Otherwise ignore it.
ocean-extrawoocommerce
optionalTwo plugins define constant WOOCOMMERCE_CART
Both guard the declaration, so there is no fatal error — but only one definition is ever used, and which one depends on plugin load order. If the two implementations differ, one plugin is silently running on the other's code.
  • Both plugins check before declaring, so there is no error. Only one definition is ever used and which one depends on load order.
  • If the two plugins behave differently in a way you can see, this is the reason. Otherwise ignore it.
woocommerce-gateway-stripewoocommerce-subscriptions
optionalDuplicate class Attribute, in test or example code only
Declared by more than one plugin, but every copy is in a directory WordPress does not load — tests, examples or stubs. No fatal error is possible unless a plugin includes its own test files at runtime.
  • Every copy is in test or example code that WordPress never loads. Recorded so you know it was checked, not because it is a problem.
woocommercewpforms-lite
optionalDuplicate class PhpToken, in test or example code only
Declared by more than one plugin, but every copy is in a directory WordPress does not load — tests, examples or stubs. No fatal error is possible unless a plugin includes its own test files at runtime.
  • Every copy is in test or example code that WordPress never loads. Recorded so you know it was checked, not because it is a problem.
woocommercewpforms-lite
optionalDuplicate class Stringable, in test or example code only
Declared by more than one plugin, but every copy is in a directory WordPress does not load — tests, examples or stubs. No fatal error is possible unless a plugin includes its own test files at runtime.
  • Every copy is in test or example code that WordPress never loads. Recorded so you know it was checked, not because it is a problem.
woocommercewpforms-lite
optionalDuplicate class UnhandledMatchError, in test or example code only
Declared by more than one plugin, but every copy is in a directory WordPress does not load — tests, examples or stubs. No fatal error is possible unless a plugin includes its own test files at runtime.
  • Every copy is in test or example code that WordPress never loads. Recorded so you know it was checked, not because it is a problem.
woocommercewpforms-lite
optionalDuplicate class ValueError, in test or example code only
Declared by more than one plugin, but every copy is in a directory WordPress does not load — tests, examples or stubs. No fatal error is possible unless a plugin includes its own test files at runtime.
  • Every copy is in test or example code that WordPress never loads. Recorded so you know it was checked, not because it is a problem.
woocommercewpforms-lite
optionalarprice integrates with js_composer when it is present
arprice calls js_composer (vc_map, vc_add_shortcode_param) but checks it exists first, so removing js_composer costs you the integration and nothing else. Worth knowing before you decide the two are unrelated.
  • The plugin checks the other one exists before using it, so removing that one costs you the integration and nothing else.
arpricejs_composer

Can I remove a plugin?

Pick one and Linchpin will tell you what depends on it, and what would break. Nothing here deactivates anything.

Can be cleaned up now

Safe, reversible, and nothing to do with plugin files.

13 scheduled jobs with no owner
Left behind by plugins that were deleted without cleaning up. Nothing is listening for these, no installed plugin contains their name, and no plugin was seen scheduling them — so when they fire, nothing happens. Removing them cannot break a plugin that is not there.
urpro_schedule_clear_cacheurpro_clear_cachewpseo-reindex-linksjp_purge_transients_cronjetpack_waf_rules_update_cronput_do_weekly_actionaioseop_cron_check_remote_noticeswcj_check_site_keywpseo_permalink_structure_checkwpseo_home_url_checkwpseo-reindexwpseo_ryte_fetch

17 scheduled jobs whose owners are quiet
These belong to plugins you still have. They are not running right now — the plugin is deactivated, or it only listens on certain screens. Leave them alone: they start working again the moment their plugin does.
action_scheduler_run_queuea listener is registered right now
litespeed_task_lqipa listener is registered right now
litespeed_task_imgoptm_pullowned by litespeed-cache, which is installed
wc_admin_dailya listener is registered right now
wc_admin_process_orders_milestonea listener is registered right now
wc_admin_unsnooze_admin_notesa listener is registered right now
wcs_cleanup_big_logsowned by woocommerce-subscriptions, which is installed
jetpack_clean_noncesa listener is registered right now
mwp_update_public_keysa listener is registered right now
ao_cachecheckera listener is registered right now
updraftplus_clean_temporary_filesa listener is registered right now
linchpin_licence_refresha listener is registered right now
jetpack_v2_heartbeata listener is registered right now
woocommerce_marketplace_cron_fetch_promotionsa listener is registered right now
updraft_backup_databasea listener is registered right now
sucuriscan_autoseckeyupdatera listener is registered right now
updraft_backupa listener is registered right now

What changed 1

Everything Linchpin has done to this site, newest first. If something broke, start at the top.

1 change in the last 24 hours.

11/08/2026
Wrote a fix for arprice — Two plugins claim the script handle "jquery"07:28 · Creaholik

Creaholik connection connected

Needed only for writing fixes. Everything else works without it.

Testing sends the smallest possible prompt. It does not count against your generated files, and it proves the whole path end to end.

Your plan problem

Prowww.creaholik.com

The licence server answered with status 404.

Files written this month4 / 30
Renews
see your dashboard
Last checked
8 hours ago

Plans, sites, invoices and cancellation are all on your Creaholik dashboard. This page only shows what it says about this site.