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

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