PluginProbe
Elementor Website Builder – more than just a page builder / 4.0.8
Elementor Website Builder – more than just a page builder v4.0.8
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 / includes / settings / tools.php

tools.php in Elementor Website Builder – more than just a page builder 4.0.8, at includes/settings/tools.php

486 lines 15.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Elementor;
3
4 use Elementor\Core\Admin\Menu\Admin_Menu_Manager;
5 use Elementor\Core\Kits\Manager;
6 use Elementor\Includes\Settings\AdminMenuItems\Tools_Menu_Item;
7 use Elementor\Modules\EditorOne\Classes\Menu_Data_Provider;
8 use Elementor\Includes\Settings\AdminMenuItems\Editor_One_Tools_Menu;
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit; // Exit if accessed directly.
12 }
13
14 /**
15 * Elementor "Tools" page in WordPress Dashboard.
16 *
17 * Elementor settings page handler class responsible for creating and displaying
18 * Elementor "Tools" page in WordPress dashboard.
19 *
20 * @since 1.0.0
21 */
22 class Tools extends Settings_Page {
23
24 const CAPABILITY = 'manage_options';
25
26 /**
27 * Settings page ID for Elementor tools.
28 */
29 const PAGE_ID = 'elementor-tools';
30
31 /**
32 * Clear cache.
33 *
34 * Delete post meta containing the post CSS file data. And delete the actual
35 * CSS files from the upload directory.
36 *
37 * Fired by `wp_ajax_elementor_clear_cache` action.
38 *
39 * @since 1.0.0
40 * @access public
41 */
42 public function ajax_elementor_clear_cache() {
43 check_ajax_referer( 'elementor_clear_cache', '_nonce' );
44
45 if ( ! current_user_can( static::CAPABILITY ) ) {
46 wp_send_json_error( 'Permission denied' );
47 }
48
49 Plugin::$instance->files_manager->clear_cache();
50
51 wp_send_json_success();
52 }
53
54 public function admin_post_elementor_site_clear_cache() {
55 check_ajax_referer( 'elementor_site_clear_cache' );
56
57 if ( ! current_user_can( static::CAPABILITY ) ) {
58 wp_die( 'Permission denied' );
59 }
60
61 Plugin::$instance->files_manager->clear_cache();
62
63 $http_referer = wp_get_raw_referer();
64 if ( empty( $http_referer ) ) {
65 $http_referer = admin_url( 'admin.php?page=' . static::PAGE_ID );
66 }
67
68 wp_safe_redirect( $http_referer );
69 die;
70 }
71
72 /**
73 * Recreate kit.
74 *
75 * Recreate default kit (only when default kit does not exist).
76 *
77 * Fired by `wp_ajax_elementor_recreate_kit` action.
78 *
79 * @since 1.0.0
80 * @access public
81 */
82 public function ajax_elementor_recreate_kit() {
83 check_ajax_referer( 'elementor_recreate_kit', '_nonce' );
84
85 if ( ! current_user_can( static::CAPABILITY ) ) {
86 wp_send_json_error( 'Permission denied' );
87 }
88
89 $kit = Plugin::$instance->kits_manager->get_active_kit();
90
91 if ( $kit->get_id() ) {
92 wp_send_json_error( [ 'message' => esc_html__( 'There\'s already an active kit.', 'elementor' ) ], 400 );
93 }
94
95 $created_default_kit = Plugin::$instance->kits_manager->create_default();
96
97 if ( ! $created_default_kit ) {
98 wp_send_json_error( [ 'message' => esc_html__( 'An error occurred while trying to create a kit.', 'elementor' ) ], 500 );
99 }
100
101 update_option( Manager::OPTION_ACTIVE, $created_default_kit );
102
103 wp_send_json_success( esc_html__( 'New kit have been created successfully', 'elementor' ) );
104 }
105
106 /**
107 * Replace URLs.
108 *
109 * Sends an ajax request to replace old URLs to new URLs. This method also
110 * updates all the Elementor data.
111 *
112 * Fired by `wp_ajax_elementor_replace_url` action.
113 *
114 * @since 1.1.0
115 * @access public
116 */
117 public function ajax_elementor_replace_url() {
118 check_ajax_referer( 'elementor_replace_url', '_nonce' );
119
120 if ( ! current_user_can( static::CAPABILITY ) ) {
121 wp_send_json_error( 'Permission denied' );
122 }
123
124 $from = Utils::get_super_global_value( $_POST, 'from' ) ?? '';
125 $to = Utils::get_super_global_value( $_POST, 'to' ) ?? '';
126
127 try {
128 $results = Utils::replace_urls( $from, $to );
129 wp_send_json_success( $results );
130 } catch ( \Exception $e ) {
131 wp_send_json_error( $e->getMessage() );
132 }
133 }
134
135 /**
136 * Elementor version rollback.
137 *
138 * Rollback to previous Elementor version.
139 *
140 * Fired by `admin_post_elementor_rollback` action.
141 *
142 * @since 1.5.0
143 * @access public
144 */
145 public function post_elementor_rollback() {
146 check_admin_referer( 'elementor_rollback' );
147
148 if ( ! static::can_user_rollback_versions() ) {
149 wp_die( esc_html__( 'Not allowed to rollback versions', 'elementor' ) );
150 }
151
152 $rollback_versions = $this->get_rollback_versions();
153 $version = Utils::get_super_global_value( $_GET, 'version' );
154
155 if ( empty( $version ) || ! in_array( $version, $rollback_versions, true ) ) {
156 wp_die( esc_html__( 'An error occurred, the selected version is invalid. Try selecting different version.', 'elementor' ) );
157 }
158
159 /**
160 * Filter to allow override the rollback process.
161 * Should return an instance of `Rollback` class.
162 *
163 * @since 3.16.0
164 *
165 * @param Rollback|null $rollback The rollback instance.
166 * @param string $version The version to roll back to.
167 */
168 $rollback = apply_filters( 'elementor/settings/rollback', null, $version );
169
170 if ( ! ( $rollback instanceof Rollback ) ) {
171 $plugin_slug = basename( ELEMENTOR__FILE__, '.php' );
172
173 $rollback = new Rollback( [
174 'version' => $version,
175 'plugin_name' => ELEMENTOR_PLUGIN_BASE,
176 'plugin_slug' => $plugin_slug,
177 'package_url' => sprintf( 'https://downloads.wordpress.org/plugin/%s.%s.zip', $plugin_slug, $version ),
178 ] );
179 }
180
181 $rollback->run();
182
183 wp_die(
184 '', esc_html__( 'Rollback to Previous Version', 'elementor' ), [
185 'response' => 200,
186 ]
187 );
188 }
189
190 /**
191 * Tools page constructor.
192 *
193 * Initializing Elementor "Tools" page.
194 *
195 * @since 1.0.0
196 * @access public
197 */
198 public function __construct() {
199 parent::__construct();
200
201 add_action( 'elementor/editor-one/menu/register', function ( Menu_Data_Provider $menu_data_provider ) {
202 $this->register_editor_one_menu( $menu_data_provider );
203 } );
204
205 add_action( 'wp_ajax_elementor_clear_cache', [ $this, 'ajax_elementor_clear_cache' ] );
206 add_action( 'admin_post_elementor_site_clear_cache', [ $this, 'admin_post_elementor_site_clear_cache' ] );
207 add_action( 'wp_ajax_elementor_replace_url', [ $this, 'ajax_elementor_replace_url' ] );
208 add_action( 'wp_ajax_elementor_recreate_kit', [ $this, 'ajax_elementor_recreate_kit' ] );
209
210 add_action( 'admin_post_elementor_rollback', [ $this, 'post_elementor_rollback' ] );
211 }
212
213 private function register_editor_one_menu( Menu_Data_Provider $menu_data_provider ) {
214 $menu_data_provider->register_menu( new Editor_One_Tools_Menu() );
215 }
216
217 public function get_warning_span( string $text ): string {
218 $color = 'var(--e-one-palette-error-main)';
219 return sprintf( '<span style="color: %s;">%s</span>', esc_attr( $color ), esc_html( $text ) );
220 }
221
222 private function get_rollback_versions() {
223 $rollback_versions = get_transient( 'elementor_rollback_versions_' . ELEMENTOR_VERSION );
224
225 if ( false === $rollback_versions ) {
226 $max_versions = 30;
227
228 $versions = apply_filters( 'elementor/settings/rollback/versions', [] );
229
230 if ( empty( $versions ) ) {
231 require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
232
233 $plugin_information = plugins_api(
234 'plugin_information', [
235 'slug' => 'elementor',
236 ]
237 );
238
239 if ( empty( $plugin_information->versions ) || ! is_array( $plugin_information->versions ) ) {
240 return [];
241 }
242
243 uksort( $plugin_information->versions, 'version_compare' );
244 $versions = array_keys( array_reverse( $plugin_information->versions ) );
245 }
246
247 $rollback_versions = [];
248
249 $current_index = 0;
250 foreach ( $versions as $version ) {
251 if ( $max_versions <= $current_index ) {
252 break;
253 }
254
255 $lowercase_version = strtolower( $version );
256 $is_valid_rollback_version = ! preg_match( '/(trunk|beta|rc|dev)/i', $lowercase_version );
257
258 /**
259 * Is rollback version is valid.
260 *
261 * Filters the check whether the rollback version is valid.
262 *
263 * @param bool $is_valid_rollback_version Whether the rollback version is valid.
264 */
265 $is_valid_rollback_version = apply_filters(
266 'elementor/settings/tools/rollback/is_valid_rollback_version',
267 $is_valid_rollback_version,
268 $lowercase_version
269 );
270
271 if ( ! $is_valid_rollback_version ) {
272 continue;
273 }
274
275 if ( version_compare( $version, ELEMENTOR_VERSION, '>=' ) ) {
276 continue;
277 }
278
279 ++$current_index;
280 $rollback_versions[] = $version;
281 }
282
283 set_transient( 'elementor_rollback_versions_' . ELEMENTOR_VERSION, $rollback_versions, WEEK_IN_SECONDS );
284 }
285
286 return $rollback_versions;
287 }
288
289 /**
290 * Create tabs.
291 *
292 * Return the tools page tabs, sections and fields.
293 *
294 * @since 1.5.0
295 * @access protected
296 *
297 * @return array An array with the page tabs, sections and fields.
298 */
299 protected function create_tabs() {
300 $rollback_html = '<select class="elementor-rollback-select">';
301
302 foreach ( $this->get_rollback_versions() as $version ) {
303 $rollback_html .= "<option value='{$version}'>$version</option>";
304 }
305 $rollback_html .= '</select>';
306
307 $tabs = [
308 'general' => [
309 'label' => esc_html__( 'General', 'elementor' ),
310 'sections' => [
311 'tools' => [
312 'fields' => [
313 'clear_cache' => [
314 'label' => esc_html__( 'Elementor Cache', 'elementor' ),
315 'field_args' => [
316 'type' => 'raw_html',
317 'html' => sprintf( '<button data-nonce="%s" data-id="elementor-tools-general-button-clear-files-data" class="button elementor-button-spinner" id="elementor-clear-cache-button">%s</button>', wp_create_nonce( 'elementor_clear_cache' ), esc_html__( 'Clear Files & Data', 'elementor' ) ),
318 'desc' => esc_html__( "Clear outdated CSS files and cached data in the database (rendered HTML, JS/CSS assets, etc.). We'll regenerate those files the next time someone visits any page on your website.", 'elementor' ),
319 ],
320 ],
321 'reset_api_data' => [
322 'label' => esc_html__( 'Sync Library', 'elementor' ),
323 'field_args' => [
324 'type' => 'raw_html',
325 'html' => sprintf( '<button data-nonce="%s" data-id="elementor-tools-general-button-sync-library" class="button elementor-button-spinner" id="elementor-library-sync-button">%s</button>', wp_create_nonce( 'elementor_reset_library' ), esc_html__( 'Sync Library', 'elementor' ) ),
326 'desc' => esc_html__( 'Elementor Library automatically updates on a daily basis. You can also manually update it by clicking on the sync button.', 'elementor' ),
327 ],
328 ],
329 ],
330 ],
331 ],
332 ],
333 'replace_url' => [
334 'label' => esc_html__( 'Replace URL', 'elementor' ),
335 'sections' => [
336 'replace_url' => [
337 'callback' => function() {
338 echo '<h2>' . esc_html__( 'Replace URL', 'elementor' ) . '</h2>';
339 printf(
340 '<p><strong>%1$s</strong> %2$s</p>',
341 esc_html__( 'Important:', 'elementor' ),
342 sprintf(
343 /* translators: 1: Link open tag, 2: Link close tag. */
344 esc_html__( 'It is strongly recommended to %1$sbackup the database%2$s before using replacing URLs.', 'elementor' ),
345 '<a href="https://go.elementor.com/wordpress-backups/" target="_blank">',
346 '</a>'
347 )
348 );
349 },
350 'fields' => [
351 'replace_url' => [
352 'label' => esc_html__( 'Update Site Address (URL)', 'elementor' ),
353 'field_args' => [
354 'type' => 'raw_html',
355 'html' => sprintf( '<input type="text" name="from" placeholder="https://old.example.com" class="large-text"><input type="text" name="to" placeholder="https://new.example.com" class="large-text"><button data-nonce="%s" data-id="elementor-tools-replace_url-button-replace-url" class="button elementor-button-spinner" id="elementor-replace-url-button">%s</button>', wp_create_nonce( 'elementor_replace_url' ), esc_html__( 'Replace URL', 'elementor' ) ),
356 'desc' => esc_html__( 'Enter your old and new URLs for your WordPress installation, to update all Elementor data (Relevant for domain transfers or move to \'HTTPS\').', 'elementor' ),
357 ],
358 ],
359 ],
360 ],
361 ],
362 ],
363 'versions' => [
364 'show_if' => static::can_user_rollback_versions(),
365 'label' => esc_html__( 'Version Control', 'elementor' ),
366 'sections' => [
367 'rollback' => [
368 'label' => esc_html__( 'Rollback to Previous Version', 'elementor' ),
369 'callback' => function() {
370 $intro_text = sprintf(
371 /* translators: %s: Elementor version. */
372 esc_html__( 'Experiencing an issue with Elementor version %s? Rollback to a previous version before the issue appeared.', 'elementor' ),
373 ELEMENTOR_VERSION
374 );
375 $intro_text = '<p>' . $intro_text . '</p>';
376
377 Utils::print_unescaped_internal_string( $intro_text );
378 },
379 'fields' => [
380 'rollback' => [
381 'label' => esc_html__( 'Rollback Version', 'elementor' ),
382 'field_args' => [
383 'type' => 'raw_html',
384 'html' => sprintf(
385 $rollback_html . '<button data-placeholder-text="%1$s v{VERSION}" data-placeholder-url="%2$s" class="button elementor-button-spinner elementor-rollback-button">%1$s</button>',
386 esc_html__( 'Reinstall', 'elementor' ),
387 wp_nonce_url( admin_url( 'admin-post.php?action=elementor_rollback&version=VERSION' ), 'elementor_rollback' )
388 ),
389 'desc' => $this->get_warning_span( esc_html__( 'Warning: Please backup your database before making the rollback.', 'elementor' ) ),
390 ],
391 ],
392 ],
393 ],
394 'beta' => [
395 'show_if' => $this->display_beta_tester(),
396 'label' => esc_html__( 'Become a Beta Tester', 'elementor' ),
397 'callback' => function() {
398 echo '<p>' .
399 esc_html__( 'Turn-on Beta Tester, to get notified when a new beta version of Elementor or Elementor Pro is available. The Beta version will not install automatically. You always have the option to ignore it.', 'elementor' ) .
400 '</p>';
401 echo '<p>' . sprintf(
402 /* translators: 1: Link open tag, 2: Link close tag. */
403 esc_html__( '%1$sClick here%2$s %3$sto join our first-to-know email updates.%4$s', 'elementor' ),
404 '<a id="beta-tester-first-to-know" class="elementor-become-a-beta-tester" href="#">',
405 '</a>',
406 '<span class="elementor-become-a-beta-tester">',
407 '</span>',
408 ) . '</p>';
409 },
410 'fields' => [
411 'beta' => [
412 'label' => esc_html__( 'Beta Tester', 'elementor' ),
413 'field_args' => [
414 'type' => 'select',
415 'std' => 'no',
416 'options' => [
417 'no' => esc_html__( 'Disable', 'elementor' ),
418 'yes' => esc_html__( 'Enable', 'elementor' ),
419 ],
420 'desc' => $this->get_warning_span( esc_html__( 'Please Note: We do not recommend updating to a beta version on production sites.', 'elementor' ) ),
421 ],
422 ],
423 ],
424 ],
425 ],
426 ],
427 ];
428
429 if ( ! Plugin::$instance->kits_manager->get_active_kit()->get_id() ) {
430 $tabs['general']['sections']['tools']['fields']['recreate_kit'] = [
431 'label' => esc_html__( 'Recreate Kit', 'elementor' ),
432 'field_args' => [
433 'type' => 'raw_html',
434 'html' => sprintf( '<button data-nonce="%s" class="button elementor-button-spinner" id="elementor-recreate-kit-button">%s</button>', wp_create_nonce( 'elementor_recreate_kit' ), esc_html__( 'Recreate Kit', 'elementor' ) ),
435 'desc' => esc_html__( 'It seems like your site doesn\'t have any active Kit. The active Kit includes all of your Site Settings. By recreating your Kit you will able to start edit your Site Settings again.', 'elementor' ),
436 ],
437 ];
438 }
439 return $tabs;
440 }
441
442 /**
443 * Get tools page title.
444 *
445 * Retrieve the title for the tools page.
446 *
447 * @since 1.5.0
448 * @access protected
449 *
450 * @return string Tools page title.
451 */
452 protected function get_page_title() {
453 return esc_html__( 'Tools', 'elementor' );
454 }
455
456 /**
457 * Check if the current user can access the version control tab and rollback versions.
458 *
459 * @return bool
460 */
461 public static function can_user_rollback_versions() {
462 return current_user_can( 'activate_plugins' ) && current_user_can( 'update_plugins' );
463 }
464
465 /**
466 * Check if the beta tester should be displayed.
467 *
468 * @since 3.19.0
469 *
470 * @return bool
471 */
472 public function display_beta_tester(): bool {
473 $display_beta_tester = true;
474 /**
475 * Filter to allow override the display of the beta tester.
476 *
477 * @param bool $display_beta_tester Whether to display the beta tester.
478 *
479 * @since 3.19.0
480 *
481 * return bool
482 */
483 return apply_filters( 'elementor/admin/show_beta_tester', $display_beta_tester );
484 }
485 }
486