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

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