PluginProbe ʕ •ᴥ•ʔ
Rank Math SEO – AI SEO Tools to Dominate SEO Rankings / 1.0.270
Rank Math SEO – AI SEO Tools to Dominate SEO Rankings v1.0.270
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 2 weeks ago includes 2 weeks ago languages 2 weeks ago vendor 2 weeks ago composer.json 2 weeks ago rank-math.php 2 weeks ago readme.txt 2 weeks ago uninstall.php 1 year ago wpml-config.xml 5 years ago
rank-math.php
530 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.270
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: seo-by-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.270';
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 array
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.', 'seo-by-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.', 'seo-by-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 $this->container['tracking'] = new \RankMath\Tracking();
301
302 // Frontend SEO Score.
303 $this->container['frontend_seo_score'] = new \RankMath\Frontend_SEO_Score();
304 $this->load_3rd_party();
305
306 // Initialize the action and filter hooks.
307 $this->init_actions();
308 }
309
310 /**
311 * Initialize WordPress action and filter hooks.
312 */
313 private function init_actions() {
314 add_action( 'init', [ $this, 'pass_admin_content' ] );
315
316 // Add plugin action links.
317 add_filter( 'plugin_row_meta', [ $this, 'plugin_row_meta' ], 10, 2 );
318 add_filter( 'plugin_action_links_' . plugin_basename( RANK_MATH_FILE ), [ $this, 'plugin_action_links' ] );
319 add_action( 'after_plugin_row_' . plugin_basename( RANK_MATH_FILE ), [ $this, 'plugin_row_deactivate_notice' ] );
320
321 // Booting.
322 add_action( 'plugins_loaded', [ $this, 'init' ], 14 );
323 add_action( 'rest_api_init', [ $this, 'init_rest_api' ] );
324
325 // Load admin-related functionality.
326 if ( is_admin() ) {
327 add_action( 'plugins_loaded', [ $this, 'init_admin' ], 15 );
328 }
329
330 // Frontend-only functionality.
331 if ( ! is_admin() || in_array( \RankMath\Helpers\Param::request( 'action' ), [ 'elementor', 'elementor_ajax' ], true ) ) {
332 add_action( 'plugins_loaded', [ $this, 'init_frontend' ], 15 );
333 }
334
335 // WP_CLI.
336 if ( defined( 'WP_CLI' ) && WP_CLI ) {
337 add_action( 'plugins_loaded', [ $this, 'init_wp_cli' ], 20 );
338 }
339 }
340
341 /**
342 * Load the REST API endpoints.
343 */
344 public function init_rest_api() {
345 $controllers = [
346 new \RankMath\Rest\Admin(),
347 new \RankMath\Rest\Front(),
348 new \RankMath\Rest\Shared(),
349 new \RankMath\Rest\Post(),
350 new \RankMath\Rest\Headless(),
351 new \RankMath\Rest\Setup_Wizard(),
352 ];
353
354 foreach ( $controllers as $controller ) {
355 $controller->register_routes();
356 }
357 }
358
359 /**
360 * Initialize the admin-related functionality.
361 * Runs on 'plugins_loaded'.
362 */
363 public function init_admin() {
364 if ( $this->container['registration']->invalid ) {
365 return;
366 }
367 new \RankMath\Admin\Admin_Init();
368 }
369
370 /**
371 * Initialize the frontend functionality.
372 * Runs on 'plugins_loaded'.
373 */
374 public function init_frontend() {
375 if ( $this->container['registration']->invalid ) {
376 return;
377 }
378 $this->container['frontend'] = new \RankMath\Frontend\Frontend();
379 }
380
381 /**
382 * Load 3rd party modules.
383 */
384 private function load_3rd_party() {
385 if ( ! function_exists( 'is_plugin_active' ) ) {
386 require_once ABSPATH . 'wp-admin/includes/plugin.php'; // @phpstan-ignore-line
387 }
388
389 // Elementor.
390 if ( is_plugin_active( 'elementor/elementor.php' ) ) {
391 new \RankMath\Elementor\Elementor();
392 }
393
394 // Loco Translate: initialize inline i18n injector for settings React UI.
395 if ( is_plugin_active( 'loco-translate/loco.php' ) ) {
396 new \RankMath\ThirdParty\Loco\Loco_I18n_Inline();
397 }
398
399 // WPML.
400 if ( is_plugin_active( 'sitepress-multilingual-cms/sitepress.php' ) ) {
401 new \RankMath\ThirdParty\WPML();
402 }
403
404 // Divi theme.
405 add_action(
406 'after_setup_theme',
407 function () {
408 if ( defined( 'ET_CORE' ) ) {
409 new \RankMath\Divi\Divi();
410 }
411 },
412 11
413 );
414 add_action(
415 'current_screen',
416 function () {
417 if ( defined( 'ET_CORE' ) ) {
418 new \RankMath\Divi\Divi_Admin();
419 }
420 }
421 );
422 }
423
424 /**
425 * Add our custom WP-CLI commands.
426 */
427 public function init_wp_cli() {
428 WP_CLI::add_command( 'rankmath sitemap generate', [ '\RankMath\CLI\Commands', 'sitemap_generate' ] );
429 }
430
431 /**
432 * Show action links on the plugin screen.
433 *
434 * @param mixed $links Plugin Action links.
435 * @return array
436 */
437 public function plugin_action_links( $links ) {
438 $options = [
439 'options-general' => __( 'Settings', 'seo-by-rank-math' ),
440 'wizard' => __( 'Setup Wizard', 'seo-by-rank-math' ),
441 ];
442
443 if ( $this->container['registration']->invalid ) {
444 $options = [
445 'registration' => __( 'Setup Wizard', 'seo-by-rank-math' ),
446 ];
447 }
448
449 foreach ( $options as $link => $label ) {
450 $plugin_links[] = '<a href="' . \RankMath\Helper::get_admin_url( $link ) . '">' . esc_html( $label ) . '</a>';
451 }
452
453 return array_merge( $links, $plugin_links );
454 }
455
456 /**
457 * Add a notice when rank_math_clear_data_on_uninstall filter is present in the theme.
458 *
459 * @param string $file Plugin file.
460 *
461 * @return void
462 */
463 public function plugin_row_deactivate_notice( $file ) {
464 if ( false === apply_filters( 'rank_math_clear_data_on_uninstall', false ) ) {
465 return;
466 }
467
468 if ( is_multisite() && ! is_network_admin() && is_plugin_active_for_network( $file ) ) {
469 return;
470 }
471
472 $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
473 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>';
474 printf(
475 /* translators: 1. Bold text 2. Bold text */
476 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', 'seo-by-rank-math' ),
477 '<strong>' . esc_html__( 'CAUTION:', 'seo-by-rank-math' ) . '</strong>',
478 '<br /><strong>' . esc_html__( 'This action is IRREVERSIBLE.', 'seo-by-rank-math' ) . '</strong>'
479 );
480 echo '</p></div></td></tr>';
481 }
482
483 /**
484 * Add extra links as row meta on the plugin screen.
485 *
486 * @param mixed $links Plugin Row Meta.
487 * @param mixed $file Plugin Base file.
488 * @return array
489 */
490 public function plugin_row_meta( $links, $file ) {
491 if ( plugin_basename( RANK_MATH_FILE ) !== $file ) {
492 return $links;
493 }
494
495 $more = [
496 '<a href="' . admin_url( '?page=rank-math&view=help' ) . '">' . esc_html__( 'Getting Started', 'seo-by-rank-math' ) . '</a>',
497 '<a href="' . \RankMath\KB::get( 'knowledgebase', 'Plugin Page KB Link' ) . '" target="_blank">' . esc_html__( 'Documentation', 'seo-by-rank-math' ) . '</a>',
498 ];
499
500 return array_merge( $links, $more );
501 }
502
503 /**
504 * Localize admin content to JS
505 */
506 public function pass_admin_content() {
507 if ( is_user_logged_in() && is_admin_bar_showing() ) {
508 $this->container['json']->add( 'version', $this->version, 'rankMath' );
509 $this->container['json']->add( 'ajaxurl', admin_url( 'admin-ajax.php' ), 'rankMath' );
510 $this->container['json']->add( 'adminurl', admin_url( 'admin.php' ), 'rankMath' );
511 $this->container['json']->add( 'endpoint', esc_url_raw( rest_url( 'rankmath/v1' ) ), 'rankMath' );
512 $this->container['json']->add( 'security', wp_create_nonce( 'rank-math-ajax-nonce' ), 'rankMath' );
513 $this->container['json']->add( 'restNonce', ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ), 'rankMath' );
514 $this->container['json']->add( 'modules', \RankMath\Helper::get_active_modules(), 'rankMath' );
515 }
516 }
517 }
518
519 /**
520 * Returns the main instance of RankMath to prevent the need to use globals.
521 *
522 * @return RankMath
523 */
524 function rank_math() { // phpcs:ignore -- This is a main function used to initialize the plugin.
525 return RankMath::get();
526 }
527
528 // Start it.
529 rank_math();
530