188 lines
5.5 KiB
PHP
188 lines
5.5 KiB
PHP
<?php
|
|
/**
|
|
* Early AMP Compatibility Handler for MonsterInsights
|
|
* This runs before MonsterInsights initializes to prevent any scripts from loading
|
|
*
|
|
* @package MonsterInsights
|
|
*/
|
|
|
|
// Prevent direct access
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Class MonsterInsights_AMP_Compatibility_Early
|
|
*/
|
|
class MonsterInsights_AMP_Compatibility_Early {
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct() {
|
|
// Run as early as possible
|
|
add_action( 'init', array( $this, 'init' ), 1 );
|
|
add_action( 'wp', array( $this, 'init' ), 1 );
|
|
add_action( 'template_redirect', array( $this, 'init' ), 1 );
|
|
|
|
// Intercept very early
|
|
add_action( 'plugins_loaded', array( $this, 'intercept_early' ), 1 );
|
|
}
|
|
|
|
/**
|
|
* Initialize early AMP compatibility
|
|
*/
|
|
public function init() {
|
|
// Only run if we're in AMP context
|
|
if ( ! $this->is_amp() ) {
|
|
return;
|
|
}
|
|
|
|
// Remove ALL MonsterInsights hooks before they can execute
|
|
$this->remove_all_monsterinsights_hooks();
|
|
|
|
// Prevent any MonsterInsights functions from executing
|
|
$this->disable_monsterinsights_functions();
|
|
}
|
|
|
|
/**
|
|
* Intercept very early in the loading process
|
|
*/
|
|
public function intercept_early() {
|
|
// Only run if we're in AMP context
|
|
if ( ! $this->is_amp() ) {
|
|
return;
|
|
}
|
|
|
|
// Remove the specific function that's causing the problem
|
|
if ( function_exists( 'monsterinsights_tracking_script' ) ) {
|
|
// Replace the function with a no-op
|
|
$this->replace_monsterinsights_function( 'monsterinsights_tracking_script' );
|
|
}
|
|
|
|
// Remove any other MonsterInsights functions
|
|
$this->replace_monsterinsights_function( 'monsterinsights_frontend_tracking' );
|
|
$this->replace_monsterinsights_function( 'monsterinsights_gtag_tracking' );
|
|
}
|
|
|
|
/**
|
|
* Remove MonsterInsights hooks only (not all hooks)
|
|
*/
|
|
private function remove_all_monsterinsights_hooks() {
|
|
// Remove the specific hook that's causing the problem
|
|
remove_action( 'cmplz_before_statistics_script', 'monsterinsights_tracking_script', 10 );
|
|
|
|
// Remove MonsterInsights specific hooks only
|
|
// DO NOT use remove_all_actions - it breaks other plugins and themes
|
|
remove_action( 'wp_head', 'monsterinsights_tracking_script' );
|
|
remove_action( 'wp_footer', 'monsterinsights_tracking_script' );
|
|
remove_action( 'wp_enqueue_scripts', array( 'MonsterInsights_Gtag_Events', 'output_javascript' ), 9 );
|
|
|
|
// Remove additional MonsterInsights hooks that might be registered
|
|
global $wp_filter;
|
|
|
|
// List of hooks to check for MonsterInsights callbacks
|
|
$hooks_to_check = array( 'wp_head', 'wp_footer', 'wp_body_open', 'wp_enqueue_scripts', 'template_redirect' );
|
|
|
|
foreach ( $hooks_to_check as $hook ) {
|
|
if ( isset( $wp_filter[ $hook ] ) ) {
|
|
foreach ( $wp_filter[ $hook ]->callbacks as $priority => $callbacks ) {
|
|
foreach ( $callbacks as $callback_id => $callback ) {
|
|
// Check if this is a MonsterInsights callback
|
|
if ( $this->is_monsterinsights_callback( $callback['function'] ) ) {
|
|
remove_action( $hook, $callback['function'], $priority );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if a callback is from MonsterInsights
|
|
*
|
|
* @param mixed $callback The callback to check
|
|
* @return bool
|
|
*/
|
|
private function is_monsterinsights_callback( $callback ) {
|
|
// Check for function names containing 'monsterinsights'
|
|
if ( is_string( $callback ) && stripos( $callback, 'monsterinsights' ) !== false ) {
|
|
return true;
|
|
}
|
|
|
|
// Check for class methods
|
|
if ( is_array( $callback ) && isset( $callback[0] ) ) {
|
|
// Object or class name
|
|
$class = is_object( $callback[0] ) ? get_class( $callback[0] ) : $callback[0];
|
|
if ( is_string( $class ) && stripos( $class, 'MonsterInsights' ) !== false ) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Disable MonsterInsights functions
|
|
*/
|
|
private function disable_monsterinsights_functions() {
|
|
// Add filters to prevent any MonsterInsights output
|
|
add_filter( 'monsterinsights_tracking_script', '__return_false', 999999 );
|
|
add_filter( 'monsterinsights_frontend_tracking_options', '__return_false', 999999 );
|
|
add_filter( 'monsterinsights_gtag_tracking', '__return_false', 999999 );
|
|
add_filter( 'monsterinsights_dual_tracking', '__return_false', 999999 );
|
|
|
|
// Disable any MonsterInsights output
|
|
add_filter( 'monsterinsights_output_tracking', '__return_false', 999999 );
|
|
add_filter( 'monsterinsights_output_gtag', '__return_false', 999999 );
|
|
}
|
|
|
|
/**
|
|
* Replace a MonsterInsights function with a no-op
|
|
*/
|
|
private function replace_monsterinsights_function( $function_name ) {
|
|
if ( function_exists( $function_name ) ) {
|
|
// Instead of redefining, we'll use filters to prevent output
|
|
// The function will still exist but won't produce any output
|
|
add_filter( 'monsterinsights_' . $function_name . '_output', '__return_false', 999999 );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if we are in an AMP context
|
|
*
|
|
* @return bool
|
|
*/
|
|
private function is_amp() {
|
|
// Check for AMP plugin
|
|
if ( function_exists( 'is_amp_endpoint' ) && is_amp_endpoint() ) {
|
|
return true;
|
|
}
|
|
|
|
// Check for AMP theme
|
|
if ( function_exists( 'amp_is_request' ) && amp_is_request() ) {
|
|
return true;
|
|
}
|
|
|
|
// Check for AMP query parameter
|
|
if ( isset( $_GET['amp'] ) && '1' === $_GET['amp'] ) {
|
|
return true;
|
|
}
|
|
|
|
// Check for AMP in URL path
|
|
if ( isset( $_SERVER['REQUEST_URI'] ) && false !== strpos( $_SERVER['REQUEST_URI'], '/amp/' ) ) {
|
|
return true;
|
|
}
|
|
|
|
// Check for AMP in theme
|
|
if ( function_exists( 'amp_is_canonical' ) && amp_is_canonical() ) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Initialize early AMP compatibility
|
|
new MonsterInsights_AMP_Compatibility_Early();
|