*/
namespace RankMath\Admin;
use RankMath\Runner;
use RankMath\Traits\Hooker;
use RankMath\Helper as GlobalHelper;
defined( 'ABSPATH' ) || exit;
/**
* Watcher class.
*/
class Watcher implements Runner {
use Hooker;
/**
* Register hooks.
*/
public function hooks() {
$this->action( 'init', 'init' );
$this->action( 'activated_plugin', 'check_activated_plugin' );
$this->action( 'deactivated_plugin', 'check_deactivated_plugin' );
}
/**
* Set/Deactivate conflicting SEO or Sitemap plugins.
*/
public function init() {
if ( isset( $_GET['rank_math_deactivate_seo_plugins'] ) ) {
$this->deactivate_conflicting_plugins( 'seo' );
return;
}
if ( isset( $_GET['rank_math_deactivate_sitemap_plugins'] ) ) {
$this->deactivate_conflicting_plugins( 'sitemap' );
return;
}
}
/**
* Function to run when new plugin is activated.
*/
public static function check_activated_plugin() {
$set = [];
$plugins = get_option( 'active_plugins', [] );
foreach ( self::get_conflicting_plugins() as $plugin => $type ) {
if ( ! isset( $set[ $type ] ) && in_array( $plugin, $plugins, true ) ) {
$set[ $type ] = true;
self::set_notification( $type );
}
}
}
/**
* Function to run when plugin is deactivated.
*
* @param string $plugin Deactivated plugin path.
*/
public function check_deactivated_plugin( $plugin ) {
$plugins = self::get_conflicting_plugins();
if ( ! isset( $plugins[ $plugin ] ) ) {
return;
}
$this->remove_notification( $plugins[ $plugin ], $plugin );
}
/**
* Function to run when Module is enabled/disabled.
*
* @param string $module Module.
* @param string $state Module state.
*/
public static function module_changed( $module, $state ) {
if ( ! in_array( $module, [ 'sitemap', 'redirections', 'rich-snippet' ], true ) ) {
return;
}
if ( 'off' === $state ) {
$type = 'sitemap' === $module ? 'sitemap' : 'seo';
GlobalHelper::remove_notification( "conflicting_{$type}_plugins" );
}
self::check_activated_plugin();
}
/**
* Deactivate conflicting plugins.
*
* @param string $type Plugin type.
*/
private function deactivate_conflicting_plugins( $type ) {
foreach ( self::get_conflicting_plugins() as $plugin => $plugin_type ) {
if ( $type === $plugin_type && is_plugin_active( $plugin ) ) {
deactivate_plugins( $plugin );
}
}
wp_redirect( remove_query_arg( "rank_math_deactivate_{$type}_plugins" ) );
}
/**
* Function to set conflict plugin notification.
*
* @param string $type Plugin type.
*/
private static function set_notification( $type ) {
$message = sprintf(
/* translators: deactivation link */
esc_html__( 'Please keep only one SEO plugin active, otherwise, you might lose your rankings and traffic. %s.', 'rank-math' ),
'Click here to Deactivate'
);
if ( 'sitemap' === $type ) {
$message = sprintf(
/* translators: deactivation link */
esc_html__( 'Please keep only one Sitemap plugin active, otherwise, you might lose your rankings and traffic. %s.', 'rank-math' ),
'Click here to Deactivate'
);
}
GlobalHelper::add_notification( $message, [
'id' => "conflicting_{$type}_plugins",
'type' => 'error',
] );
}
/**
* Function to remove conflict plugin notification.
*
* @param string $type Plugin type.
* @param string $plugin Plugin name.
*/
private function remove_notification( $type, $plugin ) {
foreach ( self::get_conflicting_plugins() as $file => $plugin_type ) {
if ( $plugin !== $file && $type === $plugin_type && is_plugin_active( $file ) ) {
return;
}
}
GlobalHelper::remove_notification( "conflicting_{$type}_plugins" );
}
/**
* Function to get all conflicting plugins.
*
* @return array
*/
private static function get_conflicting_plugins() {
$plugins = array(
'wordpress-seo/wp-seo.php' => 'seo',
'wordpress-seo-premium/wp-seo-premium.php' => 'seo',
'all-in-one-seo-pack/all_in_one_seo_pack.php' => 'seo',
'wp-seopress/seopress.php' => 'seo',
'wp-seopress-pro/seopress-pro.php' => 'seo',
);
if ( GlobalHelper::is_module_active( 'redirections' ) ) {
$plugins['redirection/redirection.php'] = 'seo';
}
if ( GlobalHelper::is_module_active( 'sitemap' ) ) {
$plugins['google-sitemap-generator/sitemap.php'] = 'sitemap';
$plugins['xml-sitemap-feed/xml-sitemap.php'] = 'sitemap';
}
if ( GlobalHelper::is_module_active( 'rich-snippet' ) ) {
$plugins['wp-schema-pro/wp-schema-pro.php'] = 'seo';
$plugins['all-in-one-schemaorg-rich-snippets/index.php'] = 'seo';
}
return $plugins;
}
}