PluginProbe ʕ •ᴥ•ʔ
Elementor Website Builder – more than just a page builder / 3.11.2
Elementor Website Builder – more than just a page builder v3.11.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 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 / maintenance-mode.php
elementor / includes Last commit date
admin-templates 3 years ago base 3 years ago controls 3 years ago editor-templates 3 years ago elements 3 years ago interfaces 6 years ago libraries 5 years ago managers 3 years ago settings 3 years ago template-library 3 years ago widgets 3 years ago api.php 4 years ago autoloader.php 3 years ago beta-testers.php 6 years ago compatibility.php 3 years ago conditions.php 6 years ago db.php 5 years ago embed.php 4 years ago fonts.php 3 years ago frontend.php 3 years ago heartbeat.php 7 years ago maintenance-mode.php 4 years ago maintenance.php 3 years ago plugin.php 3 years ago preview.php 4 years ago rollback.php 4 years ago shapes.php 3 years ago stylesheet.php 4 years ago tracker.php 4 years ago user.php 3 years ago utils.php 3 years ago
maintenance-mode.php
384 lines
1 <?php
2 namespace Elementor;
3
4 use Elementor\TemplateLibrary\Source_Local;
5
6 if ( ! defined( 'ABSPATH' ) ) {
7 exit; // Exit if accessed directly.
8 }
9
10 /**
11 * Elementor maintenance mode.
12 *
13 * Elementor maintenance mode handler class is responsible for the Elementor
14 * "Maintenance Mode" and the "Coming Soon" features.
15 *
16 * @since 1.4.0
17 */
18 class Maintenance_Mode {
19
20 /**
21 * The options prefix.
22 */
23 const OPTION_PREFIX = 'elementor_maintenance_mode_';
24
25 /**
26 * The maintenance mode.
27 */
28 const MODE_MAINTENANCE = 'maintenance';
29
30 /**
31 * The coming soon mode.
32 */
33 const MODE_COMING_SOON = 'coming_soon';
34
35 /**
36 * Get elementor option.
37 *
38 * Retrieve elementor option from the database.
39 *
40 * @since 1.4.0
41 * @access public
42 * @static
43 *
44 * @param string $option Option name. Expected to not be SQL-escaped.
45 * @param mixed $default Optional. Default value to return if the option
46 * does not exist. Default is false.
47 *
48 * @return bool False if value was not updated and true if value was updated.
49 */
50 public static function get( $option, $default = false ) {
51 return get_option( self::OPTION_PREFIX . $option, $default );
52 }
53
54 /**
55 * Set elementor option.
56 *
57 * Update elementor option in the database.
58 *
59 * @since 1.4.0
60 * @access public
61 * @static
62 *
63 * @param string $option Option name. Expected to not be SQL-escaped.
64 * @param mixed $value Option value. Must be serializable if non-scalar.
65 * Expected to not be SQL-escaped.
66 *
67 * @return bool False if value was not updated and true if value was updated.
68 */
69 public static function set( $option, $value ) {
70 return update_option( self::OPTION_PREFIX . $option, $value );
71 }
72
73 /**
74 * Body class.
75 *
76 * Add "Maintenance Mode" CSS classes to the body tag.
77 *
78 * Fired by `body_class` filter.
79 *
80 * @since 1.4.0
81 * @access public
82 *
83 * @param array $classes An array of body classes.
84 *
85 * @return array An array of body classes.
86 */
87 public function body_class( $classes ) {
88 $classes[] = 'elementor-maintenance-mode';
89
90 return $classes;
91 }
92
93 /**
94 * Template redirect.
95 *
96 * Redirect to the "Maintenance Mode" template.
97 *
98 * Fired by `template_redirect` action.
99 *
100 * @since 1.4.0
101 * @access public
102 */
103 public function template_redirect() {
104 if ( Plugin::$instance->preview->is_preview_mode() ) {
105 return;
106 }
107
108 $user = wp_get_current_user();
109
110 $exclude_mode = self::get( 'exclude_mode', [] );
111
112 $is_login_page = false;
113
114 /**
115 * Is login page
116 *
117 * Filters whether the maintenance mode displaying the login page or a regular page.
118 *
119 * @since 1.0.4
120 *
121 * @param bool $is_login_page Whether its a login page.
122 */
123 $is_login_page = apply_filters( 'elementor/maintenance_mode/is_login_page', $is_login_page );
124
125 if ( $is_login_page ) {
126 return;
127 }
128
129 if ( 'logged_in' === $exclude_mode && is_user_logged_in() ) {
130 return;
131 }
132
133 if ( 'custom' === $exclude_mode ) {
134 $exclude_roles = self::get( 'exclude_roles', [] );
135 $user_roles = $user->roles;
136
137 if ( is_multisite() && is_super_admin() ) {
138 $user_roles[] = 'super_admin';
139 }
140
141 $compare_roles = array_intersect( $user_roles, $exclude_roles );
142
143 if ( ! empty( $compare_roles ) ) {
144 return;
145 }
146 }
147
148 add_filter( 'body_class', [ $this, 'body_class' ] );
149
150 if ( 'maintenance' === self::get( 'mode' ) ) {
151 $protocol = wp_get_server_protocol();
152 header( "$protocol 503 Service Unavailable", true, 503 );
153 header( 'Content-Type: text/html; charset=utf-8' );
154 header( 'Retry-After: 600' );
155 }
156
157 // Setup global post for Elementor\frontend so `_has_elementor_in_page = true`.
158 $GLOBALS['post'] = get_post( self::get( 'template_id' ) ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
159
160 // Set the template as `$wp_query->current_object` for `wp_title` and etc.
161 query_posts( [
162 'p' => self::get( 'template_id' ),
163 'post_type' => Source_Local::CPT,
164 ] );
165 }
166
167 /**
168 * Register settings fields.
169 *
170 * Adds new "Maintenance Mode" settings fields to Elementor admin page.
171 *
172 * The method need to receive the an instance of the Tools settings page
173 * to add the new maintenance mode functionality.
174 *
175 * Fired by `elementor/admin/after_create_settings/{$page_id}` action.
176 *
177 * @since 1.4.0
178 * @access public
179 *
180 * @param Tools $tools An instance of the Tools settings page.
181 */
182 public function register_settings_fields( Tools $tools ) {
183 $templates = Plugin::$instance->templates_manager->get_source( 'local' )->get_items( [
184 'type' => 'page',
185 ] );
186
187 $templates_options = [];
188
189 foreach ( $templates as $template ) {
190 $templates_options[ $template['template_id'] ] = esc_html( $template['title'] );
191 }
192
193 ob_start();
194
195 $this->print_template_description();
196
197 $template_description = ob_get_clean();
198
199 $tools->add_tab(
200 'maintenance_mode', [
201 'label' => esc_html__( 'Maintenance Mode', 'elementor' ),
202 'sections' => [
203 'maintenance_mode' => [
204 'callback' => function() {
205 echo '<h2>' . esc_html__( 'Maintenance Mode', 'elementor' ) . '</h2>';
206 echo '<div>' . esc_html__( 'Set your entire website as MAINTENANCE MODE, meaning the site is offline temporarily for maintenance, or set it as COMING SOON mode, meaning the site is offline until it is ready to be launched.', 'elementor' ) . '</div>';
207 },
208 'fields' => [
209 'maintenance_mode_mode' => [
210 'label' => esc_html__( 'Choose Mode', 'elementor' ),
211 'field_args' => [
212 'type' => 'select',
213 'std' => '',
214 'options' => [
215 '' => esc_html__( 'Disabled', 'elementor' ),
216 self::MODE_COMING_SOON => esc_html__( 'Coming Soon', 'elementor' ),
217 self::MODE_MAINTENANCE => esc_html__( 'Maintenance', 'elementor' ),
218 ],
219 'desc' => '<div class="elementor-maintenance-mode-description" data-value="" style="display: none">' .
220 esc_html__( 'Choose between Coming Soon mode (returning HTTP 200 code) or Maintenance Mode (returning HTTP 503 code).', 'elementor' ) .
221 '</div>' .
222 '<div class="elementor-maintenance-mode-description" data-value="maintenance" style="display: none">' .
223 esc_html__( 'Maintenance Mode returns HTTP 503 code, so search engines know to come back a short time later. It is not recommended to use this mode for more than a couple of days.', 'elementor' ) .
224 '</div>' .
225 '<div class="elementor-maintenance-mode-description" data-value="coming_soon" style="display: none">' .
226 esc_html__( 'Coming Soon returns HTTP 200 code, meaning the site is ready to be indexed.', 'elementor' ) .
227 '</div>',
228 ],
229 ],
230 'maintenance_mode_exclude_mode' => [
231 'label' => esc_html__( 'Who Can Access', 'elementor' ),
232 'field_args' => [
233 'class' => 'elementor-default-hide',
234 'type' => 'select',
235 'std' => 'logged_in',
236 'options' => [
237 'logged_in' => esc_html__( 'Logged In', 'elementor' ),
238 'custom' => esc_html__( 'Custom', 'elementor' ),
239 ],
240 ],
241 ],
242 'maintenance_mode_exclude_roles' => [
243 'label' => esc_html__( 'Roles', 'elementor' ),
244 'field_args' => [
245 'class' => 'elementor-default-hide',
246 'type' => 'checkbox_list_roles',
247 ],
248 'setting_args' => [ __NAMESPACE__ . '\Settings_Validations', 'checkbox_list' ],
249 ],
250 'maintenance_mode_template_id' => [
251 'label' => esc_html__( 'Choose Template', 'elementor' ),
252 'field_args' => [
253 'class' => 'elementor-default-hide',
254 'type' => 'select',
255 'std' => '',
256 'show_select' => true,
257 'options' => $templates_options,
258 'desc' => $template_description,
259 ],
260 ],
261 ],
262 ],
263 ],
264 ]
265 );
266 }
267
268 /**
269 * Add menu in admin bar.
270 *
271 * Adds "Maintenance Mode" items to the WordPress admin bar.
272 *
273 * Fired by `admin_bar_menu` filter.
274 *
275 * @since 1.4.0
276 * @access public
277 *
278 * @param \WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference.
279 */
280 public function add_menu_in_admin_bar( \WP_Admin_Bar $wp_admin_bar ) {
281 $wp_admin_bar->add_node( [
282 'id' => 'elementor-maintenance-on',
283 'title' => esc_html__( 'Maintenance Mode ON', 'elementor' ),
284 'href' => Tools::get_url() . '#tab-maintenance_mode',
285 ] );
286
287 $document = Plugin::$instance->documents->get( self::get( 'template_id' ) );
288
289 $wp_admin_bar->add_node( [
290 'id' => 'elementor-maintenance-edit',
291 'parent' => 'elementor-maintenance-on',
292 'title' => esc_html__( 'Edit Template', 'elementor' ),
293 'href' => $document ? $document->get_edit_url() : '',
294 ] );
295 }
296
297 /**
298 * Print style.
299 *
300 * Adds custom CSS to the HEAD html tag. The CSS that emphasise the maintenance
301 * mode with red colors.
302 *
303 * Fired by `admin_head` and `wp_head` filters.
304 *
305 * @since 1.4.0
306 * @access public
307 */
308 public function print_style() {
309 ?>
310 <style>#wp-admin-bar-elementor-maintenance-on > a { background-color: #dc3232; }
311 #wp-admin-bar-elementor-maintenance-on > .ab-item:before { content: "\f160"; top: 2px; }</style>
312 <?php
313 }
314
315 public function on_update_mode( $old_value, $value ) {
316 if ( $old_value !== $value ) {
317 do_action( 'elementor/maintenance_mode/mode_changed', $old_value, $value );
318 }
319 }
320
321 /**
322 * Maintenance mode constructor.
323 *
324 * Initializing Elementor maintenance mode.
325 *
326 * @since 1.4.0
327 * @access public
328 */
329 public function __construct() {
330 add_action( 'update_option_elementor_maintenance_mode_mode', [ $this, 'on_update_mode' ], 10, 2 );
331
332 $is_enabled = (bool) self::get( 'mode' ) && (bool) self::get( 'template_id' );
333
334 if ( is_admin() ) {
335 $page_id = Tools::PAGE_ID;
336 add_action( "elementor/admin/after_create_settings/{$page_id}", [ $this, 'register_settings_fields' ] );
337 }
338
339 if ( ! $is_enabled ) {
340 return;
341 }
342
343 add_action( 'admin_bar_menu', [ $this, 'add_menu_in_admin_bar' ], 300 );
344 add_action( 'admin_head', [ $this, 'print_style' ] );
345 add_action( 'wp_head', [ $this, 'print_style' ] );
346
347 // Priority = 11 that is *after* WP default filter `redirect_canonical` in order to avoid redirection loop.
348 add_action( 'template_redirect', [ $this, 'template_redirect' ], 11 );
349 }
350
351 /**
352 * Print Template Description
353 *
354 * Prints the template description
355 *
356 * @since 2.2.0
357 * @access private
358 */
359 private function print_template_description() {
360 $template_id = self::get( 'template_id' );
361
362 $edit_url = '';
363
364 if ( $template_id && get_post( $template_id ) ) {
365 $edit_url = Plugin::$instance->documents->get( $template_id )->get_edit_url();
366 }
367
368 ?>
369 <a target="_blank" class="elementor-edit-template" style="display: none" href="<?php echo esc_url( $edit_url ); ?>"><?php echo esc_html__( 'Edit Template', 'elementor' ); ?></a>
370 <div class="elementor-maintenance-mode-error"><?php echo esc_html__( 'To enable maintenance mode you have to set a template for the maintenance mode page.', 'elementor' ); ?></div>
371 <div class="elementor-maintenance-mode-error">
372 <?php
373 printf(
374 /* translators: %1$s Link open tag, %2$s: Link close tag. */
375 esc_html__( 'Select one or go ahead and %1$screate one%2$s now.', 'elementor' ),
376 '<a target="_blank" href="' . esc_url( admin_url( 'post-new.php?post_type=' . Source_Local::CPT ) ) . '">',
377 '</a>'
378 );
379 ?>
380 </div>
381 <?php
382 }
383 }
384