render_layout_open('Compatibility', 'compatibility', 'Check compatibility status with popular plugins, page builders, and caching solutions.');
?>
render_compatibility_sections(); ?>
Host Blocking Test
Verify if this site can reach services.
Test Configuration
Test connectivity by running both GET and POST requests. Results appear below.
Test Both Requests
render_troubleshooting_section(); ?>
🚫 Excluded URLs
Manage URLs where should not run. Add URL patterns to exclude specific pages from processing.
render_layout_close();
}
public function render_compatibility_sections()
{
?>
render_compatibility_section(
$this->get_page_builders_compatibility(),
'admin-page',
'Page Builders',
'Elementor, Divi, Gutenberg, Oxygen, Bricks'
); ?>
render_compatibility_section(
$this->get_themes_compatibility(),
'art',
'Themes',
'Astra, GeneratePress, OceanWP and more'
); ?>
render_compatibility_section(
$this->get_seo_plugins_compatibility(),
'search',
'SEO Plugins',
'Yoast, Rank Math, AIOSEO and others'
); ?>
render_compatibility_section(
$this->get_cache_plugins_compatibility(),
'performance',
'Cache & Performance',
'WP Rocket, LiteSpeed, W3 Total Cache and more'
); ?>
render_compatibility_section(
$this->get_cdn_compatibility(),
'networking',
'CDN & Hosting',
'Cloudflare, Fastly, Bunny CDN, Kinsta, Flywheel'
); ?>
$i['is_installed'] && $i['is_active'] ) );
$total = count( $items );
$subtitle = $active_count > 0
? $active_count . ' of ' . $total . ' active'
: ( $description ?: $total . ' checked' );
?>
'Title tag disappears when Yoast SEO is active',
'cause' => 'Yoast SEO takes ownership of the tag. ' . $plugin_name . ' filters may conflict if both try to modify the document title at the same priority.',
'fix' => 'Go to ' . $plugin_name . ' → Settings → Compatibility and make sure "Yoast SEO title handoff" is enabled. This lets Yoast own the title while ' . $plugin_name . ' passes its optimised title through Yoast.',
],
[
'title' => $otto_name . ' changes not appearing after cache flush',
'cause' => 'Some cache plugins (WP Rocket, Kinsta) serve stale HTML even after a purge if cache warm-up races with the write.',
'fix' => 'Increase the cache warm-up timeout in ' . $plugin_name . ' → Settings → Advanced, or disable "Immediate Warm-up" and let the cache rebuild organically.',
],
[
'title' => 'SEO meta not showing for Oxygen Builder pages',
'cause' => 'Oxygen replaces the standard WordPress template, bypassing some meta output hooks.',
'fix' => $plugin_name . ' automatically handles Oxygen compatibility — no setting required. If meta is still missing, ensure ' . $plugin_name . ' is up to date and try clearing any server-side or CDN cache.',
],
[
'title' => 'Schema markup injected on every page instead of the target page only',
'cause' => 'A known bug in versions prior to 2.5.20 where schema was registered globally.',
'fix' => 'Update to the latest version. Go to Settings → Schema Markup and re-save your configuration.',
],
[
'title' => 'Sitemap returns 404',
'cause' => 'Permalink flush needed after activation or after a WordPress update.',
'fix' => 'Go to Settings → Permalinks in WordPress admin and click "Save Changes" (no actual change needed — this flushes rewrite rules).',
],
[
'title' => 'Cloudflare / CDN caching stale SEO meta',
'cause' => 'CDN caches the full HTML response including meta tags. After updating SEO meta, the CDN may serve old content.',
'fix' => 'Purge the CDN cache for the affected URL via your CDN dashboard, or enable automatic purge integration in ' . $plugin_name . ' → Settings → Cache.',
],
];
?>
Troubleshooting
Common issues and how to fix them.
Lock Section
[
'name' => 'Elementor',
'plugin_files' => [ 'elementor/elementor.php', 'elementor-pro/elementor-pro.php' ],
'supported' => true,
'version' => '3.31.5',
],
'gutenberg' => [
'name' => 'WordPress Block Editor',
'plugin_files' => [ 'gutenberg/gutenberg.php' ],
'supported' => true,
'is_core' => true,
'version' => get_bloginfo( 'version' ),
],
'divi' => [
'name' => 'Divi Builder',
'plugin_files' => [ 'divi-builder/divi-builder.php' ],
'theme_name' => 'Divi',
'supported' => true,
'version' => '',
],
'oxygen' => [
'name' => 'Oxygen Builder',
'plugin_files' => [ 'oxygen/functions.php' ],
'supported' => true,
'version' => '4.9',
'note' => 'Enable Oxygen Compatibility in Settings for correct meta output.',
],
'bricks' => [
'name' => 'Bricks Builder',
'plugin_files' => [ 'bricks/bricks.php' ],
'supported' => true,
'version' => '1.11',
],
];
$result = [];
foreach ($builders as $key => $builder) {
$is_core = isset($builder['is_core']) && $builder['is_core'];
$theme_name = isset($builder['theme_name']) ? $builder['theme_name'] : null;
$plugin_status = $this->get_plugin_status($builder['plugin_files'], $is_core, $theme_name);
if ($builder['supported']) {
$status = 'supported';
$status_text = 'Supported';
} else {
$status = 'coming-soon';
$status_text = 'Coming Soon';
}
$result[] = [
'name' => $builder['name'],
'version' => $builder['version'],
'status' => $status,
'status_text' => $status_text,
'is_installed' => $plugin_status['is_installed'],
'is_active' => $plugin_status['is_active'],
'note' => $builder['note'] ?? '',
'logo' => $this->get_plugin_logo( $key, 'page_builder' ),
];
}
return $result;
}
public function get_seo_plugins_compatibility()
{
$plugins = [
'yoast' => [
'name' => 'Yoast SEO',
'plugin_files' => [
'wordpress-seo/wp-seo.php',
'wordpress-seo-premium/wp-seo-premium.php'
],
'supported' => true,
'version' => '25.9.0'
],
'rankmath' => [
'name' => 'Rank Math',
'plugin_files' => [
'seo-by-rank-math/rank-math.php',
'seo-by-rank-math-pro/rank-math-pro.php'
],
'supported' => true,
'version' => '1.0.253.0'
],
'aioseo' => [
'name' => 'All in One SEO',
'plugin_files' => [
'all-in-one-seo-pack/all_in_one_seo_pack.php',
'all-in-one-seo-pack-pro/all_in_one_seo_pack.php'
],
'supported' => true,
'version' => '4.8.7'
]
];
$result = [];
foreach ($plugins as $key => $plugin) {
$plugin_status = $this->get_plugin_status($plugin['plugin_files']);
if ($plugin['supported']) {
$status = 'supported';
$status_text = 'Supported';
} else {
$status = 'coming-soon';
$status_text = 'Coming Soon';
}
$result[] = [
'name' => $plugin['name'],
'version' => $plugin['version'],
'status' => $status,
'status_text' => $status_text,
'is_installed' => $plugin_status['is_installed'],
'is_active' => $plugin_status['is_active'],
'note' => $plugin['note'] ?? '',
'logo' => $this->get_plugin_logo( $key, 'seo' ),
];
}
return $result;
}
public function get_themes_compatibility()
{
$themes = [
'astra' => [
'name' => 'Astra',
'theme_name' => 'Astra',
'plugin_files' => [],
'supported' => true,
'version' => '4.8',
'note' => 'Full compatibility including title tag and schema support.',
],
'generatepress' => [
'name' => 'GeneratePress',
'theme_name' => 'GeneratePress',
'plugin_files' => [],
'supported' => true,
'version' => '3.5',
],
'oceanwp' => [
'name' => 'OceanWP',
'theme_name' => 'OceanWP',
'plugin_files' => [],
'supported' => true,
'version' => '3.5',
],
'hello-elementor' => [
'name' => 'Hello Elementor',
'theme_name' => 'Hello Elementor',
'plugin_files' => [],
'supported' => true,
'version' => '3.1',
],
'kadence' => [
'name' => 'Kadence',
'theme_name' => 'Kadence',
'plugin_files' => [],
'supported' => true,
'version' => '1.2',
],
];
$result = [];
foreach ( $themes as $key => $theme ) {
$status = $this->get_plugin_status( $theme['plugin_files'], false, $theme['theme_name'] );
$result[] = [
'name' => $theme['name'],
'version' => $theme['version'],
'status' => 'supported',
'status_text' => 'Supported',
'is_installed' => $status['is_installed'],
'is_active' => $status['is_active'],
'note' => $theme['note'] ?? '',
'logo' => $this->get_plugin_logo( $key, 'theme' ),
];
}
return $result;
}
public function get_cache_plugins_compatibility()
{
$plugins = [
'wp-rocket' => [
'name' => 'WP Rocket',
'plugin_files' => [ 'wp-rocket/wp-rocket.php' ],
'supported' => true,
'version' => '3.16',
'note' => 'Automatic cache purge on OTTO update.',
],
'litespeed-cache' => [
'name' => 'LiteSpeed Cache',
'plugin_files' => [ 'litespeed-cache/litespeed-cache.php' ],
'supported' => true,
'version' => '7.5.0.1',
],
'w3-total-cache' => [
'name' => 'W3 Total Cache',
'plugin_files' => [ 'w3-total-cache/w3-total-cache.php' ],
'supported' => true,
'version' => '2.7',
],
'sg-cachepress' => [
'name' => 'SiteGround Optimizer',
'plugin_files' => [ 'sg-cachepress/sg-cachepress.php' ],
'supported' => true,
'version' => '7.6',
],
'hummingbird-performance' => [
'name' => 'Hummingbird',
'plugin_files' => [ 'hummingbird-performance/wp-hummingbird.php' ],
'supported' => true,
'version' => '3.9',
],
'autoptimize' => [
'name' => 'Autoptimize',
'plugin_files' => [ 'autoptimize/autoptimize.php' ],
'supported' => true,
'version' => '3.1',
],
'comet-cache' => [
'name' => 'Comet Cache',
'plugin_files' => [ 'comet-cache/comet-cache.php' ],
'supported' => true,
'version' => '17.6',
],
'cache-enabler' => [
'name' => 'Cache Enabler',
'plugin_files' => [ 'cache-enabler/cache-enabler.php' ],
'supported' => true,
'version' => '1.8',
],
'breeze' => [
'name' => 'Breeze (Cloudways)',
'plugin_files' => [ 'breeze/breeze.php' ],
'supported' => true,
'version' => '2.1',
],
];
$result = [];
foreach ($plugins as $key => $plugin) {
$plugin_status = $this->get_plugin_status($plugin['plugin_files']);
if ($plugin['supported']) {
$status = 'supported';
$status_text = 'Supported';
} else {
$status = 'coming-soon';
$status_text = 'Coming Soon';
}
$result[] = [
'name' => $plugin['name'],
'version' => $plugin['version'],
'status' => $status,
'status_text' => $status_text,
'is_installed' => $plugin_status['is_installed'],
'is_active' => $plugin_status['is_active'],
'note' => $plugin['note'] ?? '',
'logo' => $this->get_plugin_logo( $key, 'cache' ),
];
}
return $result;
}
public function get_cdn_compatibility()
{
$providers = [
'cloudflare' => [
'name' => 'Cloudflare',
'plugin_files' => [ 'cloudflare/cloudflare.php' ],
'supported' => true,
'version' => '',
'note' => 'Cache purge supported. Ensure HTML caching is disabled or bypass rules set for admin.',
],
'fastly' => [
'name' => 'Fastly',
'plugin_files' => [ 'fastly/fastly.php' ],
'supported' => true,
'version' => '',
'note' => 'Edge cache purge triggered on OTTO update.',
],
'bunnycdn' => [
'name' => 'Bunny CDN',
'plugin_files' => [ 'bunnycdn/bunnycdn.php', 'bunny-cdn/bunny-cdn.php' ],
'supported' => true,
'version' => '',
],
'kinsta-mu-plugins' => [
'name' => 'Kinsta (Managed Hosting)',
'plugin_files' => [ 'kinsta-mu-plugins/kinsta-mu-plugins.php' ],
'supported' => true,
'version' => '',
'note' => 'Kinsta Varnish/Nginx cache purged per-URL on OTTO update.',
],
'flywheel' => [
'name' => 'Flywheel / Local',
'plugin_files' => [ 'flywheel-common/plugin.php' ],
'supported' => true,
'version' => '',
'note' => 'Varnish cache purge supported.',
],
];
$result = [];
foreach ( $providers as $key => $provider ) {
$status = $this->get_plugin_status( $provider['plugin_files'] );
$result[] = [
'name' => $provider['name'],
'version' => $provider['version'],
'status' => 'supported',
'status_text' => 'Supported',
'is_installed' => $status['is_installed'],
'is_active' => $status['is_active'],
'note' => $provider['note'] ?? '',
'logo' => $this->get_plugin_logo( $key, 'cdn' ),
];
}
return $result;
}
/**
* @deprecated Use get_plugin_status() instead
*/
public function is_plugin_installed($plugin_file)
{
if (!function_exists('is_plugin_active')) {
include_once(ABSPATH . 'wp-admin/includes/plugin.php');
}
return is_plugin_active($plugin_file);
}
/**
* Get detailed plugin status (installed and/or active).
*
* @param array $plugin_files Array of plugin file paths to check
* @param bool $is_core Whether this is a WordPress core feature
* @param string $theme_name Optional theme name to check
* @return array ['is_installed' => bool, 'is_active' => bool, 'active_version' => string|null]
*/
public function get_plugin_status($plugin_files, $is_core = false, $theme_name = null)
{
if ($is_core) {
return [
'is_installed' => true,
'is_active' => true,
'active_version' => 'core'
];
}
if ($theme_name) {
$current_theme = wp_get_theme();
$is_theme_active = (strtolower($current_theme->get('Name')) === strtolower($theme_name) ||
strtolower($current_theme->get_stylesheet()) === strtolower($theme_name));
$theme_exists = wp_get_theme($theme_name)->exists();
if ($theme_exists) {
return [
'is_installed' => true,
'is_active' => $is_theme_active,
'active_version' => $is_theme_active ? 'theme' : null
];
}
}
if (!function_exists('is_plugin_active')) {
include_once(ABSPATH . 'wp-admin/includes/plugin.php');
}
if (!function_exists('get_plugins')) {
include_once(ABSPATH . 'wp-admin/includes/plugin.php');
}
if (!is_array($plugin_files)) {
$plugin_files = [$plugin_files];
}
$is_installed = false;
$is_active = false;
$active_version = null;
foreach ($plugin_files as $plugin_file) {
$plugin_path = WP_PLUGIN_DIR . '/' . $plugin_file;
if (file_exists($plugin_path)) {
$is_installed = true;
if (is_plugin_active($plugin_file)) {
$is_active = true;
$active_version = strpos($plugin_file, 'pro') !== false ||
strpos($plugin_file, 'premium') !== false ?
'premium' : 'free';
break;
}
}
}
return [
'is_installed' => $is_installed,
'is_active' => $is_active,
'active_version' => $active_version
];
}
public function get_plugin_logo($plugin_key, $type)
{
$logos = [
'page_builder' => [
'elementor' => 'https://ps.w.org/elementor/assets/icon-256x256.gif',
'gutenberg' => 'https://i0.wp.com/wordpress.org/files/2023/02/wmark.png',
'divi' => 'https://www.elegantthemes.com/images/logo.svg',
'oxygen' => 'https://oxygenbuilder.com/wp-content/uploads/2021/09/oxygen-logo-icon.png',
'bricks' => 'https://bricksbuilder.io/wp-content/uploads/2021/05/bricks-icon.svg',
],
'theme' => [
'astra' => 'https://ps.w.org/astra/assets/icon-128x128.png',
'generatepress' => 'https://ps.w.org/generatepress/assets/icon-128x128.png',
'oceanwp' => 'https://ps.w.org/ocean-extra/assets/icon-128x128.png',
'hello-elementor' => 'https://ps.w.org/hello-elementor/assets/icon-128x128.png',
'kadence' => 'https://ps.w.org/kadence-blocks/assets/icon-128x128.png',
],
'seo' => [
'yoast' => 'https://ps.w.org/wordpress-seo/assets/icon-128x128.gif',
'rankmath' => 'https://ps.w.org/seo-by-rank-math/assets/icon-128x128.png',
'aioseo' => 'https://ps.w.org/all-in-one-seo-pack/assets/icon-128x128.png',
],
'cache' => [
'wp-rocket' => 'https://ps.w.org/rocket-lazy-load/assets/icon-128x128.png',
'litespeed-cache' => 'https://ps.w.org/litespeed-cache/assets/icon-128x128.png',
'w3-total-cache' => 'https://ps.w.org/w3-total-cache/assets/icon-128x128.png',
'sg-cachepress' => 'https://ps.w.org/sg-cachepress/assets/icon-128x128.png',
'hummingbird-performance' => 'https://ps.w.org/hummingbird-performance/assets/icon-128x128.png',
'autoptimize' => 'https://ps.w.org/autoptimize/assets/icon-128x128.png',
],
'cdn' => [
'cloudflare' => 'https://ps.w.org/cloudflare/assets/icon-128x128.png',
'fastly' => 'https://ps.w.org/purgely/assets/icon-128x128.png',
],
];
return isset($logos[$type][$plugin_key]) ? $logos[$type][$plugin_key] : '';
}
}