PluginProbe
Elementor Website Builder – more than just a page builder / 3.6.1
Elementor Website Builder – more than just a page builder v3.6.1
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 3.6.1, at includes/settings/tools.php

433 lines 13.9 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\Main as MainMenu;
5 use Elementor\Core\Kits\Manager;
6
7 if ( ! defined( 'ABSPATH' ) ) {
8 exit; // Exit if accessed directly.
9 }
10
11 /**
12 * Elementor "Tools" page in WordPress Dashboard.
13 *
14 * Elementor settings page handler class responsible for creating and displaying
15 * Elementor "Tools" page in WordPress dashboard.
16 *
17 * @since 1.0.0
18 */
19 class Tools extends Settings_Page {
20
21 /**
22 * Settings page ID for Elementor tools.
23 */
24 const PAGE_ID = 'elementor-tools';
25
26 private function register_admin_menu( MainMenu $menu ) {
27 $menu->add_submenu( [
28 'page_title' => esc_html__( 'Tools', 'elementor' ),
29 'menu_title' => esc_html__( 'Tools', 'elementor' ),
30 'menu_slug' => self::PAGE_ID,
31 'function' => [ $this, 'display_settings_page' ],
32 'index' => 50,
33 ] );
34 }
35
36 /**
37 * Register admin menu legacy.
38 *
39 * Add new Elementor Tools admin menu.
40 *
41 * Fired by `admin_menu` action.
42 *
43 * @since 1.0.0
44 * @access private
45 */
46 private function register_admin_menu_legacy() {
47 add_submenu_page(
48 Settings::PAGE_ID,
49 esc_html__( 'Tools', 'elementor' ),
50 esc_html__( 'Tools', 'elementor' ),
51 'manage_options',
52 self::PAGE_ID,
53 [ $this, 'display_settings_page' ]
54 );
55 }
56
57 /**
58 * Clear cache.
59 *
60 * Delete post meta containing the post CSS file data. And delete the actual
61 * CSS files from the upload directory.
62 *
63 * Fired by `wp_ajax_elementor_clear_cache` action.
64 *
65 * @since 1.0.0
66 * @access public
67 */
68 public function ajax_elementor_clear_cache() {
69 check_ajax_referer( 'elementor_clear_cache', '_nonce' );
70
71 Plugin::$instance->files_manager->clear_cache();
72
73 wp_send_json_success();
74 }
75
76 /**
77 * Recreate kit.
78 *
79 * Recreate default kit (only when default kit does not exist).
80 *
81 * Fired by `wp_ajax_elementor_recreate_kit` action.
82 *
83 * @since 1.0.0
84 * @access public
85 */
86 public function ajax_elementor_recreate_kit() {
87 check_ajax_referer( 'elementor_recreate_kit', '_nonce' );
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 $from = ! empty( $_POST['from'] ) ? $_POST['from'] : '';
121 $to = ! empty( $_POST['to'] ) ? $_POST['to'] : '';
122
123 try {
124 $results = Utils::replace_urls( $from, $to );
125 wp_send_json_success( $results );
126 } catch ( \Exception $e ) {
127 wp_send_json_error( $e->getMessage() );
128 }
129 }
130
131 /**
132 * Elementor version rollback.
133 *
134 * Rollback to previous Elementor version.
135 *
136 * Fired by `admin_post_elementor_rollback` action.
137 *
138 * @since 1.5.0
139 * @access public
140 */
141 public function post_elementor_rollback() {
142 check_admin_referer( 'elementor_rollback' );
143
144 if ( ! static::can_user_rollback_versions() ) {
145 wp_die( esc_html__( 'Not allowed to rollback versions', 'elementor' ) );
146 }
147
148 $rollback_versions = $this->get_rollback_versions();
149 if ( empty( $_GET['version'] ) || ! in_array( $_GET['version'], $rollback_versions ) ) {
150 wp_die( esc_html__( 'Error occurred, The version selected is invalid. Try selecting different version.', 'elementor' ) );
151 }
152
153 $plugin_slug = basename( ELEMENTOR__FILE__, '.php' );
154
155 $rollback = new Rollback(
156 [
157 'version' => $_GET['version'],
158 'plugin_name' => ELEMENTOR_PLUGIN_BASE,
159 'plugin_slug' => $plugin_slug,
160 'package_url' => sprintf( 'https://downloads.wordpress.org/plugin/%s.%s.zip', $plugin_slug, $_GET['version'] ),
161 ]
162 );
163
164 $rollback->run();
165
166 wp_die(
167 '', esc_html__( 'Rollback to Previous Version', 'elementor' ), [
168 'response' => 200,
169 ]
170 );
171 }
172
173 /**
174 * Tools page constructor.
175 *
176 * Initializing Elementor "Tools" page.
177 *
178 * @since 1.0.0
179 * @access public
180 */
181 public function __construct() {
182 parent::__construct();
183
184 if ( Plugin::$instance->experiments->is_feature_active( 'admin_menu_rearrangement' ) ) {
185 add_action( 'elementor/admin/menu_registered/elementor', function( MainMenu $menu ) {
186 $this->register_admin_menu( $menu );
187 } );
188 } else {
189 add_action( 'admin_menu', function() {
190 $this->register_admin_menu_legacy();
191 }, 205 );
192 }
193
194 add_action( 'wp_ajax_elementor_clear_cache', [ $this, 'ajax_elementor_clear_cache' ] );
195 add_action( 'wp_ajax_elementor_replace_url', [ $this, 'ajax_elementor_replace_url' ] );
196 add_action( 'wp_ajax_elementor_recreate_kit', [ $this, 'ajax_elementor_recreate_kit' ] );
197
198 add_action( 'admin_post_elementor_rollback', [ $this, 'post_elementor_rollback' ] );
199 }
200
201 private function get_rollback_versions() {
202 $rollback_versions = get_transient( 'elementor_rollback_versions_' . ELEMENTOR_VERSION );
203 if ( false === $rollback_versions ) {
204 $max_versions = 30;
205
206 require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
207
208 $plugin_information = plugins_api(
209 'plugin_information', [
210 'slug' => 'elementor',
211 ]
212 );
213
214 if ( empty( $plugin_information->versions ) || ! is_array( $plugin_information->versions ) ) {
215 return [];
216 }
217
218 krsort( $plugin_information->versions );
219
220 $rollback_versions = [];
221
222 $current_index = 0;
223 foreach ( $plugin_information->versions as $version => $download_link ) {
224 if ( $max_versions <= $current_index ) {
225 break;
226 }
227
228 $lowercase_version = strtolower( $version );
229 $is_valid_rollback_version = ! preg_match( '/(trunk|beta|rc|dev)/i', $lowercase_version );
230
231 /**
232 * Is rollback version is valid.
233 *
234 * Filters the check whether the rollback version is valid.
235 *
236 * @param bool $is_valid_rollback_version Whether the rollback version is valid.
237 */
238 $is_valid_rollback_version = apply_filters(
239 'elementor/settings/tools/rollback/is_valid_rollback_version',
240 $is_valid_rollback_version,
241 $lowercase_version
242 );
243
244 if ( ! $is_valid_rollback_version ) {
245 continue;
246 }
247
248 if ( version_compare( $version, ELEMENTOR_VERSION, '>=' ) ) {
249 continue;
250 }
251
252 $current_index++;
253 $rollback_versions[] = $version;
254 }
255
256 set_transient( 'elementor_rollback_versions_' . ELEMENTOR_VERSION, $rollback_versions, WEEK_IN_SECONDS );
257 }
258
259 return $rollback_versions;
260 }
261
262 /**
263 * Create tabs.
264 *
265 * Return the tools page tabs, sections and fields.
266 *
267 * @since 1.5.0
268 * @access protected
269 *
270 * @return array An array with the page tabs, sections and fields.
271 */
272 protected function create_tabs() {
273 $rollback_html = '<select class="elementor-rollback-select">';
274
275 foreach ( $this->get_rollback_versions() as $version ) {
276 $rollback_html .= "<option value='{$version}'>$version</option>";
277 }
278 $rollback_html .= '</select>';
279
280 $tabs = [
281 'general' => [
282 'label' => esc_html__( 'General', 'elementor' ),
283 'sections' => [
284 'tools' => [
285 'fields' => [
286 'clear_cache' => [
287 'label' => esc_html__( 'Regenerate CSS & Data', 'elementor' ),
288 'field_args' => [
289 'type' => 'raw_html',
290 'html' => sprintf( '<button data-nonce="%s" class="button elementor-button-spinner" id="elementor-clear-cache-button">%s</button>', wp_create_nonce( 'elementor_clear_cache' ), esc_html__( 'Regenerate Files & Data', 'elementor' ) ),
291 'desc' => esc_html__( 'Styles set in Elementor are saved in CSS files in the uploads folder and in the site’s database. Recreate those files and settings, according to the most recent settings.', 'elementor' ),
292 ],
293 ],
294 'reset_api_data' => [
295 'label' => esc_html__( 'Sync Library', 'elementor' ),
296 'field_args' => [
297 'type' => 'raw_html',
298 'html' => sprintf( '<button data-nonce="%s" class="button elementor-button-spinner" id="elementor-library-sync-button">%s</button>', wp_create_nonce( 'elementor_reset_library' ), esc_html__( 'Sync Library', 'elementor' ) ),
299 'desc' => esc_html__( 'Elementor Library automatically updates on a daily basis. You can also manually update it by clicking on the sync button.', 'elementor' ),
300 ],
301 ],
302 ],
303 ],
304 ],
305 ],
306 'replace_url' => [
307 'label' => esc_html__( 'Replace URL', 'elementor' ),
308 'sections' => [
309 'replace_url' => [
310 'callback' => function() {
311 $intro_text = sprintf(
312 /* translators: %s: WordPress backups documentation. */
313 __( '<strong>Important:</strong> It is strongly recommended that you <a target="_blank" href="%s">backup your database</a> before using Replace URL.', 'elementor' ),
314 'http://go.elementor.com/wordpress-backups/'
315 );
316 $intro_text = '<div>' . $intro_text . '</div>';
317
318 echo '<h2>' . esc_html__( 'Replace URL', 'elementor' ) . '</h2>';
319 Utils::print_unescaped_internal_string( $intro_text );
320 },
321 'fields' => [
322 'replace_url' => [
323 'label' => esc_html__( 'Update Site Address (URL)', 'elementor' ),
324 'field_args' => [
325 'type' => 'raw_html',
326 'html' => sprintf( '<input type="text" name="from" placeholder="http://old-url.com" class="medium-text"><input type="text" name="to" placeholder="http://new-url.com" class="medium-text"><button data-nonce="%s" class="button elementor-button-spinner" id="elementor-replace-url-button">%s</button>', wp_create_nonce( 'elementor_replace_url' ), esc_html__( 'Replace URL', 'elementor' ) ),
327 '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' ),
328 ],
329 ],
330 ],
331 ],
332 ],
333 ],
334 'versions' => [
335 'show_if' => static::can_user_rollback_versions(),
336 'label' => esc_html__( 'Version Control', 'elementor' ),
337 'sections' => [
338 'rollback' => [
339 'label' => esc_html__( 'Rollback to Previous Version', 'elementor' ),
340 'callback' => function() {
341 $intro_text = sprintf(
342 /* translators: %s: Elementor version. */
343 esc_html__( 'Experiencing an issue with Elementor version %s? Rollback to a previous version before the issue appeared.', 'elementor' ),
344 ELEMENTOR_VERSION
345 );
346 $intro_text = '<p>' . $intro_text . '</p>';
347
348 Utils::print_unescaped_internal_string( $intro_text );
349 },
350 'fields' => [
351 'rollback' => [
352 'label' => esc_html__( 'Rollback Version', 'elementor' ),
353 'field_args' => [
354 'type' => 'raw_html',
355 'html' => sprintf(
356 $rollback_html . '<a data-placeholder-text="' . esc_html__( 'Reinstall', 'elementor' ) . ' v{VERSION}" href="#" data-placeholder-url="%s" class="button elementor-button-spinner elementor-rollback-button">%s</a>',
357 wp_nonce_url( admin_url( 'admin-post.php?action=elementor_rollback&version=VERSION' ), 'elementor_rollback' ),
358 esc_html__( 'Reinstall', 'elementor' )
359 ),
360 'desc' => '<span style="color: red;">' . esc_html__( 'Warning: Please backup your database before making the rollback.', 'elementor' ) . '</span>',
361 ],
362 ],
363 ],
364 ],
365 'beta' => [
366 'label' => esc_html__( 'Become a Beta Tester', 'elementor' ),
367 'callback' => function() {
368 echo '<p>' .
369 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' ) .
370 '</p>';
371 echo sprintf(
372 /* translators: 1: Link open tag, 2: Link close tag. */
373 esc_html__( '%1$sClick here%2$s to join our first-to-know email updates.', 'elementor' ),
374 '<a id="beta-tester-first-to-know" href="#">',
375 '</a>'
376 );
377 },
378 'fields' => [
379 'beta' => [
380 'label' => esc_html__( 'Beta Tester', 'elementor' ),
381 'field_args' => [
382 'type' => 'select',
383 'std' => 'no',
384 'options' => [
385 'no' => esc_html__( 'Disable', 'elementor' ),
386 'yes' => esc_html__( 'Enable', 'elementor' ),
387 ],
388 'desc' => '<span style="color: red;">' . esc_html__( 'Please Note: We do not recommend updating to a beta version on production sites.', 'elementor' ) . '</span>',
389 ],
390 ],
391 ],
392 ],
393 ],
394 ],
395 ];
396
397 if ( ! Plugin::$instance->kits_manager->get_active_kit()->get_id() ) {
398 $tabs['general']['sections']['tools']['fields']['recreate_kit'] = [
399 'label' => __( 'Recreate Kit', 'elementor' ),
400 'field_args' => [
401 'type' => 'raw_html',
402 'html' => sprintf( '<button data-nonce="%s" class="button elementor-button-spinner" id="elementor-recreate-kit-button">%s</button>', wp_create_nonce( 'elementor_recreate_kit' ), __( 'Recreate Kit', 'elementor' ) ),
403 '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' ),
404 ],
405 ];
406 }
407 return $tabs;
408 }
409
410 /**
411 * Get tools page title.
412 *
413 * Retrieve the title for the tools page.
414 *
415 * @since 1.5.0
416 * @access protected
417 *
418 * @return string Tools page title.
419 */
420 protected function get_page_title() {
421 return esc_html__( 'Tools', 'elementor' );
422 }
423
424 /**
425 * Check if the current user can access the version control tab and rollback versions.
426 *
427 * @return bool
428 */
429 public static function can_user_rollback_versions() {
430 return current_user_can( 'activate_plugins' ) && current_user_can( 'update_plugins' );
431 }
432 }
433