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