You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
5.0 KiB
PHP

<?php
/**
* The functionality to detect whether we should import from another SEO plugin.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Admin\Importers
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin\Importers;
use RankMath\Traits\Hooker;
defined( 'ABSPATH' ) || exit;
/**
* Detector class.
*/
class Detector {
use Hooker;
/**
* Plugins we can import from.
*
* @var array
*/
public static $plugins = null;
/**
* Detects whether we can import anything or not.
*
* @return array List of plugins we can import from.
*/
public function detect() {
$this->requirements();
if ( ! is_null( self::$plugins ) ) {
return self::$plugins;
}
self::$plugins = [];
$plugins = $this->get();
foreach ( $plugins as $slug => $plugin ) {
if ( ! $this->is_detectable( $plugin, $plugins ) ) {
continue;
}
$this->can_import( $slug, $plugin );
}
return self::$plugins;
}
/**
* Run import class.
*
* @param Plugin_Importer $importer The importer that needs to perform this action.
* @param string $action The action to perform.
* @param string $perform The action to perform when running import action.
*/
public function run( $importer, $action = 'detect', $perform = '' ) {
if ( 'cleanup' === $action ) {
return $importer->run_cleanup();
} elseif ( 'import' === $action ) {
return $importer->run_import( $perform );
}
return $importer->run_detect();
}
/**
* Run action by slug.
*
* @param string $slug The importer slug that needs to perform this action.
* @param string $action The action to perform.
* @param string $perform The action to perform when running import action.
*/
public static function run_by_slug( $slug, $action, $perform = '' ) {
$detector = new self();
$importers = $detector->get();
if ( ! isset( $importers[ $slug ] ) ) {
return false;
}
$importer = $importers[ $slug ];
$importer = new $importer['class']( $importer['file'] );
$status = $detector->run( $importer, $action, $perform );
return \compact( 'importer', 'status' );
}
/**
* Deactivate all plugins.
*/
public static function deactivate_all() {
$detector = new Detector();
$plugins = $detector->get();
foreach ( $plugins as $plugin ) {
deactivate_plugins( $plugin['file'] );
}
}
/**
* Get the list of available importers.
*
* @return array Available importers.
*/
public function get() {
return $this->do_filter(
'importers/detect_plugins',
[
'yoast' => [
'class' => '\\RankMath\\Admin\\Importers\\Yoast',
'file' => 'wordpress-seo/wp-seo.php',
'premium' => 'yoast-premium',
],
'seopress' => [
'class' => '\\RankMath\\Admin\\Importers\\SEOPress',
'file' => 'wp-seopress/seopress.php',
],
'aioseo' => [
'class' => '\\RankMath\\Admin\\Importers\\AIOSEO',
'file' => 'all-in-one-seo-pack/all_in_one_seo_pack.php',
'premium' => 'all-in-one-seo-pack-pro',
],
'all-in-one-seo-pack-pro' => [
'class' => '\\RankMath\\Admin\\Importers\\AIOSEO',
'file' => 'all-in-one-seo-pack-pro/all_in_one_seo_pack.php',
'parent' => 'aioseo',
],
'yoast-premium' => [
'class' => '\\RankMath\\Admin\\Importers\\Yoast',
'file' => 'wordpress-seo-premium/wp-seo-premium.php',
'parent' => 'yoast',
],
'aio-rich-snippet' => [
'class' => '\\RankMath\\Admin\\Importers\\AIO_Rich_Snippet',
'file' => 'all-in-one-schemaorg-rich-snippets/index.php',
],
'wp-schema-pro' => [
'class' => '\\RankMath\\Admin\\Importers\\WP_Schema_Pro',
'file' => 'wp-schema-pro/wp-schema-pro.php',
],
'redirections' => [
'class' => '\\RankMath\\Admin\\Importers\\Redirections',
'file' => 'redirection/redirection.php',
],
]
);
}
/**
* Check requirements.
*/
private function requirements() {
if ( ! function_exists( 'is_plugin_active' ) ) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
}
/**
* Can import plugin data.
*
* @param string $slug Plugin slug.
* @param array $plugin Plugin data.
*/
private function can_import( $slug, $plugin ) {
$importer = new $plugin['class']( $plugin['file'] );
if ( $importer->run_detect() ) {
self::$plugins[ $slug ] = [
'name' => $importer->get_plugin_name(),
'file' => $importer->get_plugin_file(),
'choices' => $importer->get_choices(),
];
}
}
/**
* Check if plugin is detectable.
*
* @param array $check Plugin to check.
* @param array $plugins Plugins data.
*
* @return bool
*/
private function is_detectable( $check, $plugins ) {
// Check if parent is set.
if ( isset( $check['parent'] ) && isset( self::$plugins[ $check['parent'] ] ) ) {
return false;
}
// Check if plugin has premium and it is active.
if ( isset( $check['premium'] ) && is_plugin_active( $plugins[ $check['premium'] ]['file'] ) ) {
return false;
}
return true;
}
}