first commit

This commit is contained in:
2026-03-24 00:31:47 +01:00
commit 2506f6f9c7
3328 changed files with 1172155 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
<?php
namespace Elementor\Core\Frontend;
use Elementor\Plugin;
class Performance {
private static $use_style_controls = false;
private static $is_frontend = null;
public static function set_use_style_controls( bool $is_use ): void {
static::$use_style_controls = $is_use;
}
public static function is_use_style_controls(): bool {
return static::$use_style_controls;
}
public static function should_optimize_controls() {
if ( null === static::$is_frontend ) {
static::$is_frontend = (
! is_admin()
&& ! Plugin::$instance->preview->is_preview_mode()
);
}
return static::$is_frontend;
}
}

View File

@@ -0,0 +1,191 @@
<?php
namespace Elementor\Core\Frontend;
use Elementor\Core\Frontend\RenderModes\Render_Mode_Base;
use Elementor\Core\Frontend\RenderModes\Render_Mode_Normal;
use Elementor\Modules\CloudLibrary\Render_Mode_Preview;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
class Render_Mode_Manager {
const QUERY_STRING_PARAM_NAME = 'render_mode';
const QUERY_STRING_POST_ID = 'post_id';
const QUERY_STRING_TEMPLATE_ID = 'template_id';
const QUERY_STRING_NONCE_PARAM_NAME = 'render_mode_nonce';
const NONCE_ACTION_PATTERN = 'render_mode_{post_id}';
/**
* @var Render_Mode_Base
*/
private $current;
/**
* @var Render_Mode_Base[]
*/
private $render_modes = [];
/**
* @param $post_id
* @param $render_mode_name
*
* @return string
*/
public static function get_base_url( $post_id, $render_mode_name ) {
return add_query_arg( [
self::QUERY_STRING_POST_ID => $post_id,
self::QUERY_STRING_PARAM_NAME => $render_mode_name,
self::QUERY_STRING_NONCE_PARAM_NAME => wp_create_nonce( self::get_nonce_action( $post_id ) ),
'ver' => time(),
], get_permalink( $post_id ) );
}
/**
* @param $post_id
*
* @return string
*/
public static function get_nonce_action( $post_id ) {
return str_replace( '{post_id}', $post_id, self::NONCE_ACTION_PATTERN );
}
/**
* Register a new render mode into the render mode manager.
*
* @param $class_name
*
* @return $this
* @throws \Exception If the class does not extend Render_Mode_Base.
*/
public function register_render_mode( $class_name ) {
if ( ! is_subclass_of( $class_name, Render_Mode_Base::class ) ) {
throw new \Exception( sprintf( "'%s' must extend 'Render_Mode_Base'.", esc_html( $class_name ) ) );
}
$this->render_modes[ $class_name::get_name() ] = $class_name;
return $this;
}
/**
* Get the current render mode.
*
* @return Render_Mode_Base
*/
public function get_current() {
return $this->current;
}
/**
* @param Render_Mode_Base $render_mode
*
* @return $this
*/
private function set_current( Render_Mode_Base $render_mode ) {
$this->current = $render_mode;
return $this;
}
/**
* Set render mode.
*
* @return $this
*/
private function choose_render_mode() {
$post_id = null;
$template_id = null;
$key = null;
$nonce = null;
$kit_preview = null;
if ( isset( $_GET[ self::QUERY_STRING_POST_ID ] ) ) {
$post_id = $_GET[ self::QUERY_STRING_POST_ID ]; // phpcs:ignore -- Nonce will be checked next line.
}
if ( isset( $_GET[ self::QUERY_STRING_NONCE_PARAM_NAME ] ) ) {
$nonce = $_GET[ self::QUERY_STRING_NONCE_PARAM_NAME ]; // phpcs:ignore -- Nonce will be checked next line.
}
if ( isset( $_GET[ self::QUERY_STRING_PARAM_NAME ] ) ) {
$key = $_GET[ self::QUERY_STRING_PARAM_NAME ]; // phpcs:ignore -- Nonce will be checked next line.
}
if ( isset( $_GET[ self::QUERY_STRING_TEMPLATE_ID ] ) ) {
$template_id = $_GET[ self::QUERY_STRING_TEMPLATE_ID ]; // phpcs:ignore -- Nonce will be checked next line.
}
if (
$post_id &&
$nonce &&
wp_verify_nonce( $nonce, self::get_nonce_action( $post_id ) ) &&
$key &&
array_key_exists( $key, $this->render_modes )
) {
$this->set_current( new $this->render_modes[ $key ]( $post_id ) );
} else if ( $this->is_template_preview_mode( $template_id, $key, $nonce ) ) {
$this->set_current( new $this->render_modes[ $key ]( $template_id ) );
} else {
$this->set_current( new Render_Mode_Normal( $post_id ) );
}
return $this;
}
private function is_template_preview_mode( $template_id, $render_mode, $nonce ) {
if ( empty( $template_id ) ) {
return false;
}
if ( Render_Mode_Preview::MODE !== $render_mode ) {
return false;
}
if ( ! array_key_exists( $render_mode, $this->render_modes ) ) {
return false;
}
if ( ! wp_verify_nonce( $nonce, self::get_nonce_action( $template_id ) ) ) {
wp_die( esc_html__( 'Not Authorized', 'elementor' ), esc_html__( 'Error', 'elementor' ), 403 );
}
return true;
}
/**
* Add actions base on the current render.
*
* @throws \Requests_Exception_HTTP_403 If the current render mode does not have the required permissions.
* @throws Status403 If the current render mode does not have the required permissions.
*/
private function add_current_actions() {
if ( ! $this->current->get_permissions_callback() ) {
// WP >= 6.2-alpha
if ( class_exists( '\WpOrg\Requests\Exception\Http\Status403' ) ) {
throw new \WpOrg\Requests\Exception\Http\Status403();
} else {
throw new \Requests_Exception_HTTP_403();
}
}
// Run when 'template-redirect' actually because the the class is instantiate when 'template-redirect' run.
$this->current->prepare_render();
}
/**
* Render_Mode_Manager constructor.
*
* @throws \Exception If the render mode registration fails.
*/
public function __construct() {
$this->register_render_mode( Render_Mode_Normal::class );
do_action( 'elementor/frontend/render_mode/register', $this );
$this->choose_render_mode();
$this->add_current_actions();
}
}

