Files
2025-07-13 11:19:53 +02:00

938 lines
30 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Creative Elements - live Theme & Page Builder
*
* @author WebshopWorks, Elementor
* @copyright 2019-2022 WebshopWorks.com & Elementor.com
* @license https://www.gnu.org/licenses/gpl-3.0.html
*/
namespace CE;
defined('_PS_VERSION_') or die;
use CE\CoreXCommonXModulesXAjaxXModule as Ajax;
use CE\CoreXResponsiveXResponsive as Responsive;
use CE\CoreXSettingsXManager as SettingsManager;
use CE\TemplateLibraryXSourceLocal as SourceLocal;
/**
* Elementor editor.
*
* Elementor editor handler class is responsible for initializing Elementor
* editor and register all the actions needed to display the editor.
*
* @since 1.0.0
*/
class Editor
{
/**
* User capability required to access Elementor editor.
*/
const EDITING_CAPABILITY = 'edit_posts';
/**
* Post ID.
*
* Holds the ID of the current post being edited.
*
* @since 1.0.0
* @access private
*
* @var int Post ID.
*/
private $_post_id;
/**
* Whether the edit mode is active.
*
* Used to determine whether we are in edit mode.
*
* @since 1.0.0
* @access private
*
* @var bool Whether the edit mode is active.
*/
private $_is_edit_mode;
/**
* Init.
*
* Initialize Elementor editor. Registers all needed actions to run Elementor,
* removes conflicting actions etc.
*
* Fired by `admin_action_elementor` action.
*
* @since 1.0.0
* @access public
*
* @param bool $die Optional. Whether to die at the end. Default is `true`.
*/
public function init($die = true)
{
if (empty($_REQUEST['uid'])) {
// WPCS: CSRF ok.
return;
}
$this->_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' => __('Havent 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 youre 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
'<div class="html-active" id="tinymce-editor-wrap">' .
'<div class="wp-editor-container" id="tinymce-editor-container">' .
'<textarea class="elementor-wp-editor" cols="40" id="tinymce-editor" name="tinymce-editor" rows="15">' .
'%%EDITORCONTENT%%</textarea></div></div>';
}
/**
* Editor head trigger.
*
* Fires the 'elementor/editor/wp_head' action in the head tag in Elementor
* editor.
*
* @since 1.0.0
* @access public
*/
public function editorHeadTrigger()
{
/**
* Elementor editor head.
*
* Fires on Elementor editor head tag.
*
* Used to prints scripts or any other data in the head tag.
*
* @since 1.0.0
*/
do_action('elementor/editor/wp_head');
}
/**
* WP footer.
*
* Prints Elementor editor with all the editor templates, and render controls,
* widgets and content elements.
*
* Fired by `wp_footer` action.
*
* @since 1.0.0
* @access public
*/
public function wpFooter()
{
$plugin = Plugin::$instance;
$plugin->controls_manager->renderControls();
$plugin->widgets_manager->renderWidgetsContent();
$plugin->elements_manager->renderElementsContent();
$plugin->schemes_manager->printSchemesTemplates();
// $plugin->dynamic_tags->printTemplates();
$this->initEditorTemplates();
/**
* Elementor editor footer.
*
* Fires on Elementor editor before closing the body tag.
*
* Used to prints scripts or any other HTML before closing the body tag.
*
* @since 1.0.0
*/
do_action('elementor/editor/footer');
}
/**
* Set edit mode.
*
* Used to update the edit mode.
*
* @since 1.0.0
* @access public
*
* @param bool $edit_mode Whether the edit mode is active.
*/
public function setEditMode($edit_mode)
{
$this->_is_edit_mode = $edit_mode;
}
// public function __construct()
// public function filterWpLinkQueryArgs($query)
// public function filterWpLinkQuery($results)
/**
* Init editor templates.
*
* Initialize default elementor templates used in the editor panel.
*
* @since 1.7.0
* @access private
*/
private function initEditorTemplates()
{
$template_names = [
'global',
'panel',
'panel-elements',
'repeater',
'templates',
'navigator',
'hotkeys',
];
foreach ($template_names as $template_name) {
Plugin::$instance->common->addTemplate(_CE_PATH_ . "includes/editor-templates/$template_name.php");
}
}
}