PluginProbe
Elementor Website Builder – more than just a page builder / 3.19.0-dev3
Elementor Website Builder – more than just a page builder v3.19.0-dev3
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
elementor / core / frontend / render-mode-manager.php

render-mode-manager.php in Elementor Website Builder – more than just a page builder 3.19.0-dev3, at core/frontend/render-mode-manager.php

160 lines 3.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Elementor\Core\Frontend;
3
4 use Elementor\Core\Frontend\RenderModes\Render_Mode_Base;
5 use Elementor\Core\Frontend\RenderModes\Render_Mode_Normal;
6
7 if ( ! defined( 'ABSPATH' ) ) {
8 exit; // Exit if accessed directly.
9 }
10
11 class Render_Mode_Manager {
12 const QUERY_STRING_PARAM_NAME = 'render_mode';
13 const QUERY_STRING_POST_ID = 'post_id';
14 const QUERY_STRING_NONCE_PARAM_NAME = 'render_mode_nonce';
15 const NONCE_ACTION_PATTERN = 'render_mode_{post_id}';
16
17 /**
18 * @var Render_Mode_Base
19 */
20 private $current;
21
22 /**
23 * @var Render_Mode_Base[]
24 */
25 private $render_modes = [];
26
27 /**
28 * @param $post_id
29 * @param $render_mode_name
30 *
31 * @return string
32 */
33 public static function get_base_url( $post_id, $render_mode_name ) {
34 return add_query_arg( [
35 self::QUERY_STRING_POST_ID => $post_id,
36 self::QUERY_STRING_PARAM_NAME => $render_mode_name,
37 self::QUERY_STRING_NONCE_PARAM_NAME => wp_create_nonce( self::get_nonce_action( $post_id ) ),
38 'ver' => time(),
39 ], get_permalink( $post_id ) );
40 }
41
42 /**
43 * @param $post_id
44 *
45 * @return string
46 */
47 public static function get_nonce_action( $post_id ) {
48 return str_replace( '{post_id}', $post_id, self::NONCE_ACTION_PATTERN );
49 }
50
51 /**
52 * Register a new render mode into the render mode manager.
53 *
54 * @param $class_name
55 *
56 * @return $this
57 * @throws \Exception
58 */
59 public function register_render_mode( $class_name ) {
60 if ( ! is_subclass_of( $class_name, Render_Mode_Base::class ) ) {
61 throw new \Exception( "'{$class_name}' must extend 'Render_Mode_Base'." );
62 }
63
64 $this->render_modes[ $class_name::get_name() ] = $class_name;
65
66 return $this;
67 }
68
69 /**
70 * Get the current render mode.
71 *
72 * @return Render_Mode_Base
73 */
74 public function get_current() {
75 return $this->current;
76 }
77
78 /**
79 * @param Render_Mode_Base $render_mode
80 *
81 * @return $this
82 */
83 private function set_current( Render_Mode_Base $render_mode ) {
84 $this->current = $render_mode;
85
86 return $this;
87 }
88
89 /**
90 * Set render mode.
91 *
92 * @return $this
93 */
94 private function choose_render_mode() {
95 $post_id = null;
96 $key = null;
97 $nonce = null;
98
99 if ( isset( $_GET[ self::QUERY_STRING_POST_ID ] ) ) {
100 $post_id = $_GET[ self::QUERY_STRING_POST_ID ]; // phpcs:ignore -- Nonce will be checked next line.
101 }
102
103 if ( isset( $_GET[ self::QUERY_STRING_NONCE_PARAM_NAME ] ) ) {
104 $nonce = $_GET[ self::QUERY_STRING_NONCE_PARAM_NAME ]; // phpcs:ignore -- Nonce will be checked next line.
105 }
106
107 if ( isset( $_GET[ self::QUERY_STRING_PARAM_NAME ] ) ) {
108 $key = $_GET[ self::QUERY_STRING_PARAM_NAME ]; // phpcs:ignore -- Nonce will be checked next line.
109 }
110
111 if (
112 $post_id &&
113 $nonce &&
114 wp_verify_nonce( $nonce, self::get_nonce_action( $post_id ) ) &&
115 $key &&
116 array_key_exists( $key, $this->render_modes )
117 ) {
118 $this->set_current( new $this->render_modes[ $key ]( $post_id ) );
119 } else {
120 $this->set_current( new Render_Mode_Normal( $post_id ) );
121 }
122
123 return $this;
124 }
125
126 /**
127 * Add actions base on the current render.
128 *
129 * @throws \Requests_Exception_HTTP_403
130 * @throws Status403
131 */
132 private function add_current_actions() {
133 if ( ! $this->current->get_permissions_callback() ) {
134 // WP >= 6.2-alpha
135 if ( class_exists( '\WpOrg\Requests\Exception\Http\Status403' ) ) {
136 throw new \WpOrg\Requests\Exception\Http\Status403();
137 } else {
138 throw new \Requests_Exception_HTTP_403();
139 }
140 }
141
142 // Run when 'template-redirect' actually because the the class is instantiate when 'template-redirect' run.
143 $this->current->prepare_render();
144 }
145
146 /**
147 * Render_Mode_Manager constructor.
148 *
149 * @throws \Exception
150 */
151 public function __construct() {
152 $this->register_render_mode( Render_Mode_Normal::class );
153
154 do_action( 'elementor/frontend/render_mode/register', $this );
155
156 $this->choose_render_mode();
157 $this->add_current_actions();
158 }
159 }
160