View File

@@ -0,0 +1,105 @@
<?php
namespace Elementor\Core\Frontend\RenderModes;
use Elementor\Plugin;
use Elementor\Core\Base\Document;
use Elementor\Core\Frontend\Render_Mode_Manager;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
abstract class Render_Mode_Base {
const ENQUEUE_SCRIPTS_PRIORITY = 10;
const ENQUEUE_STYLES_PRIORITY = 10;
/**
* @var int
*/
protected $post_id;
/**
* @var Document
*/
protected $document;
/**
* Render_Mode_Base constructor.
*
* @param $post_id
*/
public function __construct( $post_id ) {
$this->post_id = intval( $post_id );
}
/**
* Returns the key name of the class.
*
* @throws \Exception If the `get_name` method is not implemented.
*/
public static function get_name() {
throw new \Exception( 'You must implements `get_name` static method in ' . static::class );
}
/**
* @param $post_id
*
* @return string
* @throws \Exception If the `get_name` method is not implemented.
*/
public static function get_url( $post_id ) {
return Render_Mode_Manager::get_base_url( $post_id, static::get_name() );
}
/**
* Runs before the render, by default load scripts and styles.
*/
public function prepare_render() {
add_action( 'wp_enqueue_scripts', function () {
$this->enqueue_scripts();
}, static::ENQUEUE_SCRIPTS_PRIORITY );
add_action( 'wp_enqueue_scripts', function () {
$this->enqueue_styles();
}, static::ENQUEUE_STYLES_PRIORITY );
}
/**
* By default do not do anything.
*/
protected function enqueue_scripts() {}
/**
* By default do not do anything.
*/
protected function enqueue_styles() {}
/**
* Check if the current user has permissions for the current render mode.
*
* @return bool
*/
public function get_permissions_callback() {
return $this->get_document()->is_editable_by_current_user();
}
/**
* Checks if the current render mode is static render, By default returns false.
*
* @return bool
*/
public function is_static() {
return false;
}
/**
* @return Document
*/
public function get_document() {
if ( ! $this->document ) {
$this->document = Plugin::$instance->documents->get( $this->post_id );
}
return $this->document;
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace Elementor\Core\Frontend\RenderModes;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
class Render_Mode_Normal extends Render_Mode_Base {
/**
* @return string
*/
public static function get_name() {
return 'normal';
}
/**
* Anyone can access the normal render mode.
*
* @return bool
*/
public function get_permissions_callback() {
return true;
}
}