Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/elementor/includes/preview.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
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 = Utils::is_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 + Plugin::$instance->elements_manager->enqueue_elements_scripts();
299 +
300 + $suffix = Utils::is_script_debug() ? '' : '.min';
301 +
302 + wp_enqueue_script(
303 + 'elementor-inline-editor',
304 + ELEMENTOR_ASSETS_URL . 'lib/inline-editor/js/inline-editor' . $suffix . '.js',
305 + [],
306 + ELEMENTOR_VERSION,
307 + true
308 + );
309 +
310 + // Handle the 'wp audio' in editor preview.
311 + wp_enqueue_script( 'wp-mediaelement' );
312 +
313 + /**
314 + * Preview enqueue scripts.
315 + *
316 + * Fires after Elementor preview scripts are enqueued.
317 + *
318 + * @since 1.5.4
319 + */
320 + do_action( 'elementor/preview/enqueue_scripts' );
321 + }
322 +
323 + public function rocket_loader_filter( $tag, $handle, $src ) {
324 + return str_replace( '<script', '<script data-cfasync="false"', $tag );
325 + }
326 +
327 + /**
328 + * Elementor Preview footer scripts and styles.
329 + *
330 + * Handle styles and scripts from frontend.
331 + *
332 + * Fired by `wp_footer` action.
333 + *
334 + * @since 2.0.9
335 + * @access public
336 + */
337 + public function wp_footer() {
338 + $frontend = Plugin::$instance->frontend;
339 + if ( $frontend->has_elementor_in_page() ) {
340 + // Has header/footer/widget-template - enqueue all style/scripts/fonts.
341 + $frontend->wp_footer();
342 + } else {
343 + // Enqueue only scripts.
344 + $frontend->enqueue_scripts();
345 + }
346 + }
347 +
348 + /**
349 + * Preview constructor.
350 + *
351 + * Initializing Elementor preview.
352 + *
353 + * @since 1.0.0
354 + * @access public
355 + */
356 + public function __construct() {
357 + add_action( 'template_redirect', [ $this, 'init' ], 0 );
358 + }
359 + }
360 +