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.
214 lines
5.5 KiB
PHP
214 lines
5.5 KiB
PHP
<?php
|
|
/**
|
|
* Elementor integration.
|
|
*
|
|
* @since 0.9.0
|
|
* @package RankMath
|
|
* @subpackage RankMath\Core
|
|
* @author Rank Math <support@rankmath.com>
|
|
*/
|
|
|
|
namespace RankMath\Elementor;
|
|
|
|
use RankMath\Helper;
|
|
use RankMath\Traits\Hooker;
|
|
use RankMath\Helpers\Editor;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* Elementor class.
|
|
*/
|
|
class Elementor {
|
|
|
|
use Hooker;
|
|
|
|
/**
|
|
* Class constructor.
|
|
*/
|
|
public function __construct() {
|
|
$this->action( 'init', 'init' );
|
|
$this->filter( 'rank_math/frontend/robots', 'robots' );
|
|
$this->filter( 'rank_math/frontend/disable_integration', 'disable_frontend_integration' );
|
|
}
|
|
|
|
/**
|
|
* Intialize.
|
|
*/
|
|
public function init() {
|
|
if ( ! $this->can_add_seo_tab() ) {
|
|
return;
|
|
}
|
|
|
|
$this->action( 'elementor/editor/before_enqueue_scripts', 'enqueue' );
|
|
add_action( 'elementor/editor/footer', [ rank_math()->json, 'output' ], 0 );
|
|
$this->action( 'elementor/editor/footer', 'start_capturing', 0 );
|
|
$this->action( 'elementor/editor/footer', 'end_capturing', 999 );
|
|
$this->filter( 'rank_math/sitemap/content_before_parse_html_images', 'apply_builder_in_content', 10, 2 );
|
|
}
|
|
|
|
/**
|
|
* Disable frontend integration on Elementor Maintenance page.
|
|
*
|
|
* @since 1.0.91
|
|
*
|
|
* @param boolean $value Whether to run the frontend integration.
|
|
*/
|
|
public function disable_frontend_integration( $value ) {
|
|
$mode = get_option( 'elementor_maintenance_mode_mode' );
|
|
if ( ! in_array( $mode, [ 'maintenance', 'coming_soon' ], true ) ) {
|
|
return $value;
|
|
}
|
|
|
|
if ( ! get_option( 'elementor_maintenance_mode_template_id' ) ) {
|
|
return $value;
|
|
}
|
|
|
|
$exclude_mode = get_option( 'elementor_maintenance_mode_exclude_mode', [] );
|
|
if ( 'logged_in' === $exclude_mode && is_user_logged_in() ) {
|
|
return $value;
|
|
}
|
|
|
|
if ( 'custom' !== $exclude_mode ) {
|
|
return true;
|
|
}
|
|
|
|
$exclude_roles = get_option( 'elementor_maintenance_mode_exclude_roles', [] );
|
|
$user = wp_get_current_user();
|
|
$user_roles = $user->roles;
|
|
|
|
if ( is_multisite() && is_super_admin() ) {
|
|
$user_roles[] = 'super_admin';
|
|
}
|
|
|
|
$compare_roles = array_intersect( $user_roles, $exclude_roles );
|
|
|
|
return ! empty( $compare_roles ) ? $value : true;
|
|
}
|
|
|
|
/**
|
|
* Start capturing buffer.
|
|
*/
|
|
public function start_capturing() {
|
|
ob_start();
|
|
}
|
|
|
|
/**
|
|
* End capturing buffer and add button.
|
|
*/
|
|
public function end_capturing() {
|
|
$output = \ob_get_clean();
|
|
$search = '/(<(div|button) class="elementor-component-tab elementor-panel-navigation-tab" data-tab="global">.*<\/(div|button)>)/m';
|
|
$replace = '${1}<${2} class="elementor-component-tab elementor-panel-navigation-tab" data-tab="rank-math">SEO</${2}>';
|
|
echo \preg_replace(
|
|
$search,
|
|
$replace,
|
|
$output
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Enqueue scripts.
|
|
*/
|
|
public function enqueue() {
|
|
$deps = [
|
|
'wp-core-data',
|
|
'wp-components',
|
|
'wp-block-editor',
|
|
'wp-element',
|
|
'wp-data',
|
|
'wp-api-fetch',
|
|
'wp-media-utils',
|
|
'site-health',
|
|
'rank-math-analyzer',
|
|
'backbone-marionette',
|
|
'elementor-common-modules',
|
|
'rank-math-app',
|
|
];
|
|
|
|
$mode = \Elementor\Core\Settings\Manager::get_settings_managers( 'editorPreferences' )->get_model()->get_settings( 'ui_theme' );
|
|
wp_deregister_style( 'rank-math-editor' );
|
|
|
|
wp_enqueue_style( 'wp-components' );
|
|
wp_enqueue_style( 'site-health' );
|
|
wp_enqueue_style( 'rank-math-editor', rank_math()->plugin_url() . 'includes/3rdparty/elementor/assets/css/elementor.css', [ 'rank-math-common' ], rank_math()->version );
|
|
$media_query = '';
|
|
|
|
$dark_styles = $this->do_filter(
|
|
'elementor/dark_styles',
|
|
[
|
|
'rank-math-elementor-dark' => rank_math()->plugin_url() . 'includes/3rdparty/elementor/assets/css/elementor-dark.css',
|
|
]
|
|
);
|
|
|
|
if ( 'light' !== $mode ) {
|
|
$media_query = 'auto' === $mode ? '(prefers-color-scheme: dark)' : 'all';
|
|
foreach ( $dark_styles as $handle => $src ) {
|
|
wp_enqueue_style( $handle, $src, [], rank_math()->version, $media_query );
|
|
}
|
|
}
|
|
|
|
Helper::add_json( 'elementorDarkMode', $dark_styles );
|
|
|
|
wp_enqueue_script( 'rank-math-editor', rank_math()->plugin_url() . 'includes/3rdparty/elementor/assets/js/elementor.js', $deps, rank_math()->version, true );
|
|
rank_math()->variables->setup();
|
|
rank_math()->variables->setup_json();
|
|
}
|
|
|
|
/**
|
|
* Filters the post content before it is parsed for Sitmeap images..
|
|
* Used to apply the Elementor page editor on the post content.
|
|
*
|
|
* @since 1.0.38
|
|
*
|
|
* @param string $content The post content.
|
|
* @param int $post_id The post ID.
|
|
*
|
|
* @return string The post content.
|
|
*/
|
|
public function apply_builder_in_content( $content, $post_id ) {
|
|
if ( \Elementor\Plugin::$instance->db->is_built_with_elementor( $post_id ) ) {
|
|
return \Elementor\Plugin::$instance->frontend->get_builder_content( $post_id );
|
|
}
|
|
|
|
return $content;
|
|
}
|
|
|
|
/**
|
|
* Add SEO tab in Elementor Page Builder.
|
|
*
|
|
* @return bool
|
|
*/
|
|
private function can_add_seo_tab() {
|
|
/**
|
|
* Filter to show/hide SEO Tab in the Elementor Editor.
|
|
*/
|
|
if ( ! $this->do_filter( 'elementor/add_seo_tab', true ) ) {
|
|
return false;
|
|
}
|
|
|
|
$post_type = isset( $_GET['post'] ) ? get_post_type( $_GET['post'] ) : '';
|
|
if ( $post_type && ! Helper::get_settings( 'titles.pt_' . $post_type . '_add_meta_box' ) ) {
|
|
return false;
|
|
}
|
|
|
|
return Editor::can_add_editor();
|
|
}
|
|
|
|
/**
|
|
* Change robots for Elementor Templates pages
|
|
*
|
|
* @param array $robots Array of robots to sanitize.
|
|
*
|
|
* @return array Modified robots.
|
|
*/
|
|
public function robots( $robots ) {
|
|
if ( is_singular( 'elementor_library' ) ) {
|
|
$robots['index'] = 'noindex';
|
|
$robots['follow'] = 'nofollow';
|
|
}
|
|
|
|
return $robots;
|
|
}
|
|
}
|