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.

553 lines
15 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php // @codingStandardsIgnoreLine
/**
* Rank Math SEO PRO Plugin.
*
* @package RANK_MATH
* @copyright Copyright (C) 2018-2020, Rank Math - support@rankmath.com
* @link https://rankmath.com
* @since 2.0.0
*
* @wordpress-plugin
* Plugin Name: Rank Math SEO PRO
* Version: 3.0.43
* Plugin URI: https://rankmath.com/wordpress/plugin/seo-suite/
* Description: Super-charge your websites SEO with the Rank Math PRO options like Site Analytics, SEO Performance, Custom Schema Templates, News/Video Sitemaps, etc.
* Author: Rank Math
* Author URI: https://rankmath.com/?utm_source=Plugin&utm_medium=Readme%20Author%20URI&utm_campaign=WP
* License: GPL-3.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
* Text Domain: rank-math-pro
* Domain Path: /languages
*/
add_filter( 'rank_math/admin/sensitive_data_encryption', '__return_false' );
update_option( 'rank_math_connect_data', [
'username' => 'user555',
'email' => 'user555@gmail.com',
'api_key' => '*********',
'plan' => 'business',
'connected' => true,
] );
update_option( 'rank_math_registration_skip', 1 );
add_action( 'init', function() {
add_filter( 'pre_http_request', function( $pre, $parsed_args, $url ) {
if ( strpos( $url, 'https://rankmath.com/wp-json/rankmath/v1/' ) !== false ) {
$basename = basename( parse_url( $url, PHP_URL_PATH ) );
if ( $basename == 'siteSettings' ) {
return [
'response' => [ 'code' => 200, 'message' => 'ОК' ],
'body' => json_encode( [
'error' => '',
'plan' => 'business',
'keywords' => get_option( 'rank_math_keyword_quota', [ 'available' => 10000, 'taken' => 0 ] ),
'analytics' => 'on',
] ),
];
} elseif ( $basename == 'keywordsInfo' ) {
if ( isset( $parsed_args['body']['count'] ) ) {
return [
'response' => [ 'code' => 200, 'message' => 'ОК' ],
'body' => json_encode( [ 'available' => 10000, 'taken' => $parsed_args['body']['count'] ] ),
];
}
}
return [ 'response' => [ 'code' => 200, 'message' => 'ОК' ] ];
}
return $pre;
}, 10, 3 );
} );
use RankMath\Helper;
use MyThemeShop\Helpers\Param;
use MyThemeShop\Helpers\Conditional;
defined( 'ABSPATH' ) || exit;
/**
* RankMath class.
*
* @class The class that holds the entire plugin.
*/
final class RankMathPro {
/**
* Plugin version
*
* @var string
*/
public $version = '3.0.43';
/**
* Minimum version of Rank Math SEO.
*
* @var string
*/
public $rank_math_min_version = '1.0.122';
/**
* Holds various class instances
*
* @var array
*/
private $container = [];
/**
* Holds messages.
*
* @var array
*/
private $messages = [];
/**
* Slug for the free version of the plugin.
*
* @var string
*/
private $free_version_plugin_path = 'seo-by-rank-math/rank-math.php';
/**
* The single instance of the class
*
* @var RankMath
*/
protected static $instance = null;
/**
* Main RankMathPro instance.
*
* Ensure only one instance is loaded or can be loaded.
*
* @see rank_math_pro()
* @return RankMathPro
*/
public static function get() {
if ( is_null( self::$instance ) && ! ( self::$instance instanceof RankMathPro ) ) {
self::$instance = new RankMathPro();
}
return self::$instance;
}
/**
* Class constructor.
*/
private function __construct() {
if ( ! $this->are_requirements_met() ) {
return;
}
$this->define_constants();
$this->includes();
new \RankMathPro\Installer();
add_action( 'plugins_loaded', [ $this, 'localization_setup' ] );
add_action( 'rank_math/loaded', [ $this, 'setup' ] );
add_filter( 'rank_math/license/activate_url', [ $this, 'add_query_arg' ] );
}
/**
* Instantiate the plugin.
*/
public function setup() {
if ( ! $this->is_free_version_compatible() ) {
$this->messages[] = esc_html__( 'Please update Rank Math Free to the latest version first before using Rank Math PRO.', 'rank-math-pro' );
add_action( 'admin_notices', [ $this, 'activation_error' ] );
return false;
}
// Instantiate classes.
$this->instantiate();
// Initialize the action hooks.
$this->init_actions();
// Loaded action.
do_action( 'rank_math_pro/loaded' );
}
/**
* Check that the WordPress and PHP setup meets the plugin requirements.
*
* @return bool
*/
private function are_requirements_met() {
$dont_load = false;
if ( $this->is_free_version_being_deactivated() ) {
// Todo: this message is not displayed because of a redirect.
$this->messages[] = esc_html__( 'Rank Math free version is required to run Rank Math PRO. Both plugins are now disabled.', 'rank-math-pro' );
} elseif ( $this->is_free_version_being_rolled_back() || $this->is_free_version_being_updated() || $this->is_troubleshooting() ) {
$dont_load = true;
} else {
if ( ! $this->is_free_version_installed() ) {
if ( ! $this->install_free_version() ) {
$this->messages[] = esc_html__( 'Rank Math free version is required to run Rank Math PRO, but it could not be installed automatically. Please install and activate the free version first.', 'rank-math-pro' );
}
}
if ( ! $this->is_free_version_activated() ) {
if ( ! $this->activate_free_version() ) {
$this->messages[] = esc_html__( 'Rank Math free version is required to run Rank Math PRO, but it could not be activated automatically. Please install and activate the free version first.', 'rank-math-pro' );
}
}
}
if ( $dont_load ) {
return false;
}
if ( empty( $this->messages ) ) {
return true;
}
// Auto-deactivate plugin.
add_action( 'admin_init', [ $this, 'auto_deactivate' ] );
add_action( 'admin_notices', [ $this, 'activation_error' ] );
return false;
}
/**
* Check if troubleshooting mode is enabled in Health Check plugin and if Rank Math Free version is not.
*
* @return boolean
*/
public function is_troubleshooting() {
return (bool) get_option( 'health-check-allowed-plugins' ) && ! $this->is_free_version_activated();
}
/**
* Check if rollback is in progress, so that Pro doesn't get deactivated.
*
* @return boolean
*/
public function is_free_version_being_rolled_back() {
$reactivating = isset( $_GET['action'] )
&& 'activate-plugin' === $_GET['action']
&& isset( $_GET['plugin'] )
&& 'seo-by-rank-math/rank-math.php' === $_GET['plugin'];
return $reactivating || ( function_exists( 'rank_math' ) && rank_math()->version != get_option( 'rank_math_version' ) );
}
/**
* Auto-deactivate plugin if requirement not met and display a notice.
*/
public function auto_deactivate() {
deactivate_plugins( plugin_basename( __FILE__ ) );
if ( isset( $_GET['activate'] ) ) {
unset( $_GET['activate'] );
}
// phpcs:enable
}
/**
* Plugin activation notice.
*/
public function activation_error() {
?>
<div class="rank-math-notice notice notice-error">
<p>
<?php echo join( '<br>', $this->messages ); // phpcs:ignore ?>
</p>
</div>
<?php
}
/**
* Define the plugin constants.
*/
private function define_constants() {
define( 'RANK_MATH_PRO_VERSION', $this->version );
define( 'RANK_MATH_PRO_FILE', __FILE__ );
define( 'RANK_MATH_PRO_PATH', dirname( RANK_MATH_PRO_FILE ) . '/' );
define( 'RANK_MATH_PRO_URL', plugins_url( '', RANK_MATH_PRO_FILE ) . '/' );
}
/**
* Include the required files.
*/
private function includes() {
include dirname( __FILE__ ) . '/vendor/autoload.php';
}
/**
* Instantiate classes.
*/
private function instantiate() {
new \RankMathPro\Modules();
$this->load_3rd_party();
}
/**
* Load 3rd party modules.
*/
private function load_3rd_party() {
if ( defined( 'ELEMENTOR_VERSION' ) ) {
new \RankMathPro\Elementor\Elementor();
}
add_action(
'after_setup_theme',
function() {
if ( defined( 'ET_CORE' ) ) {
new \RankMathPro\Divi\Divi();
}
},
11
);
}
/**
* Initialize WordPress action hooks.
*/
private function init_actions() {
if ( is_admin() ) {
add_action( 'rank_math/admin/loaded', [ $this, 'init_admin' ], 15 );
}
add_action( 'rest_api_init', [ $this, 'init_rest_api' ] );
add_action( 'plugins_loaded', [ $this, 'init' ], 11 );
new \RankMathPro\Common();
new \RankMathPro\Register_Vars();
}
/**
* Initialize the admin.
*/
public function init_admin() {
new \RankMathPro\Admin\Admin();
}
/**
* Load the REST API endpoints.
*/
public function init_rest_api() {
$controllers = [
new \RankMathPro\Schema\Rest(),
new \RankMathPro\Analytics\Rest(),
new \RankMathPro\Rest\Rest(),
];
foreach ( $controllers as $controller ) {
$controller->register_routes();
}
}
/**
* Initialize.
*/
public function init() {
if ( Helper::is_module_active( 'image-seo' ) ) {
new \RankMathPro\Image_Seo_Pro();
}
if ( Helper::is_module_active( 'bbpress' ) ) {
new \RankMathPro\BBPress();
}
if ( Helper::is_module_active( 'local-seo', false ) ) {
new \RankMathPro\Local_Seo\Local_Seo();
}
if ( Helper::is_module_active( 'analytics' ) ) {
new \RankMathPro\Analytics\Analytics();
}
if ( Conditional::is_woocommerce_active() && Helper::is_module_active( 'woocommerce' ) ) {
new \RankMathPro\WooCommerce();
}
if ( Helper::is_module_active( '404-monitor' ) ) {
new \RankMathPro\Monitor_Pro();
}
if ( Helper::is_module_active( 'redirections' ) ) {
new \RankMathPro\Redirections\Redirections();
}
if ( Helper::is_module_active( 'seo-analysis' ) ) {
new \RankMathPro\SEO_Analysis\SEO_Analysis_Pro();
}
if ( function_exists( 'acf' ) && Helper::is_module_active( 'acf' ) ) {
new \RankMathPro\ACF\ACF();
}
if ( Helper::is_module_active( 'content-ai' ) ) {
new \RankMathPro\Content_AI();
}
new \RankMathPro\Plugin_Update\Plugin_Update();
new \RankMathPro\Thumbnail_Overlays();
}
/**
* Initialize plugin for localization.
*
* Note: the first-loaded translation file overrides any following ones if the same translation is present.
*
* Locales found in:
* - WP_LANG_DIR/rank-math/rank-math-LOCALE.mo
* - WP_LANG_DIR/plugins/rank-math-LOCALE.mo
*/
public function localization_setup() {
$locale = is_admin() && function_exists( 'get_user_locale' ) ? get_user_locale() : get_locale();
$locale = apply_filters( 'plugin_locale', $locale, 'rank-math-pro' ); // phpcs:ignore
unload_textdomain( 'rank-math-pro' );
if ( false === load_textdomain( 'rank-math-pro', WP_LANG_DIR . '/plugins/seo-by-rank-math-pro-' . $locale . '.mo' ) ) {
load_textdomain( 'rank-math-pro', WP_LANG_DIR . '/seo-by-rank-math/seo-by-rank-math-pro-' . $locale . '.mo' );
}
load_plugin_textdomain( 'rank-math-pro', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}
/**
* Check if Rank Math plugin is installed on the site.
*
* @return boolean Whether it's installed or not.
*/
public function is_free_version_installed() {
// First check if active, because that is less costly.
if ( $this->is_free_version_activated() ) {
return true;
}
if ( ! function_exists( 'get_plugins' ) ) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
$installed_plugins = get_plugins();
return array_key_exists( $this->free_version_plugin_path, $installed_plugins );
}
/**
* Install Rank Math free version from the wordpress.org repository.
*
* @return bool Whether install was successful.
*/
public function install_free_version() {
include_once ABSPATH . 'wp-includes/pluggable.php';
include_once ABSPATH . 'wp-admin/includes/misc.php';
include_once ABSPATH . 'wp-admin/includes/file.php';
include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
$skin = new Automatic_Upgrader_Skin();
$upgrader = new Plugin_Upgrader( $skin );
$plugin_file = 'https://downloads.wordpress.org/plugin/seo-by-rank-math.latest-stable.zip';
$result = $upgrader->install( $plugin_file );
return $result;
}
/**
* Check if Rank Math plugin is activated on the site.
*
* @return boolean Whether it's active or not.
*/
public function is_free_version_activated() {
$active_plugins = get_option( 'active_plugins', [] );
return in_array( $this->free_version_plugin_path, $active_plugins, true );
}
/**
* Checks if WP is in the process of updating the free one.
*
* @return boolean Whether we are in the process of updating the plugin or not.
*/
public function is_free_version_being_updated() {
$action = isset( $_POST['action'] ) && $_POST['action'] != -1 ? $_POST['action'] : '';
$plugins = isset( $_POST['plugin'] ) ? (array) $_POST['plugin'] : [];
if ( empty( $plugins ) ) {
$plugins = isset( $_POST['plugins'] ) ? (array) $_POST['plugins'] : [];
}
$update_plugin = 'update-plugin';
$update_selected = 'update-selected';
$actions = [ $update_plugin, $update_selected ];
if ( ! in_array( $action, $actions, true ) ) {
return false;
}
return in_array( $this->free_version_plugin_path, $plugins, true );
}
/**
* Checks if WP is in the process of deactivating the free one.
*
* @return boolean Whether we are in the process of deactivating the plugin or not.
*/
public function is_free_version_being_deactivated() {
if ( ! is_admin() ) {
return false;
}
$action = isset( $_REQUEST['action'] ) && $_REQUEST['action'] != -1 ? $_REQUEST['action'] : '';
if ( ! $action ) {
$action = isset( $_REQUEST['action2'] ) && $_REQUEST['action2'] != -1 ? $_REQUEST['action2'] : '';
}
$plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
$checked = isset( $_POST['checked'] ) && is_array( $_POST['checked'] ) ? $_POST['checked'] : [];
$deactivate = 'deactivate';
$deactivate_selected = 'deactivate-selected';
$actions = [ $deactivate, $deactivate_selected ];
if ( ! in_array( $action, $actions, true ) ) {
return false;
}
if ( $action === $deactivate && $plugin !== $this->free_version_plugin_path ) {
return false;
}
if ( $action === $deactivate_selected && ! in_array( $this->free_version_plugin_path, $checked, true ) ) {
return false;
}
return true;
}
/**
* Activate Rank Math free version.
*
* @return bool Whether activation was successful or not.
*/
public function activate_free_version() {
return activate_plugin( $this->free_version_plugin_path );
}
/**
* Is free version compatible.
*
* @return bool
*/
public function is_free_version_compatible() {
return defined( 'RANK_MATH_VERSION' ) && version_compare( RANK_MATH_VERSION, $this->rank_math_min_version, '>=' );
}
/**
* Add query arg to activate url.
*
* @param string $url Activate URL.
*/
public function add_query_arg( $url ) {
return add_query_arg( [ 'pro' => 1 ], $url );
}
}
/**
* Returns the main instance of RankMathPro to prevent the need to use globals.
*
* @return RankMathPro
*/
function rank_math_pro() {
return RankMathPro::get();
}
// Start it.
rank_math_pro();