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