Files
wyczarujprezent.pl/modules/leoelements/includes/frontend.php
2024-10-28 22:14:22 +01:00

1313 lines
34 KiB
PHP

<?php
/**
* 2007-2022 Leotheme
*
* NOTICE OF LICENSE
*
* LeoElements is module help you can build content for your shop
*
* DISCLAIMER
*
* @author Leotheme <leotheme@gmail.com>
* @copyright 2007-2022 Leotheme
* @license http://leotheme.com - prestashop template provider
*/
namespace LeoElements;
use LeoElements\Core\Base\App;
use LeoElements\Core\Base\Document;
use LeoElements\Core\Responsive\Files\Frontend as FrontendFile;
use LeoElements\Core\Files\CSS\Global_CSS;
use LeoElements\Core\Files\CSS\Post as Post_CSS;
use LeoElements\Core\Files\CSS\Post_Preview;
use LeoElements\Core\Responsive\Responsive;
use LeoElements\Core\Settings\Manager as SettingsManager;
use LeoElements\Leo_Helper;
if ( ! defined( '_PS_VERSION_' ) ) {
exit; // Exit if accessed directly.
}
/**
* Elementor frontend.
*
* Elementor frontend handler class is responsible for initializing Elementor in
* the frontend.
*
* @since 1.0.0
*/
class Frontend extends App {
/**
* The priority of the content filter.
*/
const THE_CONTENT_FILTER_PRIORITY = 9;
/**
* Post ID.
*
* Holds the ID of the current post.
*
* @access private
*
* @var int Post ID.
*/
private $post_id;
/**
* Fonts to enqueue
*
* Holds the list of fonts that are being used in the current page.
*
* @since 1.9.4
* @access public
*
* @var array Used fonts. Default is an empty array.
*/
public $fonts_to_enqueue = [];
/**
* Registered fonts.
*
* Holds the list of enqueued fonts in the current page.
*
* @since 1.0.0
* @access private
*
* @var array Registered fonts. Default is an empty array.
*/
private $registered_fonts = [];
/**
* Icon Fonts to enqueue
*
* Holds the list of Icon fonts that are being used in the current page.
*
* @since 1.0.0
* @access private
*
* @var array Used icon fonts. Default is an empty array.
*/
private $icon_fonts_to_enqueue = [];
/**
* Enqueue Icon Fonts
*
* Holds the list of Icon fonts already enqueued in the current page.
*
* @since 1.0.0
* @access private
*
* @var array enqueued icon fonts. Default is an empty array.
*/
private $enqueued_icon_fonts = [];
/**
* Whether the page is using Elementor.
*
* Used to determine whether the current page is using Elementor.
*
* @since 1.0.0
* @access private
*
* @var bool Whether Elementor is being used. Default is false.
*/
private $_has_elementor_in_page = false;
/**
* Whether the excerpt is being called.
*
* Used to determine whether the call to `the_content()` came from `get_the_excerpt()`.
*
* @since 1.0.0
* @access private
*
* @var bool Whether the excerpt is being used. Default is false.
*/
private $_is_excerpt = false;
/**
* Filters removed from the content.
*
* Hold the list of filters removed from `the_content()`. Used to hold the filters that
* conflicted with Elementor while Elementor process the content.
*
* @since 1.0.0
* @access private
*
* @var array Filters removed from the content. Default is an empty array.
*/
private $content_removed_filters = [];
/**
* @var Document[]
*/
private $admin_bar_edit_documents = [];
/**
* @var string[]
*/
private $body_classes = [
'elementor-default',
];
/**
* Front End constructor.
*
* Initializing Elementor front end. Make sure we are not in admin, not and
* redirect from old URL structure of Elementor editor.
*
* @since 1.0.0
* @access public
*/
public function __construct() {
// We don't need this class in admin side, but in AJAX requests.
if ( Leo_Helper::is_admin() && ! Leo_Helper::wp_doing_ajax() ) {
return;
}
Leo_Helper::add_action( 'template_redirect', [ $this, 'init' ] );
Leo_Helper::add_action( 'wp_enqueue_scripts', [ $this, 'register_scripts' ], 5 );
Leo_Helper::add_action( 'wp_enqueue_scripts', [ $this, 'register_styles' ], 5 );
$this->add_content_filter();
// Hack to avoid enqueue post CSS while it's a `the_excerpt` call.
Leo_Helper::add_filter( 'get_the_excerpt', [ $this, 'start_excerpt_flag' ], 1 );
Leo_Helper::add_filter( 'get_the_excerpt', [ $this, 'end_excerpt_flag' ], 20 );
}
/**
* Get module name.
*
* Retrieve the module name.
*
* @since 1.0.0
* @access public
*
* @return string Module name.
*/
public function get_name() {
return 'frontend';
}
/**
* Init.
*
* Initialize Elementor front end. Hooks the needed actions to run Elementor
* in the front end, including script and style registration.
*
* Fired by `template_redirect` action.
*
* @since 1.0.0
* @access public
*/
public function init() {
if ( Plugin::$instance->editor->is_edit_mode() ) {
return;
}
Leo_Helper::add_filter( 'body_class', [ $this, 'body_class' ] );
if ( Plugin::$instance->preview->is_preview_mode() ) {
return;
}
if ( current_user_can( 'manage_options' ) ) {
Plugin::$instance->init_common();
}
$this->post_id = Leo_Helper::get_the_ID();
if ( Leo_Helper::is_singular() && Plugin::$instance->db->is_built_with_elementor( $this->post_id ) ) {
Leo_Helper::add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_styles' ] );
}
// Priority 7 to allow google fonts in header template to load in <head> tag
Leo_Helper::add_action( 'wp_head', [ $this, 'print_fonts_links' ], 7 );
Leo_Helper::add_action( 'wp_footer', [ $this, 'wp_footer' ] );
}
/**
* @since 2.0.12
* @access public
* @param string|array $class
*/
public function add_body_class( $class ) {
if ( is_array( $class ) ) {
$this->body_classes = array_merge( $this->body_classes, $class );
} else {
$this->body_classes[] = $class;
}
}
/**
* Body tag classes.
*
* Add new elementor classes to the body tag.
*
* Fired by `body_class` filter.
*
* @since 1.0.0
* @access public
*
* @param array $classes Optional. One or more classes to add to the body tag class list.
* Default is an empty array.
*
* @return array Body tag classes.
*/
public function body_class( $classes = [] ) {
$classes = array_merge( $classes, $this->body_classes );
$id = Leo_Helper::get_the_ID();
if ( Leo_Helper::is_singular() && Plugin::$instance->db->is_built_with_elementor( $id ) ) {
$classes[] = 'elementor-page elementor-page-' . $id;
}
return $classes;
}
/**
* Add content filter.
*
* Remove plain content and render the content generated by Elementor.
*
* @since 1.8.0
* @access public
*/
public function add_content_filter() {
Leo_Helper::add_filter( 'the_content', [ $this, 'apply_builder_in_content' ], self::THE_CONTENT_FILTER_PRIORITY );
}
/**
* Remove content filter.
*
* When the Elementor generated content rendered, we remove the filter to prevent multiple
* accuracies. This way we make sure Elementor renders the content only once.
*
* @since 1.8.0
* @access public
*/
public function remove_content_filter() {
remove_filter( 'the_content', [ $this, 'apply_builder_in_content' ], self::THE_CONTENT_FILTER_PRIORITY );
}
/**
* Registers scripts.
*
* Registers all the frontend scripts.
*
* Fired by `wp_enqueue_scripts` action.
*
* @since 1.2.1
* @access public
*/
public function register_scripts() {
/**
* Before frontend register scripts.
*
* Fires before Elementor frontend scripts are registered.
*
* @since 1.2.1
*/
Leo_Helper::do_action( 'elementor/frontend/before_register_scripts' );
Leo_Helper::wp_register_script(
'elementor-frontend-modules',
$this->get_js_assets_url( 'frontend-modules' ),
[
'jquery',
],
LEOELEMENTS_VERSION,
true
);
Leo_Helper::wp_register_script(
'elementor-waypoints',
$this->get_js_assets_url( 'waypoints', 'assets/lib/waypoints/' ),
[
'jquery',
],
'4.0.2',
true
);
Leo_Helper::wp_register_script(
'flatpickr',
$this->get_js_assets_url( 'flatpickr', 'assets/lib/flatpickr/' ),
[
'jquery',
],
'4.1.4',
true
);
Leo_Helper::wp_register_script(
'imagesloaded',
$this->get_js_assets_url( 'imagesloaded', 'assets/lib/imagesloaded/' ),
[
'jquery',
],
'4.1.0',
true
);
Leo_Helper::wp_register_script(
'jquery-numerator',
$this->get_js_assets_url( 'jquery-numerator', 'assets/lib/jquery-numerator/' ),
[
'jquery',
],
'0.2.1',
true
);
Leo_Helper::wp_register_script(
'swiper',
$this->get_js_assets_url( 'swiper', 'assets/lib/swiper/' ),
[],
'4.4.6',
true
);
Leo_Helper::wp_register_script(
'jquery-slick',
$this->get_js_assets_url( 'slick', 'assets/lib/slick/' ),
[
'jquery',
],
'1.8.1',
true
);
Leo_Helper::wp_register_script(
'elementor-dialog',
$this->get_js_assets_url( 'dialog', 'assets/lib/dialog/' ),
[
'jquery-ui-position',
],
'4.7.1',
true
);
Leo_Helper::wp_register_script(
'elementor-frontend',
$this->get_js_assets_url( 'frontend' ),
[
'elementor-frontend-modules',
'elementor-dialog',
'elementor-waypoints',
'swiper',
],
LEOELEMENTS_VERSION,
true
);
/**
* After frontend register scripts.
*
* Fires after Elementor frontend scripts are registered.
*
* @since 1.2.1
*/
Leo_Helper::do_action( 'elementor/frontend/after_register_scripts' );
}
/**
* Registers styles.
*
* Registers all the frontend styles.
*
* Fired by `wp_enqueue_scripts` action.
*
* @since 1.2.0
* @access public
*/
public function register_styles() {
/**
* Before frontend register styles.
*
* Fires before Elementor frontend styles are registered.
*
* @since 1.2.0
*/
Leo_Helper::do_action( 'elementor/frontend/before_register_styles' );
Leo_Helper::wp_register_style(
'font-awesome',
$this->get_css_assets_url( 'font-awesome', 'assets/lib/font-awesome/css/' ),
[],
'4.7.0'
);
Leo_Helper::wp_register_style(
'ce-icons',
$this->get_css_assets_url( 'ce-icons', 'assets/lib/eicons/css/' ),
[],
'5.11.0'
);
Leo_Helper::wp_register_style(
'elementor-animations',
$this->get_css_assets_url( 'animations', 'assets/lib/animations/', true ),
[],
LEOELEMENTS_VERSION
);
Leo_Helper::wp_register_style(
'flatpickr',
$this->get_css_assets_url( 'flatpickr', 'assets/lib/flatpickr/' ),
[],
'4.1.4'
);
$min_suffix = Utils::is_script_debug() ? '' : '.min';
$direction_suffix = Leo_Helper::is_rtl() ? '-rtl' : '';
$frontend_file_name = 'frontend' . $direction_suffix . $min_suffix . '.css';
$has_custom_file = Responsive::has_custom_breakpoints();
if ( $has_custom_file ) {
$frontend_file = new FrontendFile( 'custom-' . $frontend_file_name, Responsive::get_stylesheet_templates_path() . $frontend_file_name );
$time = $frontend_file->get_meta( 'time' );
if ( ! $time ) {
$frontend_file->update();
}
$frontend_file_url = $frontend_file->get_url();
} else {
$frontend_file_url = LEOELEMENTS_ASSETS_URL . 'css/' . $frontend_file_name;
}
Leo_Helper::wp_register_style(
'elementor-frontend',
$frontend_file_url,
[],
$has_custom_file ? null : LEOELEMENTS_VERSION
);
/**
* After frontend register styles.
*
* Fires after Elementor frontend styles are registered.
*
* @since 1.2.0
*/
Leo_Helper::do_action( 'elementor/frontend/after_register_styles' );
}
/**
* Enqueue scripts.
*
* Enqueue all the frontend scripts.
*
* @since 1.0.0
* @access public
*/
public function enqueue_scripts() {
/**
* Before frontend enqueue scripts.
*
* Fires before Elementor frontend scripts are enqueued.
*
* @since 1.0.0
*/
Leo_Helper::do_action( 'elementor/frontend/before_enqueue_scripts' );
Leo_Helper::wp_enqueue_script( 'elementor-frontend' );
$this->print_config();
/**
* After frontend enqueue scripts.
*
* Fires after Elementor frontend scripts are enqueued.
*
* @since 1.0.0
*/
Leo_Helper::do_action( 'elementor/frontend/after_enqueue_scripts' );
}
/**
* Enqueue styles.
*
* Enqueue all the frontend styles.
*
* Fired by `wp_enqueue_scripts` action.
*
* @since 1.0.0
* @access public
*/
public function enqueue_styles() {
/**
* Before frontend styles enqueued.
*
* Fires before Elementor frontend styles are enqueued.
*
* @since 1.0.0
*/
Leo_Helper::do_action( 'elementor/frontend/before_enqueue_styles' );
Leo_Helper::wp_enqueue_style( 'elementor-icons' );
Leo_Helper::wp_enqueue_style( 'elementor-animations' );
Leo_Helper::wp_enqueue_style( 'elementor-frontend' );
/**
* After frontend styles enqueued.
*
* Fires after Elementor frontend styles are enqueued.
*
* @since 1.0.0
*/
Leo_Helper::do_action( 'elementor/frontend/after_enqueue_styles' );
if ( ! Plugin::$instance->preview->is_preview_mode() ) {
$this->parse_global_css_code();
$post_id = Leo_Helper::get_the_ID();
// Check $post_id for virtual pages. check is singular because the $post_id is set to the first post on archive pages.
if ( $post_id && Leo_Helper::is_singular() ) {
$css_file = Post_CSS::create( Leo_Helper::get_the_ID() );
$css_file->enqueue();
}
}
}
/**
* Elementor footer scripts and styles.
*
* Handle styles and scripts that are not printed in the header.
*
* Fired by `wp_footer` action.
*
* @since 1.0.11
* @access public
*/
public function wp_footer() {
if ( ! $this->_has_elementor_in_page ) {
return;
}
$this->enqueue_styles();
$this->enqueue_scripts();
$this->print_fonts_links();
}
/**
* Print fonts links.
*
* Enqueue all the frontend fonts by url.
*
* Fired by `wp_head` action.
*
* @since 1.9.4
* @access public
*/
public function print_fonts_links() {
$google_fonts = [
'upload' => [],
'google' => [],
'early' => [],
];
foreach ( $this->fonts_to_enqueue as $key => $font ) {
$font_type = Fonts::get_font_type( $font );
switch ( $font_type ) {
case Fonts::TUANVU_UPLOAD:
$google_fonts['upload'][] = $font;
break;
case Fonts::GOOGLE:
$google_fonts['google'][] = $font;
break;
case Fonts::EARLYACCESS:
$google_fonts['early'][] = $font;
break;
case false:
$this->maybe_enqueue_icon_font( $font );
break;
default:
/**
* Print font links.
*
* Fires when Elementor frontend fonts are printed on the HEAD tag.
*
* The dynamic portion of the hook name, `$font_type`, refers to the font type.
*
* @since 2.0.0
*
* @param string $font Font name.
*/
Leo_Helper::do_action( "elementor/fonts/print_font_links/{$font_type}", $font );
}
}
$this->fonts_to_enqueue = [];
$this->enqueue_google_fonts( $google_fonts );
// $this->enqueue_upload_fonts( $google_fonts );
$this->enqueue_icon_fonts();
}
private function maybe_enqueue_icon_font( $icon_font_type ) {
if ( ! Icons_Manager::is_migration_allowed() ) {
return;
}
$icons_types = Icons_Manager::get_icon_manager_tabs();
if ( ! isset( $icons_types[ $icon_font_type ] ) ) {
return;
}
$icon_type = $icons_types[ $icon_font_type ];
if ( isset( $icon_type['url'] ) ) {
$this->icon_fonts_to_enqueue[ $icon_font_type ] = [ $icon_type['url'] ];
}
}
private function enqueue_icon_fonts() {
if ( empty( $this->icon_fonts_to_enqueue ) || ! Icons_Manager::is_migration_allowed() ) {
return;
}
foreach ( $this->icon_fonts_to_enqueue as $icon_type => $css_url ) {
Leo_Helper::wp_enqueue_style( 'elementor-icons-' . $icon_type );
$this->enqueued_icon_fonts[] = $css_url;
}
//clear enqueued icons
$this->icon_fonts_to_enqueue = [];
}
/**
* Print Google fonts.
*
* Enqueue all the frontend Google fonts.
*
* Fired by `wp_head` action.
*
* @since 1.0.0
* @access private
*
* @param array $google_fonts Optional. Google fonts to print in the frontend.
* Default is an empty array.
*/
private function enqueue_google_fonts( $google_fonts = [] ) {
static $google_fonts_index = 0;
$print_google_fonts = true;
/**
* Print frontend google fonts.
*
* Filters whether to enqueue Google fonts in the frontend.
*
* @since 1.0.0
*
* @param bool $print_google_fonts Whether to enqueue Google fonts. Default is true.
*/
$print_google_fonts = Leo_Helper::apply_filters( 'elementor/frontend/print_google_fonts', $print_google_fonts );
if ( ! $print_google_fonts ) {
return;
}
// Print used fonts
if ( ! empty( $google_fonts['google'] ) ) {
$google_fonts_index++;
foreach ( $google_fonts['google'] as &$font ) {
$font = str_replace( ' ', '+', $font ) . ':100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic';
}
$fonts_url = sprintf( 'https://fonts.googleapis.com/css?family=%s', implode( rawurlencode( '|' ), $google_fonts['google'] ) );
$subsets = [
'ru_RU' => 'cyrillic',
'bg_BG' => 'cyrillic',
'he_IL' => 'hebrew',
'el' => 'greek',
'vi' => 'vietnamese',
'uk' => 'cyrillic',
'cs_CZ' => 'latin-ext',
'ro_RO' => 'latin-ext',
'pl_PL' => 'latin-ext',
];
$locale= \Context::getContext()->language->iso_code;
if ( isset( $subsets[ $locale ] ) ) {
$fonts_url .= '&subset=' . $subsets[ $locale ];
}
echo '<link rel="stylesheet" href="' . $fonts_url . '" type="text/css" media="all">'; // phpcs:ignore
}
if ( ! empty( $google_fonts['upload'] ) ) {
$google_fonts_index++;
foreach ( $google_fonts['upload'] as &$font ) {
$mldfont = \LeoElementsFont::getAllFontsByFamily($font);
if($mldfont)
{
// __PS_BASE_URI__ . 'themes/' . apPageHelper::getThemeName() . '/assets/img/patterns/'
// _PS_BASE_URL_.__PS_BASE_URI__.'themes/'._THEME_NAME_.'/assets/fonts/'
// $fonts_url = sprintf( 'http://leo_tuanvu/Framework-N/MixFashion/themes/leo_mixfashion/assets/fonts/'. $mldfont['file']);
$fonts_url = sprintf( _PS_BASE_URL_SSL_.__PS_BASE_URI__.'themes/'._THEME_NAME_.'/assets/fonts/' . $mldfont['file']);
$files = explode(',', $mldfont['file']);
$content = '';
$content .= "@font-face {\n";
$content .= "font-family:'".$mldfont['font_family']."';\n";
$content .= "font-style:'".$mldfont['font_style']."';\n";
$content .= "font-weight:'".$mldfont['font_weight']."';\n";
$content .= "src:local('".$mldfont['font_family']."'),";
foreach ($files as $file_k => $file) {
$content .= "\n" . "url(" . _PS_BASE_URL_SSL_.__PS_BASE_URI__.'themes/'._THEME_NAME_.'/assets/fonts/' .$file.") format('".explode('.', $file)[count(explode('.', $file)) - 1]."')";
$content .= ($file_k == count($files) - 1) ? ';' : ',';
}
$content .= "}\n";
// echo '<link rel="stylesheet" href="' . $fonts_url . '" type="text/css" media="all">'; // phpcs:ignore
// $mldfont
$this->theme_dir = \leoECHelper::getConfigDir('_PS_THEME_DIR_');
$this->theme_dir = _PS_THEME_DIR_;
$this->module_name = 'leoelements';
$this->profile_css_folder = $this->theme_dir.'modules/leoelements/views/css/';
\LeoECSetting::writeFile($this->profile_css_folder, $GLOBALS['leoelements']['parse_post_css_code'].'.css', $content);
// echo '<style>' . $content . '</style>';
// $uri = \leoECHelper::getCssDir().'profiles/'.$GLOBALS['leoelements']['parse_post_css_code'].'.css';
// echo '<pre>' . "\n";
// var_dump($uri);
// echo '</pre>' . "\n";
// die();
// if ((file_exists(_PS_THEME_DIR_.$uri) && filesize(_PS_THEME_DIR_.$uri)) || (file_exists(_PS_THEME_DIR_.'assets/css/'.$uri) && filesize(_PS_THEME_DIR_.'assets/css/'.$uri))) {
// echo '<link class="load_font_frontend" rel="'.$this->profile_css_folder.$GLOBALS['leoelements']['parse_post_css_code'].'.css'.'" href="" type="text/css" media="all">';
// }
$uri = 'modules/leoelements/views/css/'.$GLOBALS['leoelements']['parse_post_css_code'].'.css';
if (file_exists(_PS_THEME_DIR_.$uri)) {
$fonts_url = sprintf( _PS_BASE_URL_SSL_.__PS_BASE_URI__.'themes/'._THEME_NAME_.'/' . $uri);
echo '<link class="load_font_frontend" rel="stylesheet" href="'.$fonts_url.'" type="text/css" media="all">';
}
// echo '<style>' . $content . '</style>';
// echo "
//<style>@font-face {
//font-family:'{$mldfont['font_family']}';
//font-style:'{$mldfont['font_style']}';
//font-weight:'{$mldfont['font_weight']}';
//src:local('{$mldfont['font_family']}'),url($fonts_url) format('woff');}</style>";
}
}
}
if ( ! empty( $google_fonts['early'] ) ) {
foreach ( $google_fonts['early'] as $current_font ) {
$google_fonts_index++;
//printf( '<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/earlyaccess/%s.css">', strtolower( str_replace( ' ', '', $current_font ) ) );
$font_url = sprintf( 'https://fonts.googleapis.com/earlyaccess/%s.css', strtolower( str_replace( ' ', '', $current_font ) ) );
Leo_Helper::wp_enqueue_style( 'google-earlyaccess-' . $google_fonts_index, $font_url ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion
}
}
}
// private function enqueue_upload_fonts( $google_fonts = [] ) {
// static $google_fonts_index = 0;
//
// $print_google_fonts = true;
//
// /**
// * Print frontend google fonts.
// *
// * Filters whether to enqueue Google fonts in the frontend.
// *
// * @since 1.0.0
// *
// * @param bool $print_google_fonts Whether to enqueue Google fonts. Default is true.
// */
// $print_google_fonts = Leo_Helper::apply_filters( 'elementor/frontend/print_google_fonts', $print_google_fonts );
//
// if ( ! $print_google_fonts ) {
// return;
// }
//
// // Print used fonts
// if ( ! empty( $google_fonts['google'] ) ) {
// $google_fonts_index++;
//
// foreach ( $google_fonts['google'] as &$font ) {
// $font = str_replace( ' ', '+', $font ) . ':100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic';
// }
//
// $fonts_url = sprintf( 'https://fonts.googleapis.com/css?family=%s', implode( rawurlencode( '|' ), $google_fonts['google'] ) );
//
// $subsets = [
// 'ru_RU' => 'cyrillic',
// 'bg_BG' => 'cyrillic',
// 'he_IL' => 'hebrew',
// 'el' => 'greek',
// 'vi' => 'vietnamese',
// 'uk' => 'cyrillic',
// 'cs_CZ' => 'latin-ext',
// 'ro_RO' => 'latin-ext',
// 'pl_PL' => 'latin-ext',
// ];
//
// $locale= \Context::getContext()->language->iso_code;
//
// if ( isset( $subsets[ $locale ] ) ) {
// $fonts_url .= '&subset=' . $subsets[ $locale ];
// }
//
// echo '<link rel="stylesheet" href="' . $fonts_url . '" type="text/css" media="all">'; // phpcs:ignore
// }
//
// if ( ! empty( $google_fonts['early'] ) ) {
// foreach ( $google_fonts['early'] as $current_font ) {
// $google_fonts_index++;
//
// //printf( '<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/earlyaccess/%s.css">', strtolower( str_replace( ' ', '', $current_font ) ) );
//
// $font_url = sprintf( 'https://fonts.googleapis.com/earlyaccess/%s.css', strtolower( str_replace( ' ', '', $current_font ) ) );
//
// Leo_Helper::wp_enqueue_style( 'google-earlyaccess-' . $google_fonts_index, $font_url ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion
// }
// }
//
// }
/**
* Enqueue fonts.
*
* Enqueue all the frontend fonts.
*
* @since 1.2.0
* @access public
*
* @param array $font Fonts to enqueue in the frontend.
*/
public function enqueue_font( $font ) {
if ( in_array( $font, $this->registered_fonts ) ) {
return;
}
$this->fonts_to_enqueue[] = $font;
$this->registered_fonts[] = $font;
$this->print_fonts_links();
}
/**
* Parse global CSS.
*
* Enqueue the global CSS file.
*
* @since 1.2.0
* @access protected
*/
public function parse_global_css_code() {
$scheme_css_file = Global_CSS::create( 'global.css' );
ob_start();
$scheme_css_file->enqueue();
return ob_get_clean();
}
/**
* Parse global CSS.
*
* Enqueue the global CSS file.
*
* @since 1.2.0
* @access protected
*/
public function parse_post_css_code( $id_post ) {
$GLOBALS['leoelements']['parse_post_css_code'] = $id_post;
$css_file = Post_CSS::create( $id_post );
ob_start();
if( \Tools::getValue( 'wp_preview' ) == Leo_Helper::$id_post ){
$css_file->print_css();
}else{
$css_file->enqueue();
}
return ob_get_clean();
}
/**
* Apply builder in content.
*
* Used to apply the Elementor page editor on the post content.
*
* @since 1.0.0
* @access public
*
* @param string $content The post content.
*
* @return string The post content.
*/
public function apply_builder_in_content( $content ) {
$this->restore_content_filters();
if ( Plugin::$instance->preview->is_preview_mode() || $this->_is_excerpt ) {
return $content;
}
// Remove the filter itself in order to allow other `the_content` in the elements
$this->remove_content_filter();
$post_id = Leo_Helper::get_the_ID();
$builder_content = $this->get_builder_content( $post_id );
if ( ! empty( $builder_content ) ) {
$content = $builder_content;
$this->remove_content_filters();
}
// Add the filter again for other `the_content` calls
$this->add_content_filter();
return $content;
}
/**
* Retrieve builder content.
*
* Used to render and return the post content with all the Elementor elements.
*
* Note that this method is an internal method, please use `get_builder_content_for_display()`.
*
* @since 1.0.0
* @access public
*
* @param int $post_id The post ID.
* @param bool $with_css Optional. Whether to retrieve the content with CSS
* or not. Default is false.
*
* @return string The post content.
*/
public function get_builder_content( $post_id, $with_css = false ) {
$document = Plugin::$instance->documents->get_doc_for_frontend( $post_id );
$data = $document->get_elements_data();
/**
* Frontend builder content data.
*
* Filters the builder content in the frontend.
*
* @since 1.0.0
*
* @param array $data The builder content.
* @param int $post_id The post ID.
*/
$data = Leo_Helper::apply_filters( 'elementor/frontend/builder_content_data', $data, $post_id );
ob_start();
if ( $with_css ) {
$css_file = Post_CSS::create( $post_id );
$css_file->print_css();
}
$document->print_elements_with_wrapper( $data );
$content = ob_get_clean();
/**
* Frontend content.
*
* Filters the content in the frontend.
*
* @since 1.0.0
*
* @param string $content The content.
*/
$content = Leo_Helper::apply_filters( 'elementor/frontend/the_content', $content );
return $content;
}
/**
* Add Elementor menu to admin bar.
*
* Add new admin bar item only on singular pages, to display a link that
* allows the user to edit with Elementor.
*
* Fired by `admin_bar_menu` action.
*
* @since 1.3.4
* @access public
*
* @param \WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference.
*/
public function add_menu_in_admin_bar( \WP_Admin_Bar $wp_admin_bar ) {
if ( empty( $this->admin_bar_edit_documents ) ) {
return;
}
$queried_object_id = get_queried_object_id();
$menu_args = [
'id' => 'elementor_edit_page',
'title' => Leo_Helper::__( 'Edit with Elementor', 'elementor' ),
];
if ( Leo_Helper::is_singular() && isset( $this->admin_bar_edit_documents[ $queried_object_id ] ) ) {
$menu_args['href'] = $this->admin_bar_edit_documents[ $queried_object_id ]->get_edit_url();
unset( $this->admin_bar_edit_documents[ $queried_object_id ] );
}
$wp_admin_bar->add_node( $menu_args );
foreach ( $this->admin_bar_edit_documents as $document ) {
$wp_admin_bar->add_menu( [
'id' => 'elementor_edit_doc_' . $document->get_main_id(),
'parent' => 'elementor_edit_page',
'title' => sprintf( '<span class="elementor-edit-link-title">%s</span><span class="elementor-edit-link-type">%s</span>', $document->get_post()->post_title, $document::get_title() ),
'href' => $document->get_edit_url(),
] );
}
}
/**
* Retrieve builder content for display.
*
* Used to render and return the post content with all the Elementor elements.
*
* @since 1.0.0
* @access public
*
* @param int $post_id The post ID.
*
* @param bool $with_css Optional. Whether to retrieve the content with CSS
* or not. Default is false.
*
* @return string The post content.
*/
public function get_builder_content_for_display( $post_id, $with_css = false ) {
if ( ! get_post( $post_id ) ) {
return '';
}
$editor = Plugin::$instance->editor;
// Avoid recursion
if ( Leo_Helper::get_the_ID() === (int) $post_id ) {
$content = '';
if ( $editor->is_edit_mode() ) {
$content = '<div class="elementor-alert elementor-alert-danger">' . Leo_Helper::__( 'Invalid Data: The Template ID cannot be the same as the currently edited template. Please choose a different one.', 'elementor' ) . '</div>';
}
return $content;
}
// Set edit mode as false, so don't render settings and etc. use the $is_edit_mode to indicate if we need the CSS inline
$is_edit_mode = $editor->is_edit_mode();
$editor->set_edit_mode( false );
$with_css = $with_css ? true : $is_edit_mode;
$content = $this->get_builder_content( $post_id, $with_css );
// Restore edit mode state
Plugin::$instance->editor->set_edit_mode( $is_edit_mode );
return $content;
}
/**
* Start excerpt flag.
*
* Flags when `the_excerpt` is called. Used to avoid enqueueing CSS in the excerpt.
*
* @since 1.4.3
* @access public
*
* @param string $excerpt The post excerpt.
*
* @return string The post excerpt.
*/
public function start_excerpt_flag( $excerpt ) {
$this->_is_excerpt = true;
return $excerpt;
}
/**
* End excerpt flag.
*
* Flags when `the_excerpt` call ended.
*
* @since 1.4.3
* @access public
*
* @param string $excerpt The post excerpt.
*
* @return string The post excerpt.
*/
public function end_excerpt_flag( $excerpt ) {
$this->_is_excerpt = false;
return $excerpt;
}
/**
* Remove content filters.
*
* Remove WordPress default filters that conflicted with Elementor.
*
* @since 1.5.0
* @access public
*/
public function remove_content_filters() {
$filters = [
'wpautop',
'shortcode_unautop',
'wptexturize',
];
foreach ( $filters as $filter ) {
// Check if another plugin/theme do not already removed the filter.
if ( has_filter( 'the_content', $filter ) ) {
remove_filter( 'the_content', $filter );
$this->content_removed_filters[] = $filter;
}
}
}
/**
* Has Elementor In Page
*
* Determine whether the current page is using Elementor.
*
* @since 2.0.9
*
* @access public
* @return bool
*/
public function has_elementor_in_page() {
return $this->_has_elementor_in_page;
}
/**
* Get Init Settings
*
* Used to define the default/initial settings of the object. Inheriting classes may implement this method to define
* their own default/initial settings.
*
* @since 1.0.0
*
* @access protected
* @return array
*/
public function get_init_settings() {
$is_preview_mode = Leo_Helper::is_preview_mode();
$settings = [
'environmentMode' => [
'edit' => $is_preview_mode,
'wpPreview' => true,
],
'is_rtl' => Leo_Helper::is_rtl(),
'breakpoints' => Responsive::get_breakpoints(),
'version' => LEOELEMENTS_VERSION,
'urls' => [
'assets' => LEOELEMENTS_ASSETS_URL,
],
];
$settings['settings'] = SettingsManager::get_settings_frontend_config();
$empty_object = (object) [];
if ( $is_preview_mode ) {
$settings['elements'] = [
'data' => $empty_object,
'editSettings' => $empty_object,
'keys' => $empty_object,
];
}
return $settings;
}
/**
* Restore content filters.
*
* Restore removed WordPress filters that conflicted with Elementor.
*
* @since 1.5.0
* @access private
*/
private function restore_content_filters() {
foreach ( $this->content_removed_filters as $filter ) {
Leo_Helper::add_filter( 'the_content', $filter );
}
$this->content_removed_filters = [];
}
/**
* Process More Tag
*
* Respect the native WP (<!--more-->) tag
*
* @access private
* @since 2.0.4
*
* @param $content
*
* @return string
*/
private function process_more_tag( $content ) {
$post = get_post();
$content = str_replace( '&lt;!--more--&gt;', '<!--more-->', $content );
$parts = get_extended( $content );
if ( empty( $parts['extended'] ) ) {
return $content;
}
if ( Leo_Helper::is_singular() ) {
return $parts['main'] . '<div id="more-' . $post->ID . '"></div>' . $parts['extended'];
}
if ( empty( $parts['more_text'] ) ) {
$parts['more_text'] = Leo_Helper::__( '(more&hellip;)', 'elementor' );
}
$more_link_text = sprintf(
'<span aria-label="%1$s">%2$s</span>',
sprintf(
/* translators: %s: Name of current post */
Leo_Helper::__( 'Continue reading %s', 'elementor' ),
the_title_attribute( [
'echo' => false,
] )
),
$parts['more_text']
);
$more_link = Leo_Helper::apply_filters( 'the_content_more_link', sprintf( ' <a href="%s#more-%s" class="more-link elementor-more-link">%s</a>', get_permalink(), $post->ID, $more_link_text ), $more_link_text );
return force_balance_tags( $parts['main'] ) . $more_link;
}
}