PageRenderTime 49ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/plugins/elementor/includes/settings/tools.php

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