{"id":322338,"date":"2026-06-08T07:03:47","date_gmt":"2026-06-08T07:03:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/conflict-detective\/"},"modified":"2026-06-16T14:19:04","modified_gmt":"2026-06-16T14:19:04","slug":"tahhan-conflict-detective","status":"publish","type":"plugin","link":"https:\/\/he.wordpress.org\/plugins\/tahhan-conflict-detective\/","author":23075774,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.6.1","stable_tag":"2.6.1","tested":"7.0","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Tahhan Conflict Detective","header_author":"Tahhan","header_description":"Automatically detects which plugin, theme, or update broke your WordPress site \u2014 without manual trial and error.","assets_banners_color":"12203d","last_updated":"2026-06-16 14:19:04","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/Tahhan-nl\/Tahhan-Conflict-Detective","header_author_uri":"https:\/\/github.com\/Tahhan-nl","rating":0,"author_block_rating":0,"active_installs":0,"downloads":172,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.5.0":{"tag":"2.5.0","author":"mustafatahhan","date":"2026-06-08 07:03:30"},"2.5.1":{"tag":"2.5.1","author":"mustafatahhan","date":"2026-06-11 07:41:03"},"2.5.2":{"tag":"2.5.2","author":"mustafatahhan","date":"2026-06-11 12:05:42"},"2.5.3":{"tag":"2.5.3","author":"mustafatahhan","date":"2026-06-15 09:01:34"},"2.6.0":{"tag":"2.6.0","author":"mustafatahhan","date":"2026-06-16 09:51:08"},"2.6.1":{"tag":"2.6.1","author":"mustafatahhan","date":"2026-06-16 14:19:04"}},"upgrade_notice":{"2.1.1":"<p>Security and quality patch. Upgrade recommended for all users on 2.1.0.<\/p>","2.0.0":"<p>Major feature release: Conflict Scanner, Safe Testing Mode, and Conflict Wizard.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3572689,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3572689,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3574302,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3574302,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.5.0","2.5.1","2.5.2","2.5.3","2.6.0","2.6.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3572694,"resolution":"1","location":"assets","locale":"","width":1280,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3572694,"resolution":"2","location":"assets","locale":"","width":1280,"height":800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3572694,"resolution":"3","location":"assets","locale":"","width":1280,"height":800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3572694,"resolution":"4","location":"assets","locale":"","width":1280,"height":800},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3572694,"resolution":"5","location":"assets","locale":"","width":1280,"height":800},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3572694,"resolution":"6","location":"assets","locale":"","width":1280,"height":800},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3572694,"resolution":"7","location":"assets","locale":"","width":1280,"height":800}},"screenshots":{"1":"Dashboard \u2014 live system overview: active plugins, stat cards, recent changes and the likely conflict culprit widget.","2":"Conflict Scanner \u2014 detected conflicts ranked by confidence score with one-click \"Mark Resolved\".","3":"Safe Testing Mode \u2014 amber active banner shows disabled-plugin count; toggle any plugin on\/off for your session only.","4":"Conflict Wizard \u2014 step-by-step diagnosis selects your symptom and produces a tailored action plan.","5":"Error Log Viewer \u2014 PHP errors parsed from debug.log and server error_log, attributed to the owning plugin with type filters.","6":"Change History \u2014 full audit trail of every plugin activation, deactivation, update, installation and deletion with timestamps.","7":"Health Scan \u2014 on-demand scan for duplicate functionality, outdated plugins, incompatibilities and server configuration issues."}},"plugin_section":[],"plugin_tags":[191246,94,93,1508,2391],"plugin_category":[59],"plugin_contributors":[266135],"plugin_business_model":[],"class_list":["post-322338","plugin","type-plugin","status-publish","hentry","plugin_tags-conflict","plugin_tags-debug","plugin_tags-errors","plugin_tags-health","plugin_tags-plugins","plugin_category-utilities-and-tools","plugin_contributors-mustafatahhan","plugin_committers-mustafatahhan"],"banners":{"banner":"https:\/\/ps.w.org\/tahhan-conflict-detective\/assets\/banner-772x250.png?rev=3574302","banner_2x":"https:\/\/ps.w.org\/tahhan-conflict-detective\/assets\/banner-1544x500.png?rev=3574302","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/tahhan-conflict-detective\/assets\/icon-128x128.png?rev=3572689","icon_2x":"https:\/\/ps.w.org\/tahhan-conflict-detective\/assets\/icon-256x256.png?rev=3572689","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/tahhan-conflict-detective\/assets\/screenshot-1.png?rev=3572694","caption":"Dashboard \u2014 live system overview: active plugins, stat cards, recent changes and the likely conflict culprit widget."},{"src":"https:\/\/ps.w.org\/tahhan-conflict-detective\/assets\/screenshot-2.png?rev=3572694","caption":"Conflict Scanner \u2014 detected conflicts ranked by confidence score with one-click \"Mark Resolved\"."},{"src":"https:\/\/ps.w.org\/tahhan-conflict-detective\/assets\/screenshot-3.png?rev=3572694","caption":"Safe Testing Mode \u2014 amber active banner shows disabled-plugin count; toggle any plugin on\/off for your session only."},{"src":"https:\/\/ps.w.org\/tahhan-conflict-detective\/assets\/screenshot-4.png?rev=3572694","caption":"Conflict Wizard \u2014 step-by-step diagnosis selects your symptom and produces a tailored action plan."},{"src":"https:\/\/ps.w.org\/tahhan-conflict-detective\/assets\/screenshot-5.png?rev=3572694","caption":"Error Log Viewer \u2014 PHP errors parsed from debug.log and server error_log, attributed to the owning plugin with type filters."},{"src":"https:\/\/ps.w.org\/tahhan-conflict-detective\/assets\/screenshot-6.png?rev=3572694","caption":"Change History \u2014 full audit trail of every plugin activation, deactivation, update, installation and deletion with timestamps."},{"src":"https:\/\/ps.w.org\/tahhan-conflict-detective\/assets\/screenshot-7.png?rev=3572694","caption":"Health Scan \u2014 on-demand scan for duplicate functionality, outdated plugins, incompatibilities and server configuration issues."}],"raw_content":"<!--section=description-->\n<p><strong>\"Which plugin just broke my site?\"<\/strong> \u2014 answered automatically.<\/p>\n\n<p>Existing tools show you <em>that<\/em> an error occurred. Conflict Detective tells you <em>which plugin caused it<\/em> by correlating the plugin change timeline with the error log \u2014 and gives you a confidence score.<\/p>\n\n<h4>Features<\/h4>\n\n<p><strong>Dashboard<\/strong>\nLive overview of your WordPress\/PHP version, active plugins, active theme, memory limit, debug mode, recent changes, and latest errors \u2014 all on one screen.<\/p>\n\n<p><strong>Error Log Viewer<\/strong>\nReads <code>debug.log<\/code> and the server PHP error log automatically. Each entry is attributed to the plugin that owns the file where the error occurred. Filter by Fatal \/ Warning \/ Notice \/ Deprecated.<\/p>\n\n<p><strong>Change History<\/strong>\nFull audit trail of every plugin activation, deactivation, update, and deletion \u2014 with exact timestamps and version diffs (e.g. <code>8.3.0 \u2192 8.4.0<\/code>).<\/p>\n\n<p><strong>Health Scan<\/strong>\nOn-demand scan that detects:<\/p>\n\n<ul>\n<li>Duplicate plugin functionality (multiple SEO, caching, security, or backup plugins)<\/li>\n<li>Known incompatibilities between specific plugin pairs<\/li>\n<li>Outdated plugins (not updated in more than 2 years)<\/li>\n<li>Missing theme files or a missing parent theme<\/li>\n<li>PHP version, memory limit, and <code>max_execution_time<\/code> misconfigurations<\/li>\n<li>Pending WordPress core updates<\/li>\n<\/ul>\n\n<p><strong>Conflict Scanner<\/strong>\nAutomatically correlates plugin update timestamps with error spikes and reports a suspect plugin with a confidence percentage. Detected conflicts are stored in the database and can be marked as resolved with one click.<\/p>\n\n<p><strong>Safe Testing Mode<\/strong>\nDisable any plugin for your own admin session while visitors remain completely unaffected. Cookie-isolated \u2014 the live site is never touched.<\/p>\n\n<p><strong>Conflict Wizard<\/strong>\nStep-by-step guided diagnosis. Choose your symptom (white screen, login problem, WooCommerce issue, slow site, broken admin, front-end error, or other) and the wizard automatically analyses recent changes and errors to produce a tailored action plan.<\/p>\n\n<p><strong>Performance Monitor<\/strong> <em>(new in 2.6.0)<\/em>\nTracks the estimated load time, memory delta, and database query count for every active plugin during the current page load. Results are color-coded as Fast \/ Slow \/ Heavy and refreshed on demand.<\/p>\n\n<p><strong>Cron Monitor<\/strong> <em>(new in 2.6.0)<\/em>\nLists all scheduled WordPress Cron events with their next run time and interval. Overdue events are highlighted in red. Each event can be triggered manually via a \"Run Now\" button \u2014 validated against the live WP-Cron schedule before execution.<\/p>\n\n<p><strong>AJAX \/ REST Monitor<\/strong> <em>(new in 2.6.0)<\/em>\nAutomatically logs slow AJAX and REST API calls (those taking more than 500 ms) to a dedicated database table. Filter by All \/ AJAX \/ REST \/ Slow to quickly identify bottleneck endpoints.<\/p>\n\n<p><strong>Plugin Interaction Map<\/strong> <em>(new in 2.6.0)<\/em>\nVisualises your plugins grouped into known ecosystem clusters (WooCommerce, Elementor, Yoast SEO, Jetpack, ACF, Gravity Forms, and more). Highlights declared plugin dependencies and shows active\/inactive state at a glance. Plugins that don't belong to a known ecosystem are listed separately as Standalone Plugins.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>tahhan-conflict-detective<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Navigate to <strong>Conflict Detective<\/strong> in the WordPress admin sidebar.<\/li>\n<\/ol>\n\n<p>No configuration is required. All scanning is done on demand inside the admin area \u2014 zero front-end overhead.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20slow%20down%20my%20site%3F\"><h3>Does this plugin slow down my site?<\/h3><\/dt>\n<dd><p>No. All analysis runs on demand inside the WordPress admin. There is zero front-end overhead.<\/p><\/dd>\n<dt id=\"what%20log%20files%20does%20it%20read%3F\"><h3>What log files does it read?<\/h3><\/dt>\n<dd><p>wp-content\/debug.log and the server PHP <code>error_log<\/code> path returned by <code>ini_get('error_log')<\/code>.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20configure%20anything%3F\"><h3>Do I need to configure anything?<\/h3><\/dt>\n<dd><p>No. Optionally, enable <code>WP_DEBUG<\/code> and <code>WP_DEBUG_LOG<\/code> in <code>wp-config.php<\/code> to populate the error log.<\/p><\/dd>\n<dt id=\"does%20safe%20testing%20mode%20affect%20my%20visitors%3F\"><h3>Does Safe Testing Mode affect my visitors?<\/h3><\/dt>\n<dd><p>Never. Safe Testing Mode uses a session cookie that is only present for your admin session. Visitors always see the live site.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20install%20the%20plugin%20via%20ftp%3F\"><h3>What happens if I install the plugin via FTP?<\/h3><\/dt>\n<dd><p>The plugin detects missing database tables on every request and recreates them automatically \u2014 no activation hook required.<\/p><\/dd>\n<dt id=\"is%20this%20plugin%20compatible%20with%20multisite%3F\"><h3>Is this plugin compatible with Multisite?<\/h3><\/dt>\n<dd><p>The plugin monitors the current site only. It is not a network-wide tool in this version.<\/p><\/dd>\n<dt id=\"how%20does%20the%20performance%20monitor%20work%3F\"><h3>How does the Performance Monitor work?<\/h3><\/dt>\n<dd><p>Performance Monitor hooks into WordPress's <code>plugin_loaded<\/code> action, which fires once for every plugin that loads. It records a snapshot of the PHP execution time, memory usage, and database query count immediately before and after each plugin loads, then computes the delta. The results are stored in a 5-minute transient and can be refreshed on demand. Because measurements happen at request time, values vary between requests \u2014 treat them as estimates rather than precise benchmarks.<\/p><\/dd>\n<dt id=\"does%20the%20ajax%20%2F%20rest%20monitor%20log%20every%20request%3F\"><h3>Does the AJAX \/ REST Monitor log every request?<\/h3><\/dt>\n<dd><p>No. Only requests that take longer than 500 ms are written to the database. The log is automatically trimmed to the most recent 500 entries.<\/p><\/dd>\n<dt id=\"can%20i%20manually%20trigger%20a%20wordpress%20cron%20event%3F\"><h3>Can I manually trigger a WordPress Cron event?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>Conflict Detective \u2192 Cron Monitor<\/strong> and click the \"Run Now\" button next to any event. The plugin validates the hook name against the live WP-Cron schedule before execution so arbitrary code cannot be triggered via this interface.<\/p><\/dd>\n<dt id=\"what%20is%20the%20plugin%20interaction%20map%3F\"><h3>What is the Plugin Interaction Map?<\/h3><\/dt>\n<dd><p>The Interaction Map groups your installed plugins into known ecosystem clusters (WooCommerce, Elementor, Yoast SEO, Jetpack, ACF, Gravity Forms, Contact Form 7, WPML, LearnDash, Divi, WP Rocket, and more). Plugins within the same ecosystem are more likely to interact and potentially conflict with each other. The map also reads the <code>Requires Plugins<\/code> header introduced in WordPress 6.5 to show explicit declared dependencies.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.6.1<\/h4>\n\n<ul>\n<li>Updated: Tested up to WordPress 7.0.<\/li>\n<\/ul>\n\n<h4>2.6.0<\/h4>\n\n<ul>\n<li>New: Performance Monitor tab \u2014 tracks per-plugin load time, memory delta, and DB query count during page load; color-coded Fast \/ Slow \/ Heavy badges; Refresh Data button.<\/li>\n<li>New: Cron Monitor tab \u2014 lists all scheduled WP-Cron events with next run time and overdue detection; \"Run Now\" button per event; overdue count summary badge at top.<\/li>\n<li>New: AJAX \/ REST Monitor tab \u2014 logs slow AJAX and REST API calls (&gt;500 ms) to a dedicated DB table; filter bar for All \/ AJAX \/ REST \/ Slow views.<\/li>\n<li>New: Plugin Interaction Map tab \u2014 visualises plugin dependency clusters (WooCommerce, Elementor, Yoast, Jetpack, ACF, etc.) and standalone plugins with active\/inactive state.<\/li>\n<li>Security: cron \"Run Now\" AJAX handler now validates the hook against the live WP-Cron schedule before execution.<\/li>\n<li>Security: AJAX monitor REST timing now reads from <code>$_SERVER<\/code> directly (was using non-standard <code>$GLOBALS['_SERVER']<\/code>).<\/li>\n<li>Security: AJAX log <code>get_entries()<\/code> now selects only required columns instead of <code>SELECT *<\/code>.<\/li>\n<li>DB: new <code>{prefix}cd_ajax_log<\/code> table (schema version 3).<\/li>\n<\/ul>\n\n<h4>2.5.1<\/h4>\n\n<ul>\n<li>Fixed: uninstall routine now correctly deletes <code>tahcd_prev_version_*<\/code> options (was using the stale <code>pcd_prev_version_<\/code> prefix, leaving orphaned rows in wp_options).<\/li>\n<li>Fixed: Safe Mode plugin list no longer shows Conflict Detective itself (self-exclusion filter used the old slug <code>conflict-detective\/conflict-detective.php<\/code>).<\/li>\n<li>Docs: readme.txt changelog updated with entries for v2.2.0 through v2.5.0.<\/li>\n<\/ul>\n\n<h4>2.5.0<\/h4>\n\n<ul>\n<li>All plugin-specific prefixes standardised to <code>tahcd_<\/code> \/ <code>TAHCD_<\/code> to satisfy WordPress.org uniqueness requirements (constants, AJAX actions, nonce, user meta, cookie, option keys, script handle, JS data object).<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>Plugin renamed to Tahhan Conflict Detective (slug: <code>tahhan-conflict-detective<\/code>) for WordPress.org compliance. Namespace changed to <code>TahhanConflictDetective<\/code>. Text domain changed to <code>tahhan-conflict-detective<\/code>.<\/li>\n<li>Debug log clear handler now uses <code>WP_Filesystem::put_contents()<\/code> instead of <code>file_put_contents()<\/code>.<\/li>\n<\/ul>\n\n<h4>2.3.1<\/h4>\n\n<ul>\n<li>Fixed critical infinite recursion crash: <code>maybe_filter_active_plugins()<\/code> called <code>get_option('active_plugins')<\/code> which re-triggered the same filter, causing a stack overflow. Fixed by reading directly from <code>$wpdb<\/code>.<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>CI action SHA pinning for security hardening. Code cleanup in class-dashboard.php and class-error-log.php.<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>Safe Mode tab fully functional: Start\/Stop button now triggers AJAX and reloads on success.<\/li>\n<li>Architecture fix: <code>Safe_Mode::init()<\/code> and <code>Database::maybe_upgrade()<\/code> moved to file-load time.<\/li>\n<\/ul>\n\n<h4>2.1.4<\/h4>\n\n<ul>\n<li>Fixed critical bug: Safe_Mode::init() and Database::maybe_upgrade() were registered inside Plugin::init() on plugins_loaded priority 5, meaning they were never called (priority 1 and 0 already fired). Both are now wired up directly at file load time, outside the Plugin class.<\/li>\n<li>Safe Mode tab fully redesigned: inactive state shows a card with instructions and a Start button; active state shows an amber banner with plugin count and a Stop button above the plugin toggle list.<\/li>\n<li>JavaScript Safe Mode toggle now uses delegated event binding ($(document).on) so it works regardless of DOM load order, and reloads the page on success to reflect the new state.<\/li>\n<li>Added safeModeLoading and safeModeStop localised strings for button feedback during AJAX calls.<\/li>\n<li>Added CSS for .pcd-safe-mode-banner, .pcd-btn-stop, .pcd-safe-mode-steps, and .pcd-safe-mode-count.<\/li>\n<\/ul>\n\n<h4>2.1.3<\/h4>\n\n<ul>\n<li>Added Safe Mode tab UI (render_safe_mode placeholder).<\/li>\n<\/ul>\n\n<h4>2.1.1<\/h4>\n\n<ul>\n<li>Security: plugin slug from AJAX request now validated against the installed plugins list before being stored in user meta<\/li>\n<li>All JavaScript UI strings are now translatable via wp_localize_script \u2014 no hardcoded English in JS<\/li>\n<li>Replaced last remaining emoji with a Dashicon in the Conflict Wizard<\/li>\n<li>Fixed menu position conflict with WordPress core Plugins menu (changed from 65 to 65.1)<\/li>\n<li>Added languages\/ directory to match the Domain Path declaration in the plugin header<\/li>\n<li>Fixed navigation instructions in documentation (plugin is a top-level menu, not under Tools)<\/li>\n<li>LICENSE updated to full GPL-2.0-or-later text including the \"or any later version\" clause<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Added Conflict Scanner with confidence percentage<\/li>\n<li>Added Safe Testing Mode (admin-only plugin toggle, visitors unaffected)<\/li>\n<li>Added Conflict Wizard with 7 symptom categories and automatic analysis<\/li>\n<li>New database table for storing scanner results<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release \u2014 Dashboard, Error Log Viewer, Plugin Change History, Health Scan<\/li>\n<\/ul>","raw_excerpt":"Automatically detects which plugin, theme, or update broke your WordPress site \u2014 without manual trial and error.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/he.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/322338","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/he.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/he.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/he.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=322338"}],"author":[{"embeddable":true,"href":"https:\/\/he.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mustafatahhan"}],"wp:attachment":[{"href":"https:\/\/he.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=322338"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/he.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=322338"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/he.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=322338"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/he.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=322338"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/he.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=322338"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/he.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=322338"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}