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
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;
|
|
}
|
|
}
|