_post_id = UId::parse($_REQUEST['uid']); if (!$this->isEditMode($this->_post_id)) { return; } /* // Send MIME Type header like WP admin-header. @header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset')); // Use requested id and not the global in order to avoid conflicts with plugins that changes the global post. query_posts([ 'p' => $this->_post_id, 'post_type' => get_post_type($this->_post_id), ]); */ Plugin::$instance->db->switchToPost($this->_post_id); $document = Plugin::$instance->documents->get($this->_post_id); Plugin::$instance->documents->switchToDocument($document); /* add_filter('show_admin_bar', '__return_false'); // Remove all actions remove_all_actions('wp_head'); remove_all_actions('wp_print_styles'); remove_all_actions('wp_print_head_scripts'); remove_all_actions('wp_footer'); */ // Handle `wp_head` add_action('wp_head', 'wp_enqueue_scripts', 1); add_action('wp_head', 'wp_print_styles', 8); add_action('wp_head', 'wp_print_head_scripts', 9); // add_action('wp_head', 'wp_site_icon'); add_action('wp_head', [$this, 'editor_head_trigger'], 30); // Handle `wp_footer` add_action('wp_footer', 'wp_print_footer_scripts', 20); // add_action('wp_footer', 'wp_auth_check_html', 30); add_action('wp_footer', [$this, 'wp_footer']); /* // Handle `wp_enqueue_scripts` remove_all_actions('wp_enqueue_scripts'); // Also remove all scripts hooked into after_wp_tiny_mce. remove_all_actions('after_wp_tiny_mce'); */ add_action('wp_enqueue_scripts', [$this, 'enqueue_scripts'], 999999); add_action('wp_enqueue_scripts', [$this, 'enqueue_styles'], 999999); // Change mode to Builder only on update // Plugin::$instance->db->setIsElementorPage($this->_post_id); // Post Lock if (!$this->getLockedUser($this->_post_id)) { $this->lockPost($this->_post_id); } // Setup default heartbeat options add_filter('heartbeat_settings', function ($settings) { $settings['interval'] = 15; return $settings; }); // Tell to Cache plugins do not cache this request. // Utils::doNotCache(); do_action('elementor/editor/init'); $this->printEditorTemplate(); // From the action it's an empty string, from tests its `false` if (false !== $die) { die; } } /** * Retrieve post ID. * * Get the ID of the current post. * * @since 1.8.0 * @access public * * @return int Post ID. */ public function getPostId() { return $this->_post_id; } // public function redirectToNewUrl() /** * Whether the edit mode is active. * * Used to determine whether we are in the edit mode. * * @since 1.0.0 * @access public * * @param int $post_id Optional. Post ID. Default is `null`, the current * post ID. * * @return bool Whether the edit mode is active. */ public function isEditMode($post_id = null) { if (null !== $this->_is_edit_mode) { return $this->_is_edit_mode; } if (empty($post_id)) { $post_id = $this->_post_id; } $document = Plugin::$instance->documents->get($post_id); if (!$document || !$document->isEditableByCurrentUser()) { return false; } if ('AdminCEEditor' === \Tools::getValue('controller') && !\Tools::getIsset('ajax')) { return true; } // Ajax request as Editor mode $actions = [ 'elementor', // Templates 'elementor_get_templates', 'elementor_save_template', 'elementor_get_template', 'elementor_delete_template', 'elementor_import_template', 'elementor_library_direct_actions', ]; if (isset($_REQUEST['action']) && in_array($_REQUEST['action'], $actions)) { return true; } return false; } /** * Lock post. * * Mark the post as currently being edited by the current user. * * @since 1.0.0 * @access public * * @param int $post_id The ID of the post being edited. */ public function lockPost($post_id) { // if (!function_exists('wp_set_post_lock')) { // require_once ABSPATH . 'wp-admin/includes/post.php'; // } wp_set_post_lock($post_id); } /** * Get locked user. * * Check what user is currently editing the post. * * @since 1.0.0 * @access public * * @param int $post_id The ID of the post being edited. * * @return \WP_User|false User information or false if the post is not locked. */ public function getLockedUser($post_id) { // if (!function_exists('wp_check_post_lock')) { // require_once ABSPATH . 'wp-admin/includes/post.php'; // } $locked_user = wp_check_post_lock($post_id); if (!$locked_user) { return false; } return get_user_by('id', $locked_user); } /** * Print Editor Template. * * Include the wrapper template of the editor. * * @since 2.2.0 * @access public */ public function printEditorTemplate() { include 'editor-templates/editor-wrapper.php'; } /** * Enqueue scripts. * * Registers all the editor scripts and enqueues them. * * @since 1.0.0 * @access public */ public function enqueueScripts() { // remove_action('wp_enqueue_scripts', [$this, __FUNCTION__], 999999); // Set the global data like $post, $authordata and etc setup_postdata($this->_post_id); // global $wp_styles, $wp_scripts; $plugin = Plugin::$instance; // Reset global variable // $wp_styles = new \WPStyles(); // WPCS: override ok. // $wp_scripts = new \WPScripts(); // WPCS: override ok. $suffix = _PS_MODE_DEV_ ? '' : '.min'; wp_register_script( 'elementor-editor-modules', _CE_ASSETS_URL_ . 'js/editor-modules' . $suffix . '.js', [ 'elementor-common-modules', ], _CE_VERSION_, true ); // Hack for waypoint with editor mode. wp_register_script( 'elementor-waypoints', _CE_ASSETS_URL_ . 'lib/waypoints/waypoints-for-editor.js', [ 'jquery', ], '4.0.2', true ); wp_register_script( 'perfect-scrollbar', _CE_ASSETS_URL_ . 'lib/perfect-scrollbar/js/perfect-scrollbar' . $suffix . '.js', [], '1.4.0', true ); wp_register_script( 'jquery-easing', _CE_ASSETS_URL_ . 'lib/jquery-easing/jquery-easing' . $suffix . '.js', [ 'jquery', ], '1.3.2', true ); wp_register_script( 'nprogress', _CE_ASSETS_URL_ . 'lib/nprogress/nprogress' . $suffix . '.js', [], '0.2.0', true ); wp_register_script( 'tipsy', _CE_ASSETS_URL_ . 'lib/tipsy/tipsy' . $suffix . '.js', [ 'jquery', ], '1.0.0', true ); wp_register_script( 'imagesloaded', _CE_ASSETS_URL_ . 'lib/imagesloaded/imagesloaded' . $suffix . '.js', [ 'jquery', ], '4.1.0', true ); wp_register_script( 'heartbeat', _CE_ASSETS_URL_ . 'lib/heartbeat/heartbeat' . $suffix . '.js', [ 'jquery', ], '5.5', true ); wp_localize_script( 'heartbeat', 'heartbeatSettings', apply_filters('heartbeat_settings', [ 'ajaxurl' => Helper::getAjaxLink(), ]) ); wp_register_script( 'jquery-elementor-select2', _CE_ASSETS_URL_ . 'lib/e-select2/js/e-select2.full' . $suffix . '.js', [ 'jquery', ], '4.0.6-rc1', true ); wp_register_script( 'flatpickr', _CE_ASSETS_URL_ . 'lib/flatpickr/flatpickr' . $suffix . '.js', [ 'jquery', ], '1.12.0', true ); wp_register_script( 'ace', 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.5/ace.js', [], '1.2.5', true ); wp_register_script( 'ace-language-tools', 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.5/ext-language_tools.js', [ 'ace', ], '1.2.5', true ); wp_register_script( 'jquery-hover-intent', _CE_ASSETS_URL_ . 'lib/jquery-hover-intent/jquery-hover-intent' . $suffix . '.js', [], '1.0.0', true ); wp_register_script( 'nouislider', _CE_ASSETS_URL_ . 'lib/nouislider/nouislider' . $suffix . '.js', [], '13.0.0', true ); wp_register_script( 'elementor-editor', _CE_ASSETS_URL_ . 'js/editor' . $suffix . '.js', [ 'elementor-common', 'elementor-editor-modules', // 'wp-auth-check', 'jquery-ui-sortable', 'jquery-ui-resizable', 'perfect-scrollbar', 'nprogress', 'tipsy', 'imagesloaded', 'heartbeat', 'jquery-elementor-select2', 'flatpickr', 'ace', 'ace-language-tools', 'jquery-hover-intent', 'nouislider', ], _CE_VERSION_, true ); /** * Before editor enqueue scripts. * * Fires before Elementor editor scripts are enqueued. * * @since 1.0.0 */ do_action('elementor/editor/before_enqueue_scripts'); $document = Plugin::$instance->documents->getDocOrAutoSave($this->_post_id); // Get document data *after* the scripts hook - so plugins can run compatibility before get data, but *before* enqueue the editor script - so elements can enqueue their own scripts that depended in editor script. $editor_data = $document->getElementsRawData(null, true); // Tweak for WP Admin menu icons // wp_print_styles('editor-buttons'); $locked_user = $this->getLockedUser($this->_post_id); if ($locked_user) { $locked_user = $locked_user->display_name; } $page_title_selector = get_option('elementor_page_title_selector'); if (empty($page_title_selector)) { $page_title_selector = 'h1.entry-title'; } $post_type_object = get_post_type_object($document->getMainPost()->post_type); $current_user_can_publish = current_user_can($post_type_object->cap->publish_posts); $config = [ 'version' => _CE_VERSION_, 'home_url' => home_url(), 'data' => $editor_data, // @TODO: `post_id` is bc since 2.0.0 'post_id' => "{$this->_post_id}", 'document' => $document->getConfig(), 'autosave_interval' => AUTOSAVE_INTERVAL, 'current_user_can_publish' => $current_user_can_publish, 'controls' => $plugin->controls_manager->getControlsData(), 'elements' => $plugin->elements_manager->getElementTypesConfig(), 'widgets' => $plugin->widgets_manager->getWidgetTypesConfig(), 'schemes' => [ 'items' => $plugin->schemes_manager->getRegisteredSchemesData(), 'enabled_schemes' => SchemesManager::getEnabledSchemes(), ], 'default_schemes' => $plugin->schemes_manager->getSchemesDefaults(), 'settings' => SettingsManager::getSettingsManagersConfig(), 'system_schemes' => $plugin->schemes_manager->getSystemSchemes(), 'wp_editor' => $this->getWpEditorConfig(), 'settings_page_link' => Helper::getSettingsLink(), 'is_active' => \Configuration::getGlobalValue('CE_LICENSE'), 'elementor_site' => 'https://creativeelements.webshopworks.com/about', 'docs_elementor_site' => __('http://docs.webshopworks.com/creative-elements'), 'help_the_content_url' => 'http://docs.webshopworks.com/creative-elements/the-content-missing', 'help_preview_error_url' => 'http://docs.webshopworks.com/creative-elements/preview-not-loaded', 'help_right_click_url' => 'http://docs.webshopworks.com/creative-elements/meet-right-click', 'help_flexbox_bc_url' => 'http://docs.webshopworks.com/creative-elements/flexbox-layout-bc', 'additional_shapes' => Shapes::getAdditionalShapesForConfig(), 'locked_user' => $locked_user, 'user' => [ // 'restrictions' => $plugin->role_manager->getUserRestrictionsArray(), 'restrictions' => [], 'is_administrator' => current_user_can('manage_options'), 'introduction' => User::getIntroductionMeta(), ], // @deprecated since 2.3.0 - Use `elementorCommon.config.isRTL` instead 'is_rtl' => is_rtl(), 'locale' => get_locale(), 'rich_editing_enabled' => filter_var(get_user_meta(get_current_user_id(), 'rich_editing', true), FILTER_VALIDATE_BOOLEAN), 'page_title_selector' => $page_title_selector, // 'tinymceHasCustomConfig' => class_exists('Tinymce_Advanced'), 'inlineEditing' => Plugin::$instance->widgets_manager->getInlineEditingConfig(), 'dynamicTags' => Plugin::$instance->dynamic_tags->getConfig(), 'i18n' => [ 'elementor' => __('Elementor'), 'delete' => __('Delete'), 'cancel' => __('Cancel'), 'got_it' => __('Got It'), /* translators: %s: Element name. */ 'edit_element' => __('Edit %s'), 'flexbox_attention_header' => __('Note: Flexbox Changes'), 'flexbox_attention_message' => __('Creative Elements 2.5 introduces key changes to the layout using CSS Flexbox. Your existing pages might have been affected, please review your page before publishing.'), // Menu. 'about_elementor' => __('About Creative Elements'), 'color_picker' => __('Color Picker'), 'elementor_settings' => __('Module Settings'), 'global_colors' => __('Default Colors'), 'global_fonts' => __('Default Fonts'), 'global_style' => __('Style'), 'settings' => __('Settings'), 'go_to' => __('Go To'), 'view_page' => __('View Page'), 'exit_to_dashboard' => __('Exit to Back-office'), // Elements. 'inner_section' => __('Inner Section'), // Control Order. 'asc' => __('Ascending order'), 'desc' => __('Descending order'), // Clear Page. 'clear_page' => __('Delete All Content'), 'dialog_confirm_clear_page' => __('Attention: We are going to DELETE ALL CONTENT from this page. Are you sure you want to do that?'), // Panel Preview Mode. 'back_to_editor' => __('Show Panel'), 'preview' => __('Hide Panel'), // Inline Editing. 'type_here' => __('Type Here'), // Library. 'an_error_occurred' => __('An error occurred'), 'category' => __('Category'), 'delete_template' => __('Delete Template'), 'delete_template_confirm' => __('Are you sure you want to delete this template?'), 'import_template_dialog_header' => __('Import Document Settings'), 'import_template_dialog_message' => __('Do you want to also import the document settings of the template?'), 'import_template_dialog_message_attention' => __('Attention: Importing may override previous settings.'), 'library' => __('Library'), 'no' => __('No'), 'page' => __('Page'), /* translators: %s: Template type. */ 'save_your_template' => __('Save Your %s to Library'), 'save_your_template_description' => __('Your designs will be available for export and reuse on any page or website'), 'section' => __('Section'), 'templates_empty_message' => __('This is where your templates should be. Design it. Save it. Reuse it.'), 'templates_empty_title' => __('Haven’t Saved Templates Yet?'), 'templates_no_favorites_message' => __('You can mark any pre-designed template as a favorite.'), 'templates_no_favorites_title' => __('No Favorite Templates'), 'templates_no_results_message' => __('Please make sure your search is spelled correctly or try a different words.'), 'templates_no_results_title' => __('No Results Found'), 'templates_request_error' => __('The following error(s) occurred while processing the request:'), 'yes' => __('Yes'), 'blocks' => __('Blocks'), 'pages' => __('Pages'), 'my_templates' => __('My Templates'), // Incompatible Device. 'device_incompatible_header' => __('Your browser isn\'t compatible'), 'device_incompatible_message' => __('Your browser isn\'t compatible with all of Creative Elements\' editing features. We recommend you switch to another browser like Chrome or Firefox.'), 'proceed_anyway' => __('Proceed Anyway'), // Preview not loaded. 'learn_more' => __('Learn More'), 'preview_el_not_found_header' => __('Sorry, the content area was not found in your page.'), 'preview_el_not_found_message' => __('You must insert the selected module position (hook) in the current template, in order for CreativeElements to work on this page.'), 'preview_not_loading_header' => __('The preview could not be loaded'), 'preview_not_loading_message' => __('We\'re sorry, but something went wrong. Click on \'Learn more\' and follow each of the steps to quickly solve it.'), // Take Over. /* translators: %s: User name. */ 'dialog_user_taken_over' => __('%s has taken over and is currently editing. Do you want to take over this page editing?'), 'go_back' => __('Go Back'), 'take_over' => __('Take Over'), // Revisions. /* translators: %s: Element type. */ 'delete_element' => __('Delete %s'), /* translators: %s: Template type. */ 'dialog_confirm_delete' => __('Are you sure you want to remove this %s?'), // Saver. 'before_unload_alert' => __('Please note: All unsaved changes will be lost.'), 'published' => __('Published'), 'publish' => __('Publish'), 'save' => __('Save'), 'saved' => __('Saved'), 'update' => __('Update'), 'submit' => __('Submit'), 'working_on_draft_notification' => __('This is just a draft. Play around and when you\'re done - click update.'), 'keep_editing' => __('Keep Editing'), 'have_a_look' => __('Have a look'), 'view_all_revisions' => __('View All Revisions'), 'dismiss' => __('Dismiss'), 'saving_disabled' => __('Saving has been disabled until you’re reconnected.'), // Ajax 'server_error' => __('Server Error'), 'server_connection_lost' => __('Connection Lost'), 'unknown_error' => __('Unknown Error'), // Context Menu 'duplicate' => __('Duplicate'), 'copy' => __('Copy'), 'paste' => __('Paste'), 'copy_style' => __('Copy Style'), 'paste_style' => __('Paste Style'), 'reset_style' => __('Reset Style'), // 'save_as_global' => __('Save as a Global'), 'save_as_block' => __('Save as Template'), 'new_column' => __('Add New Column'), 'copy_all_content' => __('Copy All Content'), 'delete_all_content' => __('Delete All Content'), 'navigator' => __('Navigator'), // Right Click Introduction 'meet_right_click_header' => __('Meet Right Click'), 'meet_right_click_message' => __('Now you can access all editing actions using right click.'), // Hotkeys screen 'keyboard_shortcuts' => __('Keyboard Shortcuts'), // Misc 'autosave' => __('Autosave'), 'elementor_docs' => __('Documentation'), 'reload_page' => __('Reload Page'), 'session_expired_header' => __('Timeout'), 'session_expired_message' => __('Your session has expired. Please reload the page to continue editing.'), 'unknown_value' => __('Unknown Value'), 'multistore_notification' => __('You are in a multistore context: any modification will impact all your shops, or each shop of the active group.'), ], ]; $localized_settings = []; /** * Localize editor settings. * * Filters the editor localized settings. * * @since 1.0.0 * * @param array $localized_settings Localized settings. * @param int $post_id The ID of the current post being edited. */ $localized_settings = apply_filters('elementor/editor/localize_settings', $localized_settings, $this->_post_id); if (!empty($localized_settings)) { $config = array_replace_recursive($config, $localized_settings); } wp_localize_script('elementor-editor', 'ElementorConfig', $config); wp_enqueue_script('elementor-editor'); $plugin->controls_manager->enqueueControlScripts(); /** * After editor enqueue scripts. * * Fires after Elementor editor scripts are enqueued. * * @since 1.0.0 */ do_action('elementor/editor/after_enqueue_scripts'); } /** * Enqueue styles. * * Registers all the editor styles and enqueues them. * * @since 1.0.0 * @access public */ public function enqueueStyles() { /** * Before editor enqueue styles. * * Fires before Elementor editor styles are enqueued. * * @since 1.0.0 */ do_action('elementor/editor/before_enqueue_styles'); $suffix = Utils::isScriptDebug() ? '' : '.min'; $direction_suffix = is_rtl() ? '-rtl' : ''; wp_register_style( 'font-awesome', _CE_ASSETS_URL_ . 'lib/font-awesome/css/font-awesome' . $suffix . '.css', [], '4.7-swap' ); wp_register_style( 'elementor-select2', _CE_ASSETS_URL_ . 'lib/e-select2/css/e-select2' . $suffix . '.css', [], '4.0.6-rc1' ); wp_register_style( 'google-font-roboto', 'https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap', [], _CE_VERSION_ ); wp_register_style( 'flatpickr', _CE_ASSETS_URL_ . 'lib/flatpickr/flatpickr' . $suffix . '.css', [], '1.12.0' ); wp_register_style( 'elementor-editor', _CE_ASSETS_URL_ . 'css/editor' . $direction_suffix . $suffix . '.css', [ 'elementor-common', 'font-awesome', 'elementor-select2', 'elementor-icons', 'ce-icons', // 'wp-auth-check', 'google-font-roboto', 'flatpickr', ], _CE_VERSION_ ); wp_enqueue_style('elementor-editor'); if (Responsive::hasCustomBreakpoints()) { $breakpoints = Responsive::getBreakpoints(); wp_add_inline_style('elementor-editor', '.elementor-device-tablet #elementor-preview-responsive-wrapper { width: ' . $breakpoints['md'] . 'px; }'); } /** * After editor enqueue styles. * * Fires after Elementor editor styles are enqueued. * * @since 1.0.0 */ do_action('elementor/editor/after_enqueue_styles'); } /** * Get PrestaShop editor config. * * Config the default PrestaShop editor with custom settings for Elementor use. * * @since 1.9.0 * @access private */ private function getWpEditorConfig() { return '