PluginProbe ʕ •ᴥ•ʔ
Elementor Website Builder – more than just a page builder / 3.27.1
Elementor Website Builder – more than just a page builder v3.27.1
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 4.0.6 4.0.5 4.0.4 4.0.3 3.22.0-dev1 4.0.0-beta3 3.22.0-dev2 4.0.0-beta4 3.22.0-dev3 4.0.0-beta5 3.22.0-dev4 4.0.0-dev1 3.22.0-dev5 4.0.0-dev2 3.22.0-dev6 4.0.0-dev3 3.22.1 4.0.0-dev4 3.22.2 4.0.0-dev5 3.22.3 4.0.1 3.23.0 4.0.2 3.23.0-beta1 3.23.0-beta2 3.23.0-beta3 3.23.0-beta4 3.23.0-beta5 3.23.0-beta6 3.23.0-dev1 3.23.0-dev2 3.23.0-dev3 3.23.0-dev4 3.23.0-dev5 3.23.0-dev6 3.23.1 3.23.2 3.23.3 3.23.4 3.24.0 3.24.0-beta1 3.24.0-beta2 3.24.0-beta3 3.24.0-dev1 3.24.0-dev2 3.24.0-dev3 3.24.1 3.24.2 3.24.3 3.24.4 3.24.5 3.24.6 3.24.7 3.24.8 3.25.0 3.25.0-beta1 3.25.0-beta2 3.25.0-beta3 3.25.0-dev1 3.25.0-dev2 3.25.0-dev3 3.25.1 3.25.10 3.25.11 3.25.2 3.25.3 3.25.4 3.25.5 3.25.6 3.25.7 3.25.8 3.25.9 3.26.0 3.26.0-beta1 3.26.0-beta2 3.26.0-beta3 3.26.0-beta4 3.26.0-beta5 3.26.0-dev1 3.26.0-dev2 3.26.0-dev3 3.26.0-dev4 3.26.0-dev5 3.26.1 3.26.2 3.26.3 3.26.4 3.26.5 3.27.0 3.27.0-beta1 3.27.0-beta2 3.27.0-dev1 3.27.0-dev2 3.27.1 3.27.2 3.27.3 3.27.4 3.27.5 3.27.6 3.27.7 3.28.0 3.28.0-beta1 3.28.0-beta2 3.28.0-beta3 3.28.0-dev1 3.28.0-dev2 3.28.0-dev3 3.28.1 3.28.2 3.28.3 3.28.4 3.29.0 3.29.0-beta1 trunk 3.29.0-beta2 3.0.0 3.29.0-beta3 3.0.1 3.29.0-beta4 3.0.10 3.29.0-dev1 3.0.11 3.29.0-dev2 3.0.12 3.29.0-dev3 3.0.13 3.29.0-dev4 3.0.14 3.29.1 3.0.15 3.29.2 3.0.16 3.3.0 3.0.2 3.3.1 3.0.3 3.30.0 3.0.4 3.30.0-beta1 3.0.5 3.30.0-beta2 3.0.6 3.30.0-beta3 3.0.7 3.30.0-dev1 3.0.8 3.30.0-dev2 3.0.8.1 3.30.0-dev3 3.0.9 3.30.1 3.1.0 3.30.2 3.1.0-beta1 3.30.3 3.1.0-beta2 3.30.4 3.1.0-beta3 3.31.0 3.1.0-beta4 3.31.0-beta1 3.1.0-dev1 3.31.0-beta2 3.1.0-dev2 3.31.0-dev1 3.1.0-dev3 3.31.0-dev2 3.1.1 3.31.1 3.1.2 3.31.2 3.1.3 3.31.3 3.1.4 3.31.4 3.10.0 3.31.5 3.10.0-dev1 3.32.0 3.10.1 3.32.0-beta1 3.10.2 3.32.0-beta2 3.11.0 3.32.0-beta3 3.11.0-beta1 3.32.0-dev1 3.11.0-beta2 3.32.0-dev2 3.11.0-beta3 3.32.0-dev3 3.11.0-dev1 3.32.1 3.11.0-dev2 3.32.2 3.11.0-dev3 3.32.3 3.11.1 3.32.4 3.11.2 3.32.5 3.11.3 3.33.0 3.11.4 3.33.0-beta1 3.11.5 3.33.0-beta2 3.12.0 3.33.0-beta3 3.12.1 3.33.0-beta4 3.12.2 3.33.0-dev1 3.13.0 3.33.0-dev2 3.13.0-beta1 3.33.0-dev3 3.13.0-beta2 3.33.0-dev4 3.13.0-beta3 3.33.1 3.13.0-dev3 3.33.2 3.13.0-dev4 3.33.3 3.13.1 3.33.4 3.13.2 3.33.5 3.13.3 3.33.6 3.13.4 3.34.0 3.14.0 3.34.0-beta1 3.14.0-beta1 3.34.0-beta2 3.14.0-beta2 3.34.0-beta3 3.14.0-beta3 3.34.0-dev1 3.14.0-beta4 3.34.0-dev2 3.14.0-beta5 3.34.1 3.14.1 3.34.2 3.15.0 3.34.3 3.15.1 3.34.4 3.15.2 3.35.0 3.15.3 3.35.0-beta1 3.16.0 3.35.0-beta2 3.16.0-beta3 3.35.0-beta3 3.16.0-beta4 3.35.0-beta4 3.16.0-dev1 3.35.0-dev1 3.16.0-dev2 3.35.0-dev2 3.16.1 3.35.0-dev3 3.16.2 3.35.0-dev4 3.16.3 3.35.1 3.16.4 3.35.2 3.16.5 3.35.3 3.16.6 3.35.4 3.17.0 3.35.5 3.17.0-dev2 3.35.6 3.17.0-dev3 3.35.7 3.17.0-dev4 3.35.8 3.17.1 3.35.9 3.17.2 3.4.0 3.17.3 3.4.0-dev7 3.18.0 3.4.0-dev8 3.18.0-beta1 3.4.0-dev9 3.18.0-beta2 3.4.1 3.18.0-beta3 3.4.2 3.18.0-beta4 3.4.3 3.18.0-dev1 3.4.4 3.18.1 3.4.5 3.18.2 3.4.6 3.18.3 3.4.7 3.19.0 3.4.8 3.19.0-beta1 3.5.0 3.19.0-beta2 3.5.0-beta1 3.19.0-beta3 3.5.0-beta2 3.19.0-beta4 3.5.0-beta3 3.19.0-beta5 3.5.0-beta4 3.19.0-beta6 3.5.0-beta5 3.19.0-dev1 3.5.0-beta7 3.19.0-dev2 3.5.0-beta8 3.19.0-dev3 3.5.0-dev8 3.19.0-dev4 3.5.0-dev9 3.19.0-dev5 3.5.1 3.19.0-dev6 3.5.2 3.19.1 3.5.3 3.19.2 3.5.4 3.19.3 3.5.5 3.19.4 3.5.6 3.2.0 3.6.0 3.2.1 3.6.0-beta1 3.2.2 3.6.0-beta2 3.2.3 3.6.0-beta3 3.2.4 3.6.0-beta4 3.2.5 3.6.0-beta5 3.20.0 3.6.0-dev1 3.20.0-beta1 3.6.0-dev10 3.20.0-beta2 3.6.1 3.20.0-beta3 3.6.2 3.20.0-beta4 3.6.3 3.20.0-dev1 3.6.4 3.20.0-dev2 3.6.5 3.20.0-dev3 3.6.6 3.20.0-dev4 3.6.7 3.20.1 3.6.8 3.20.2 3.7.0 3.20.3 3.7.0-beta1 3.20.4 3.7.0-beta2 3.21.0 3.7.0-beta3 3.21.0-beta1 3.7.0-beta4 3.21.0-beta2 3.7.0-dev1 3.21.0-beta3 3.7.1 3.21.0-dev1 3.7.2 3.21.0-dev2 3.7.3 3.21.0-dev3 3.7.4 3.21.1 3.7.5 3.21.2 3.7.6 3.21.3 3.7.7 3.21.4 3.7.8 3.21.5 3.8.0 3.21.6 3.8.0-beta1 3.21.7 3.8.0-beta2 3.21.8 3.8.0-beta3 3.22.0 3.8.1 3.22.0-beta1 3.9.0 3.22.0-beta2 3.9.1 3.22.0-beta3 3.9.2 3.22.0-beta4 4.0.0 3.22.0-beta5 4.0.0-beta1 3.22.0-beta6 4.0.0-beta2
elementor / includes / preview.php
elementor / includes Last commit date
admin-templates 1 year ago base 1 year ago container 1 year ago controls 1 year ago editor-templates 1 year ago elements 1 year ago interfaces 1 year ago libraries 1 year ago managers 1 year ago settings 1 year ago template-library 1 year ago widgets 1 year ago api.php 1 year ago autoloader.php 1 year ago beta-testers.php 3 years ago compatibility.php 1 year ago conditions.php 3 years ago db.php 2 years ago editor-assets-api.php 1 year ago embed.php 1 year ago fonts.php 1 year ago frontend.php 1 year ago heartbeat.php 3 years ago maintenance-mode.php 2 years ago maintenance.php 1 year ago plugin.php 1 year ago preview.php 1 year ago rollback.php 3 years ago shapes.php 1 year ago stylesheet.php 1 year ago tracker.php 1 year ago user.php 2 years ago utils.php 1 year ago
preview.php
359 lines
1 <?php
2 namespace Elementor;
3
4 use Elementor\Core\Base\App;
5 use Elementor\Core\Settings\Manager as SettingsManager;
6
7 if ( ! defined( 'ABSPATH' ) ) {
8 exit; // Exit if accessed directly.
9 }
10
11 /**
12 * Elementor preview.
13 *
14 * Elementor preview handler class is responsible for initializing Elementor in
15 * preview mode.
16 *
17 * @since 1.0.0
18 */
19 class Preview extends App {
20
21 /**
22 * The priority of the preview enqueued styles.
23 */
24 const ENQUEUED_STYLES_PRIORITY = 20;
25
26 /**
27 * Is Preview.
28 *
29 * Holds a flag if current request is a preview.
30 * The flag is not related to a specific post or edit permissions.
31 *
32 * @since 2.9.5
33 * @access private
34 *
35 * @var bool Is Preview.
36 */
37
38 private $is_preview;
39
40 /**
41 * Post ID.
42 *
43 * Holds the ID of the current post being previewed.
44 *
45 * @since 1.0.0
46 * @access private
47 *
48 * @var int Post ID.
49 */
50 private $post_id;
51
52 /**
53 * Get module name.
54 *
55 * Retrieve the module name.
56 *
57 * @since 3.0.0
58 * @access public
59 * @abstract
60 *
61 * @return string Module name.
62 */
63 public function get_name() {
64 return 'preview';
65 }
66
67 /**
68 * Init.
69 *
70 * Initialize Elementor preview mode.
71 *
72 * Fired by `template_redirect` action.
73 *
74 * @since 1.0.0
75 * @access public
76 */
77 public function init() {
78 if ( is_admin() || ! $this->is_preview_mode() ) {
79 return;
80 }
81
82 if ( isset( $_GET['preview-debug'] ) ) {
83 register_shutdown_function( function () {
84 $e = error_get_last();
85 if ( $e ) {
86 echo '<div id="elementor-preview-debug-error"><pre>';
87 Utils::print_unescaped_internal_string( $e['message'] );
88 echo '</pre></div>';
89 }
90 } );
91 }
92
93 $this->post_id = get_the_ID();
94 $this->is_preview = true;
95
96 // Don't redirect to permalink.
97 remove_action( 'template_redirect', 'redirect_canonical' );
98
99 // Compatibility with Yoast SEO plugin when 'Removes unneeded query variables from the URL' enabled.
100 // TODO: Move this code to `includes/compatibility.php`.
101 if ( class_exists( 'WPSEO_Frontend' ) ) {
102 remove_action( 'template_redirect', [ \WPSEO_Frontend::get_instance(), 'clean_permalink' ], 1 );
103 }
104
105 // Disable the WP admin bar in preview mode.
106 add_filter( 'show_admin_bar', '__return_false' );
107
108 add_action( 'wp_enqueue_scripts', function() {
109 $this->enqueue_styles();
110 $this->enqueue_scripts();
111 }, self::ENQUEUED_STYLES_PRIORITY );
112
113 add_filter( 'the_content', [ $this, 'builder_wrapper' ], 999999 );
114
115 add_action( 'wp_footer', [ $this, 'wp_footer' ] );
116
117 // Avoid Cloudflare's Rocket Loader lazy load the editor iframe
118 add_filter( 'script_loader_tag', [ $this, 'rocket_loader_filter' ], 10, 3 );
119
120 // Tell to WP Cache plugins do not cache this request.
121 Utils::do_not_cache();
122
123 /**
124 * Preview init.
125 *
126 * Fires on Elementor preview init, after Elementor preview has finished
127 * loading but before any headers are sent.
128 *
129 * @since 1.0.0
130 *
131 * @param Preview $this The current preview.
132 */
133 do_action( 'elementor/preview/init', $this );
134 }
135
136 /**
137 * Retrieve post ID.
138 *
139 * Get the ID of the current post.
140 *
141 * @since 1.8.0
142 * @access public
143 *
144 * @return int Post ID.
145 */
146 public function get_post_id() {
147 return $this->post_id;
148 }
149
150 /**
151 * Is Preview.
152 *
153 * Whether current request is the elementor preview iframe.
154 * The flag is not related to a specific post or edit permissions.
155 *
156 * @since 2.9.5
157 * @access public
158 *
159 * @return bool
160 */
161 public function is_preview() {
162 return $this->is_preview;
163 }
164
165 /**
166 * Whether preview mode is active.
167 *
168 * Used to determine whether we are in the preview mode (iframe).
169 *
170 * @since 1.0.0
171 * @access public
172 *
173 * @param int $post_id Optional. Post ID. Default is `0`.
174 *
175 * @return bool Whether preview mode is active.
176 */
177 public function is_preview_mode( $post_id = 0 ) {
178 if ( ! isset( $_GET['elementor-preview'] ) ) {
179 return false;
180 }
181
182 if ( empty( $post_id ) ) {
183 $post_id = get_the_ID();
184 }
185
186 if ( ! User::is_current_user_can_edit( $post_id ) ) {
187 return false;
188 }
189
190 if ( $post_id !== (int) $_GET['elementor-preview'] ) {
191 return false;
192 }
193
194 return true;
195 }
196
197 /**
198 * Builder wrapper.
199 *
200 * Used to add an empty HTML wrapper for the builder, the javascript will add
201 * the content later.
202 *
203 * @since 1.0.0
204 * @access public
205 *
206 * @param string $content The content of the builder.
207 *
208 * @return string HTML wrapper for the builder.
209 */
210 public function builder_wrapper( $content ) {
211 if ( get_the_ID() === $this->post_id ) {
212 $document = Plugin::$instance->documents->get( $this->post_id );
213
214 $attributes = $document->get_container_attributes();
215
216 $content = '<div ' . Utils::render_html_attributes( $attributes ) . '></div>';
217 }
218
219 return $content;
220 }
221
222 /**
223 * Enqueue preview styles.
224 *
225 * Registers all the preview styles and enqueues them.
226 *
227 * Fired by `wp_enqueue_scripts` action.
228 *
229 * @since 1.0.0
230 * @access private
231 */
232 private function enqueue_styles() {
233 // Hold-on all jQuery plugins after all HTML markup render.
234 wp_add_inline_script( 'jquery-migrate', 'jQuery.holdReady( true );' );
235
236 Plugin::$instance->frontend->enqueue_styles();
237
238 Plugin::$instance->elements_manager->enqueue_elements_styles();
239
240 Plugin::$instance->widgets_manager->enqueue_widgets_styles();
241
242 $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
243
244 $direction_suffix = is_rtl() ? '-rtl' : '';
245
246 wp_register_style(
247 'elementor-select2',
248 ELEMENTOR_ASSETS_URL . 'lib/e-select2/css/e-select2' . $suffix . '.css',
249 [],
250 '4.0.6-rc.1'
251 );
252
253 wp_register_style(
254 'editor-preview',
255 ELEMENTOR_ASSETS_URL . 'css/editor-preview' . $direction_suffix . $suffix . '.css',
256 [
257 'elementor-select2',
258 ],
259 ELEMENTOR_VERSION
260 );
261
262 wp_enqueue_style(
263 'e-theme-ui-light',
264 $this->get_css_assets_url( 'theme-light' ),
265 [],
266 ELEMENTOR_VERSION
267 );
268
269 wp_enqueue_style( 'editor-preview' );
270
271 // Handle the 'wp audio' in editor preview.
272 wp_enqueue_style( 'wp-mediaelement' );
273
274 /**
275 * Preview enqueue styles.
276 *
277 * Fires after Elementor preview styles are enqueued.
278 *
279 * @since 1.0.0
280 */
281 do_action( 'elementor/preview/enqueue_styles' );
282 }
283
284 /**
285 * Enqueue preview scripts.
286 *
287 * Registers all the preview scripts and enqueues them.
288 *
289 * Fired by `wp_enqueue_scripts` action.
290 *
291 * @since 1.5.4
292 * @access private
293 */
294 private function enqueue_scripts() {
295 Plugin::$instance->frontend->register_scripts();
296
297 Plugin::$instance->widgets_manager->enqueue_widgets_scripts();
298
299 $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
300
301 wp_enqueue_script(
302 'elementor-inline-editor',
303 ELEMENTOR_ASSETS_URL . 'lib/inline-editor/js/inline-editor' . $suffix . '.js',
304 [],
305 ELEMENTOR_VERSION,
306 true
307 );
308
309 // Handle the 'wp audio' in editor preview.
310 wp_enqueue_script( 'wp-mediaelement' );
311
312 /**
313 * Preview enqueue scripts.
314 *
315 * Fires after Elementor preview scripts are enqueued.
316 *
317 * @since 1.5.4
318 */
319 do_action( 'elementor/preview/enqueue_scripts' );
320 }
321
322 public function rocket_loader_filter( $tag, $handle, $src ) {
323 return str_replace( '<script', '<script data-cfasync="false"', $tag );
324 }
325
326 /**
327 * Elementor Preview footer scripts and styles.
328 *
329 * Handle styles and scripts from frontend.
330 *
331 * Fired by `wp_footer` action.
332 *
333 * @since 2.0.9
334 * @access public
335 */
336 public function wp_footer() {
337 $frontend = Plugin::$instance->frontend;
338 if ( $frontend->has_elementor_in_page() ) {
339 // Has header/footer/widget-template - enqueue all style/scripts/fonts.
340 $frontend->wp_footer();
341 } else {
342 // Enqueue only scripts.
343 $frontend->enqueue_scripts();
344 }
345 }
346
347 /**
348 * Preview constructor.
349 *
350 * Initializing Elementor preview.
351 *
352 * @since 1.0.0
353 * @access public
354 */
355 public function __construct() {
356 add_action( 'template_redirect', [ $this, 'init' ], 0 );
357 }
358 }
359