Last scanned 23 hours ago · 24 plugins · 12,247 files · 4.12s
One summary of everything found on this site, and the order to work through it.
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.
Written 2 hours ago.
Reports used this month: 1 of 6 included.
Most conflicts are old versions. Clear these, re-scan, and what is left is real.
| Plugin | Version | Safe 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-lite | 11.0.0 → 11.0.1 | Not checked yet. |
| WPBakery Page Builder ignored1 plugin depends on this one: wpforms-lite | 6.7.0 → 9.0.1 | Not 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-stripe | 3.0.7 → 9.1.0 | Not 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 ignored | 3.9 → 4.2.2 | Not from WordPress.org — Linchpin cannot read it before it installs. Premium and nulled plugins update through their own channel. Take this one by hand. |
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.
wp-content/linchpin-children/arprice/overlay.phpjqueryIt 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.
<?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' );wp-content/linchpin-children/heartbeat-control/overlay.phpirisIt 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.
<?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 );wp-content/linchpin-children/updraftplus/overlay.phpDONOTCACHEPAGEIt 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.
<?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 );
}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.
492 KB of autoloaded options
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.
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.
★ 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.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
Counts as one generated file against your plan. If it fails any check it is discarded and does not count.
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.
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.
Pick one and Linchpin will tell you what depends on it, and what would break. Nothing here deactivates anything.
Safe, reversible, and nothing to do with plugin files.
action_scheduler_run_queuea listener is registered right nowlitespeed_task_lqipa listener is registered right nowlitespeed_task_imgoptm_pullowned by litespeed-cache, which is installedwc_admin_dailya listener is registered right nowwc_admin_process_orders_milestonea listener is registered right nowwc_admin_unsnooze_admin_notesa listener is registered right nowwcs_cleanup_big_logsowned by woocommerce-subscriptions, which is installedjetpack_clean_noncesa listener is registered right nowmwp_update_public_keysa listener is registered right nowao_cachecheckera listener is registered right nowupdraftplus_clean_temporary_filesa listener is registered right nowlinchpin_licence_refresha listener is registered right nowjetpack_v2_heartbeata listener is registered right nowwoocommerce_marketplace_cron_fetch_promotionsa listener is registered right nowupdraft_backup_databasea listener is registered right nowsucuriscan_autoseckeyupdatera listener is registered right nowupdraft_backupa listener is registered right nowEverything Linchpin has done to this site, newest first. If something broke, start at the top.
1 change in the last 24 hours.
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.
The licence server answered with status 404.
Plans, sites, invoices and cancellation are all on your Creaholik dashboard. This page only shows what it says about this site.