PluginProbe ʕ •ᴥ•ʔ
Rank Math SEO – AI SEO Tools to Dominate SEO Rankings / 1.0.247
Rank Math SEO – AI SEO Tools to Dominate SEO Rankings v1.0.247
1.0.271 1.0.271.1 1.0.270 1.0.269 trunk 1.0.216 1.0.217 1.0.218 1.0.219 1.0.220 1.0.221 1.0.222 1.0.223 1.0.224 1.0.225 1.0.226 1.0.227 1.0.227.1 1.0.228 1.0.229 1.0.230 1.0.231 1.0.232 1.0.233 1.0.234 1.0.234.1 1.0.235 1.0.236 1.0.237 1.0.238 1.0.239 1.0.240 1.0.241 1.0.242 1.0.243 1.0.244 1.0.245 1.0.246 1.0.247 1.0.248 1.0.249 1.0.250 1.0.251 1.0.251.1 1.0.252 1.0.252.1 1.0.253 1.0.254 1.0.255 1.0.256 1.0.257 1.0.258 1.0.259 1.0.259.1 1.0.260 1.0.261 1.0.262 1.0.263 1.0.264 1.0.264.1 1.0.265 1.0.266 1.0.266.1 1.0.267 1.0.268
seo-by-rank-math / rank-math.php
seo-by-rank-math Last commit date
assets 1 year ago includes 11 months ago languages 11 months ago vendor 11 months ago rank-math.php 11 months ago readme.txt 11 months ago uninstall.php 1 year ago wpml-config.xml 5 years ago
rank-math.php
541 lines
1 <?php // @codingStandardsIgnoreLine
2 /**
3 * Rank Math SEO Plugin.
4 *
5 * @package RANK_MATH
6 * @copyright Copyright (C) 2019-2023, Rank Math - support@rankmath.com
7 * @link https://rankmath.com
8 * @since 0.9.0
9 *
10 * @wordpress-plugin
11 * Plugin Name: Rank Math SEO
12 * Version: 1.0.247
13 * Plugin URI: https://rankmath.com/
14 * Description: Rank Math SEO is the Best WordPress SEO plugin with the features of many SEO and AI SEO tools in a single package to help multiply your SEO traffic.
15 * Author: Rank Math SEO
16 * Author URI: https://rankmath.com/?utm_source=Plugin&utm_medium=Readme%20Author%20URI&utm_campaign=WP
17 * License: GPL-3.0+
18 * License URI: https://www.gnu.org/licenses/gpl-3.0.txt
19 * Text Domain: rank-math
20 * Domain Path: /languages
21 */
22
23 defined( 'ABSPATH' ) || exit;
24
25 /**
26 * RankMath class.
27 *
28 * @class Main class of the plugin.
29 */
30 final class RankMath {
31
32 /**
33 * Plugin version.
34 *
35 * @var string
36 */
37 public $version = '1.0.247';
38
39 /**
40 * Rank Math database version.
41 *
42 * @var string
43 */
44 public $db_version = '1';
45
46 /**
47 * Minimum version of WordPress required to run Rank Math.
48 *
49 * @var string
50 */
51 private $wordpress_version = '6.3';
52
53 /**
54 * Minimum version of PHP required to run Rank Math.
55 *
56 * @var string
57 */
58 private $php_version = '7.4';
59
60 /**
61 * Holds various class instances.
62 *
63 * @var array
64 */
65 private $container = [];
66
67 /**
68 * Hold install error messages.
69 *
70 * @var bool
71 */
72 private $messages = [];
73
74 /**
75 * The single instance of the class.
76 *
77 * @var RankMath
78 */
79 protected static $instance = null;
80
81 /**
82 * Magic isset to bypass referencing plugin.
83 *
84 * @param string $prop Property to check.
85 * @return bool
86 */
87 public function __isset( $prop ) {
88 return isset( $this->{$prop} ) || isset( $this->container[ $prop ] );
89 }
90
91 /**
92 * Magic getter method.
93 *
94 * @param string $prop Property to get.
95 * @return mixed Property value or NULL if it does not exists.
96 */
97 public function __get( $prop ) {
98 if ( array_key_exists( $prop, $this->container ) ) {
99 return $this->container[ $prop ];
100 }
101
102 if ( isset( $this->{$prop} ) ) {
103 return $this->{$prop};
104 }
105
106 return null;
107 }
108
109 /**
110 * Magic setter method.
111 *
112 * @param mixed $prop Property to set.
113 * @param mixed $value Value to set.
114 */
115 public function __set( $prop, $value ) {
116 if ( property_exists( $this, $prop ) ) {
117 $this->$prop = $value;
118 return;
119 }
120
121 $this->container[ $prop ] = $value;
122 }
123
124 /**
125 * Magic call method.
126 *
127 * @param string $name Method to call.
128 * @param array $arguments Arguments to pass when calling.
129 * @return mixed Return value of the callback.
130 */
131 public function __call( $name, $arguments ) {
132 $hash = [
133 'plugin_dir' => RANK_MATH_PATH,
134 'plugin_url' => RANK_MATH_URL,
135 'includes_dir' => RANK_MATH_PATH . 'includes/',
136 'assets' => RANK_MATH_URL . 'assets/front/',
137 'admin_dir' => RANK_MATH_PATH . 'includes/admin/',
138 ];
139
140 if ( isset( $hash[ $name ] ) ) {
141 return $hash[ $name ];
142 }
143
144 return call_user_func_array( $name, $arguments );
145 }
146
147 /**
148 * Initialize.
149 */
150 public function init() {
151 }
152
153 /**
154 * Retrieve main RankMath instance.
155 *
156 * Ensure only one instance is loaded or can be loaded.
157 *
158 * @see rank_math()
159 * @return RankMath
160 */
161 public static function get() {
162 if ( is_null( self::$instance ) && ! ( self::$instance instanceof RankMath ) ) {
163 self::$instance = new RankMath();
164 self::$instance->setup();
165 }
166
167 return self::$instance;
168 }
169
170 /**
171 * Instantiate the plugin.
172 */
173 private function setup() {
174 // Define plugin constants.
175 $this->define_constants();
176
177 if ( ! $this->is_requirements_meet() ) {
178 return;
179 }
180
181 // Include required files.
182 $this->includes();
183
184 // Instantiate classes.
185 $this->instantiate();
186
187 // Loaded action.
188 do_action( 'rank_math/loaded' );
189 }
190
191 /**
192 * Check that the WordPress and PHP setup meets the plugin requirements.
193 *
194 * @return bool
195 */
196 private function is_requirements_meet() {
197
198 // Check WordPress version.
199 if ( version_compare( get_bloginfo( 'version' ), $this->wordpress_version, '<' ) ) {
200 /* translators: WordPress Version */
201 $this->messages[] = sprintf( esc_html__( 'You are using the outdated WordPress, please update it to version %s or higher.', 'rank-math' ), $this->wordpress_version );
202 }
203
204 // Check PHP version.
205 if ( version_compare( phpversion(), $this->php_version, '<' ) ) {
206 /* translators: PHP Version */
207 $this->messages[] = sprintf( esc_html__( 'Rank Math requires PHP version %s or above. Please update PHP to run this plugin.', 'rank-math' ), $this->php_version );
208 }
209
210 if ( empty( $this->messages ) ) {
211 return true;
212 }
213
214 // Auto-deactivate plugin.
215 add_action( 'admin_init', [ $this, 'auto_deactivate' ] );
216 add_action( 'admin_notices', [ $this, 'activation_error' ] );
217
218 return false;
219 }
220
221 /**
222 * Auto-deactivate plugin if requirements are not met, and display a notice.
223 */
224 public function auto_deactivate() {
225 deactivate_plugins( plugin_basename( RANK_MATH_FILE ) );
226 if ( isset( $_GET['activate'] ) ) { // phpcs:ignore
227 unset( $_GET['activate'] ); // phpcs:ignore
228 }
229 }
230
231 /**
232 * Error notice on plugin activation.
233 */
234 public function activation_error() {
235 ?>
236 <div class="notice rank-math-notice notice-error">
237 <p>
238 <?php echo join( '<br>', $this->messages ); // phpcs:ignore ?>
239 </p>
240 </div>
241 <?php
242 }
243
244 /**
245 * Define the plugin constants.
246 */
247 private function define_constants() {
248 define( 'RANK_MATH_VERSION', $this->version );
249 define( 'RANK_MATH_FILE', __FILE__ );
250 define( 'RANK_MATH_PATH', dirname( RANK_MATH_FILE ) . '/' );
251 define( 'RANK_MATH_URL', plugins_url( '', RANK_MATH_FILE ) . '/' );
252 define( 'RANK_MATH_SITE_URL', 'https://rankmath.com' );
253 if ( ! defined( 'CONTENT_AI_URL' ) ) {
254 define( 'CONTENT_AI_URL', 'https://cai.rankmath.com' );
255 }
256 }
257
258 /**
259 * Include the required files.
260 */
261 private function includes() {
262 include __DIR__ . '/vendor/autoload.php';
263
264 // For Theme Developers:
265 // theme-folder/rankmath.php will be loaded automatically.
266 $file = get_stylesheet_directory() . '/rank-math.php';
267 if ( file_exists( $file ) ) {
268 require_once $file;
269 }
270 }
271
272 /**
273 * Instantiate classes.
274 */
275 private function instantiate() {
276 new \RankMath\Installer();
277
278 // Setting Manager.
279 $this->container['settings'] = new \RankMath\Settings();
280
281 // JSON Manager.
282 $this->container['json'] = new \RankMath\Json_Manager();
283
284 // Notification Manager.
285 $this->container['notification'] = new \RankMath\Admin\Notifications\Notification_Center( 'rank_math_notifications' );
286
287 // Product Registration.
288 $this->container['registration'] = new \RankMath\Admin\Registration();
289 if ( $this->container['registration']->invalid ) {
290 return;
291 }
292
293 $this->container['manager'] = new \RankMath\Module\Manager();
294 $this->container['variables'] = new \RankMath\Replace_Variables\Manager();
295
296 // Just init without storing it in the container.
297 new \RankMath\Common();
298 $this->container['rewrite'] = new \RankMath\Rewrite();
299 new \RankMath\Compatibility();
300
301 // Frontend SEO Score.
302 $this->container['frontend_seo_score'] = new \RankMath\Frontend_SEO_Score();
303 $this->load_3rd_party();
304
305 // Initialize the action and filter hooks.
306 $this->init_actions();
307 }
308
309 /**
310 * Initialize WordPress action and filter hooks.
311 */
312 private function init_actions() {
313 // Make sure it is loaded before setup_modules and load_modules.
314 add_action( 'after_setup_theme', [ $this, 'localization_setup' ], 1 );
315 add_action( 'init', [ $this, 'pass_admin_content' ] );
316
317 // Add plugin action links.
318 add_filter( 'plugin_row_meta', [ $this, 'plugin_row_meta' ], 10, 2 );
319 add_filter( 'plugin_action_links_' . plugin_basename( RANK_MATH_FILE ), [ $this, 'plugin_action_links' ] );
320 add_action( 'after_plugin_row_' . plugin_basename( RANK_MATH_FILE ), [ $this, 'plugin_row_deactivate_notice' ] );
321
322 // Booting.
323 add_action( 'plugins_loaded', [ $this, 'init' ], 14 );
324 add_action( 'rest_api_init', [ $this, 'init_rest_api' ] );
325
326 // Load admin-related functionality.
327 if ( is_admin() ) {
328 add_action( 'plugins_loaded', [ $this, 'init_admin' ], 15 );
329 }
330
331 // Frontend-only functionality.
332 if ( ! is_admin() || in_array( \RankMath\Helpers\Param::request( 'action' ), [ 'elementor', 'elementor_ajax' ], true ) ) {
333 add_action( 'plugins_loaded', [ $this, 'init_frontend' ], 15 );
334 }
335
336 // WP_CLI.
337 if ( defined( 'WP_CLI' ) && WP_CLI ) {
338 add_action( 'plugins_loaded', [ $this, 'init_wp_cli' ], 20 );
339 }
340 }
341
342 /**
343 * Load the REST API endpoints.
344 */
345 public function init_rest_api() {
346 $controllers = [
347 new \RankMath\Rest\Admin(),
348 new \RankMath\Rest\Front(),
349 new \RankMath\Rest\Shared(),
350 new \RankMath\Rest\Post(),
351 new \RankMath\Rest\Headless(),
352 new \RankMath\Rest\Setup_Wizard(),
353 ];
354
355 foreach ( $controllers as $controller ) {
356 $controller->register_routes();
357 }
358 }
359
360 /**
361 * Initialize the admin-related functionality.
362 * Runs on 'plugins_loaded'.
363 */
364 public function init_admin() {
365 if ( $this->container['registration']->invalid ) {
366 return;
367 }
368 new \RankMath\Admin\Admin_Init();
369 }
370
371 /**
372 * Initialize the frontend functionality.
373 * Runs on 'plugins_loaded'.
374 */
375 public function init_frontend() {
376 if ( $this->container['registration']->invalid ) {
377 return;
378 }
379 $this->container['frontend'] = new \RankMath\Frontend\Frontend();
380 }
381
382 /**
383 * Load 3rd party modules.
384 */
385 private function load_3rd_party() {
386 if ( ! function_exists( 'is_plugin_active' ) ) {
387 require_once ABSPATH . 'wp-admin/includes/plugin.php'; // @phpstan-ignore-line
388 }
389
390 // Elementor.
391 if ( is_plugin_active( 'elementor/elementor.php' ) ) {
392 new \RankMath\Elementor\Elementor();
393 }
394
395 // Divi theme.
396 add_action(
397 'after_setup_theme',
398 function () {
399 if ( defined( 'ET_CORE' ) ) {
400 new \RankMath\Divi\Divi();
401 }
402 },
403 11
404 );
405 add_action(
406 'current_screen',
407 function () {
408 if ( defined( 'ET_CORE' ) ) {
409 new \RankMath\Divi\Divi_Admin();
410 }
411 }
412 );
413 }
414
415 /**
416 * Add our custom WP-CLI commands.
417 */
418 public function init_wp_cli() {
419 WP_CLI::add_command( 'rankmath sitemap generate', [ '\RankMath\CLI\Commands', 'sitemap_generate' ] );
420 }
421
422 /**
423 * Show action links on the plugin screen.
424 *
425 * @param mixed $links Plugin Action links.
426 * @return array
427 */
428 public function plugin_action_links( $links ) {
429 $options = [
430 'options-general' => __( 'Settings', 'rank-math' ),
431 'wizard' => __( 'Setup Wizard', 'rank-math' ),
432 ];
433
434 if ( $this->container['registration']->invalid ) {
435 $options = [
436 'registration' => __( 'Setup Wizard', 'rank-math' ),
437 ];
438 }
439
440 foreach ( $options as $link => $label ) {
441 $plugin_links[] = '<a href="' . \RankMath\Helper::get_admin_url( $link ) . '">' . esc_html( $label ) . '</a>';
442 }
443
444 return array_merge( $links, $plugin_links );
445 }
446
447 /**
448 * Add a notice when rank_math_clear_data_on_uninstall filter is present in the theme.
449 *
450 * @param string $file Plugin file.
451 *
452 * @return void
453 */
454 public function plugin_row_deactivate_notice( $file ) {
455 if ( false === apply_filters( 'rank_math_clear_data_on_uninstall', false ) ) {
456 return;
457 }
458
459 if ( is_multisite() && ! is_network_admin() && is_plugin_active_for_network( $file ) ) {
460 return;
461 }
462
463 $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
464 echo '<tr class="plugin-update-tr active rank-math-deactivate-notice-row" data-slug="" data-plugin="' . esc_attr( $file ) . '" style="position: relative; top: -1px;"><td colspan="' . esc_attr( $wp_list_table->get_column_count() ) . '" class="plugin-update colspanchange"><div class="notice inline notice-error notice-alt"><p>';
465 printf(
466 /* translators: 1. Bold text 2. Bold text */
467 esc_html__( '%1$s A filter to remove the Rank Math data from the database is present. Deactivating & Deleting this plugin will remove everything related to the Rank Math plugin. %2$s', 'rank-math' ),
468 '<strong>' . esc_html__( 'CAUTION:', 'rank-math' ) . '</strong>',
469 '<br /><strong>' . esc_html__( 'This action is IRREVERSIBLE.', 'rank-math' ) . '</strong>'
470 );
471 echo '</p></div></td></tr>';
472 }
473
474 /**
475 * Add extra links as row meta on the plugin screen.
476 *
477 * @param mixed $links Plugin Row Meta.
478 * @param mixed $file Plugin Base file.
479 * @return array
480 */
481 public function plugin_row_meta( $links, $file ) {
482 if ( plugin_basename( RANK_MATH_FILE ) !== $file ) {
483 return $links;
484 }
485
486 $more = [
487 '<a href="' . admin_url( '?page=rank-math&view=help' ) . '">' . esc_html__( 'Getting Started', 'rank-math' ) . '</a>',
488 '<a href="https://rankmath.com/kb/?utm_source=Plugin&utm_medium=Plugin%20Page%20KB%20Link&utm_campaign=WP" target="_blank">' . esc_html__( 'Documentation', 'rank-math' ) . '</a>',
489 ];
490
491 return array_merge( $links, $more );
492 }
493
494 /**
495 * Initialize plugin for localization.
496 *
497 * Note: the first-loaded translation file overrides any following ones if the same translation is present.
498 *
499 * Locales found in:
500 * - WP_LANG_DIR/rank-math/rank-math-LOCALE.mo
501 * - WP_LANG_DIR/plugins/rank-math-LOCALE.mo
502 */
503 public function localization_setup() {
504 $locale = get_user_locale();
505 $locale = apply_filters( 'plugin_locale', $locale, 'rank-math' ); // phpcs:ignore
506
507 unload_textdomain( 'rank-math' );
508 if ( false === load_textdomain( 'rank-math', WP_LANG_DIR . '/plugins/seo-by-rank-math-' . $locale . '.mo' ) ) {
509 load_textdomain( 'rank-math', WP_LANG_DIR . '/seo-by-rank-math/seo-by-rank-math-' . $locale . '.mo' );
510 }
511 load_plugin_textdomain( 'rank-math', false, rank_math()->plugin_dir() . 'languages/' );
512 }
513
514 /**
515 * Localize admin content to JS
516 */
517 public function pass_admin_content() {
518 if ( is_user_logged_in() && is_admin_bar_showing() ) {
519 $this->container['json']->add( 'version', $this->version, 'rankMath' );
520 $this->container['json']->add( 'ajaxurl', admin_url( 'admin-ajax.php' ), 'rankMath' );
521 $this->container['json']->add( 'adminurl', admin_url( 'admin.php' ), 'rankMath' );
522 $this->container['json']->add( 'endpoint', esc_url_raw( rest_url( 'rankmath/v1' ) ), 'rankMath' );
523 $this->container['json']->add( 'security', wp_create_nonce( 'rank-math-ajax-nonce' ), 'rankMath' );
524 $this->container['json']->add( 'restNonce', ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ), 'rankMath' );
525 $this->container['json']->add( 'modules', \RankMath\Helper::get_active_modules(), 'rankMath' );
526 }
527 }
528 }
529
530 /**
531 * Returns the main instance of RankMath to prevent the need to use globals.
532 *
533 * @return RankMath
534 */
535 function rank_math() { // phpcs:ignore -- This is a main function used to initialize the plugin.
536 return RankMath::get();
537 }
538
539 // Start it.
540 rank_math();
541