512 lines
13 KiB
PHP
512 lines
13 KiB
PHP
<?php
|
|
|
|
namespace Essential_Addons_Elementor\Classes;
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
} // Exit if accessed directly
|
|
use Elementor\Core\Files\CSS\Post as Post_CSS;
|
|
use Elementor\Plugin;
|
|
use Essential_Addons_Elementor\Classes\Elements_Manager;
|
|
use Essential_Addons_Elementor\Traits\Library;
|
|
|
|
class Asset_Builder {
|
|
|
|
/**
|
|
* @theTraitAnnotation Library
|
|
*/
|
|
use Library;
|
|
|
|
/**
|
|
* Post ID
|
|
* @var int
|
|
*/
|
|
protected $post_id;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $custom_js = '';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $css_strings = '';
|
|
|
|
/**
|
|
* @var \Essential_Addons_Elementor\Classes\Elements_Manager
|
|
*/
|
|
protected $elements_manager;
|
|
|
|
/**
|
|
* @var false|mixed|string|void
|
|
*/
|
|
protected $css_print_method = '';
|
|
|
|
/**
|
|
* @var false|mixed|string|void
|
|
*/
|
|
protected $js_print_method = '';
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $registered_elements;
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $registered_extensions;
|
|
|
|
/**
|
|
* @var object
|
|
*/
|
|
protected $localize_objects;
|
|
|
|
/**
|
|
* @var int|int[]|mixed|string[]
|
|
*/
|
|
protected $custom_js_enable;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
protected $main_page;
|
|
|
|
/**
|
|
* construct
|
|
*
|
|
* @param array $registered_elements
|
|
* @param array $registered_extensions
|
|
*/
|
|
public function __construct( $registered_elements, $registered_extensions ) {
|
|
|
|
$this->registered_elements = $registered_elements;
|
|
$this->registered_extensions = $registered_extensions;
|
|
$this->elements_manager = new Elements_Manager( $this->registered_elements, $this->registered_extensions );
|
|
$this->elements_manager->css_print_method = $this->css_print_method = get_option( 'elementor_css_print_method' );
|
|
$this->elements_manager->js_print_method = $this->js_print_method = get_option( 'eael_js_print_method' );
|
|
|
|
$this->init_hook();
|
|
|
|
$this->custom_js_enable = $this->get_settings( 'custom-js' );
|
|
|
|
}
|
|
|
|
/**
|
|
* init_hook
|
|
* Load Hook
|
|
*/
|
|
protected function init_hook() {
|
|
add_action( 'wp_footer', [ $this, 'add_inline_js' ], 100 );
|
|
add_action( 'wp_footer', [ $this, 'add_inline_css' ], 15 );
|
|
add_action( 'after_delete_post', [ $this, 'delete_cache_data' ] );
|
|
|
|
add_action( 'wp_enqueue_scripts', [ $this, 'frontend_asset_load' ], 100 );
|
|
add_action( 'elementor/frontend/before_enqueue_styles', [ $this, 'ea_before_enqueue_styles' ] );
|
|
add_action( 'elementor/theme/register_locations', [ $this, 'load_asset_per_location' ], 20 );
|
|
add_filter( 'elementor/files/file_name', [ $this, 'load_asset_per_file' ] );
|
|
}
|
|
|
|
/**
|
|
* frontend_asset_load
|
|
* Load asset as per condition
|
|
* @return false|void
|
|
*/
|
|
public function frontend_asset_load() {
|
|
$handle = 'eael';
|
|
$this->post_id = get_the_ID();
|
|
|
|
$this->elements_manager->get_element_list( $this->post_id );
|
|
$this->load_commnon_asset();
|
|
$this->register_script();
|
|
|
|
if ( ! $this->is_edit() ) {
|
|
wp_enqueue_script( 'eael-general' );
|
|
wp_enqueue_style( 'eael-general' );
|
|
$handle = 'eael-general';
|
|
$this->load_custom_js( $this->post_id );
|
|
} else {
|
|
$elements = $this->get_settings();
|
|
|
|
if ( empty( $elements ) ) {
|
|
return false;
|
|
}
|
|
|
|
if ( $this->js_print_method == 'internal' ) {
|
|
wp_enqueue_script( 'eael-general' );
|
|
}
|
|
|
|
if ( $this->css_print_method == 'internal' ) {
|
|
wp_enqueue_style( 'eael-general' );
|
|
}
|
|
|
|
do_action( 'eael/before_enqueue_styles', $elements );
|
|
do_action( 'eael/before_enqueue_scripts', $elements );
|
|
|
|
$this->enqueue_asset( null, $elements, 'edit' );
|
|
$this->load_custom_js( $this->post_id );
|
|
}
|
|
|
|
wp_localize_script( $handle, 'localize', $this->localize_objects );
|
|
}
|
|
|
|
/**
|
|
* ea_before_enqueue_styles
|
|
* @return false|void
|
|
*/
|
|
public function ea_before_enqueue_styles() {
|
|
|
|
if ( $this->is_edit() ) {
|
|
return false;
|
|
}
|
|
|
|
$this->post_id = get_the_ID();
|
|
$this->set_main_page( $this->post_id );
|
|
$this->elements_manager->get_element_list( $this->post_id );
|
|
$elements = get_post_meta( $this->post_id, '_eael_widget_elements', true );
|
|
|
|
if ( ! empty( $elements ) ) {
|
|
$this->enqueue_asset( $this->post_id, $elements );
|
|
}
|
|
|
|
if ( ! $this->main_page ) {
|
|
$this->load_custom_js( $this->post_id );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* load_asset_per_location
|
|
*
|
|
* @param $instance
|
|
*
|
|
* @return false|void
|
|
*/
|
|
public function load_asset_per_location( $instance ) {
|
|
|
|
if ( is_admin() || ! ( class_exists( 'ElementorPro\Modules\ThemeBuilder\Module' ) ) ) {
|
|
return false;
|
|
}
|
|
|
|
$locations = $instance->get_locations();
|
|
|
|
foreach ( $locations as $location => $settings ) {
|
|
|
|
$documents = \ElementorPro\Modules\ThemeBuilder\Module::instance()->get_conditions_manager()->get_documents_for_location( $location );
|
|
foreach ( $documents as $document ) {
|
|
$post_id = $document->get_post()->ID;
|
|
|
|
$this->post_id = $post_id;
|
|
$this->set_main_page( $this->post_id );
|
|
$this->elements_manager->get_element_list( $this->post_id );
|
|
$elements = get_post_meta( $this->post_id, '_eael_widget_elements', true );
|
|
|
|
if ( ! empty( $elements ) ) {
|
|
do_action( 'eael/before_enqueue_styles', $elements );
|
|
do_action( 'eael/before_enqueue_scripts', $elements );
|
|
$this->enqueue_asset( $this->post_id, $elements );
|
|
}
|
|
|
|
if ( ! $this->main_page ) {
|
|
$this->load_custom_js( $this->post_id );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* load_asset_per_file
|
|
* @param $file_name
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function load_asset_per_file( $file_name ) {
|
|
|
|
if( empty( $file_name ) ){
|
|
return $file_name;
|
|
}
|
|
|
|
$post_id = preg_replace( '/[^0-9]/', '', $file_name );
|
|
|
|
if ( $post_id < 1 ) {
|
|
return $file_name;
|
|
}
|
|
|
|
$this->post_id = $post_id;
|
|
$type = get_post_meta( $this->post_id, '_elementor_template_type', true );
|
|
$template_list = ['popup'];
|
|
|
|
$this->set_main_page( $this->post_id );
|
|
$this->elements_manager->get_element_list( $this->post_id );
|
|
$elements = get_post_meta( $this->post_id, '_eael_widget_elements', true );
|
|
|
|
if ( ! empty( $elements ) ) {
|
|
do_action( 'eael/before_enqueue_styles', $elements );
|
|
do_action( 'eael/before_enqueue_scripts', $elements );
|
|
$this->enqueue_asset( $this->post_id, $elements );
|
|
}
|
|
|
|
if ( ! $this->main_page ) {
|
|
$this->load_custom_js( $this->post_id );
|
|
}
|
|
|
|
return $file_name;
|
|
}
|
|
|
|
/**
|
|
* add_inline_js
|
|
* Load inline js data
|
|
*/
|
|
public function add_inline_js() {
|
|
|
|
if ( $this->is_edit_mode() || $this->is_preview_mode() ) {
|
|
if ( $this->custom_js ) {
|
|
printf( '<script>%1$s</script>', 'var localize =' . wp_json_encode( $this->localize_objects ) );
|
|
printf( '<script id="eael-inline-js">%s</script>', $this->custom_js );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* add_inline_css
|
|
* Load inline css file
|
|
*/
|
|
public function add_inline_css() {
|
|
if ( $this->is_edit_mode() || $this->is_preview_mode() ) {
|
|
if ( $this->css_strings ) {
|
|
printf( '<style id="eael-inline-css">%s</style>', $this->css_strings );
|
|
}
|
|
}
|
|
}
|
|
|
|
public function register_script() {
|
|
$css_deps = [ 'elementor-frontend' ];
|
|
$js_deps = [ 'jquery' ];
|
|
$theme = wp_get_theme(); // gets the current theme
|
|
if ( in_array( 'Hello Elementor', [ $theme->name, $theme->parent_theme ] ) ) {
|
|
array_unshift( $css_deps, 'hello-elementor-theme-style' );
|
|
} elseif ( in_array( 'Astra', [ $theme->name, $theme->parent_theme ] ) ) {
|
|
array_unshift( $css_deps, 'astra-theme-css' );
|
|
} elseif ( in_array( 'XStore', [ $theme->name, $theme->parent_theme ] ) ) {
|
|
$js_deps[] = 'etheme';
|
|
}
|
|
|
|
if ( class_exists( 'Cartflows_Loader' ) && wcf()->utils->is_step_post_type() ) {
|
|
$css_deps = [ 'elementor-frontend' ];
|
|
}
|
|
|
|
wp_register_script( 'eael-general', EAEL_PLUGIN_URL . 'assets/front-end/js/view/general.min.js', $js_deps, EAEL_PLUGIN_VERSION, true );
|
|
wp_register_style( 'eael-general', EAEL_PLUGIN_URL . "assets/front-end/css/view/general.min.css", $css_deps, EAEL_PLUGIN_VERSION );
|
|
}
|
|
|
|
/**
|
|
* load_common_asset
|
|
* Load common asset file
|
|
*/
|
|
public function load_commnon_asset() {
|
|
wp_register_style(
|
|
'font-awesome-5-all',
|
|
ELEMENTOR_ASSETS_URL . 'lib/font-awesome/css/all.min.css',
|
|
false,
|
|
EAEL_PLUGIN_VERSION
|
|
);
|
|
|
|
wp_register_style(
|
|
'font-awesome-4-shim',
|
|
ELEMENTOR_ASSETS_URL . 'lib/font-awesome/css/v4-shims.min.css',
|
|
false,
|
|
EAEL_PLUGIN_VERSION
|
|
);
|
|
|
|
wp_register_script(
|
|
'font-awesome-4-shim',
|
|
ELEMENTOR_ASSETS_URL . 'lib/font-awesome/js/v4-shims.min.js',
|
|
false,
|
|
EAEL_PLUGIN_VERSION
|
|
);
|
|
|
|
// register reading progress assets
|
|
wp_register_style(
|
|
'eael-reading-progress',
|
|
EAEL_PLUGIN_URL . 'assets/front-end/css/view/reading-progress.min.css',
|
|
false,
|
|
EAEL_PLUGIN_VERSION
|
|
);
|
|
|
|
wp_register_script(
|
|
'eael-reading-progress',
|
|
EAEL_PLUGIN_URL . 'assets/front-end/js/view/reading-progress.min.js',
|
|
[ 'jquery' ],
|
|
EAEL_PLUGIN_VERSION
|
|
);
|
|
|
|
// register Table of contents assets
|
|
wp_register_style(
|
|
'eael-table-of-content',
|
|
EAEL_PLUGIN_URL . 'assets/front-end/css/view/table-of-content.min.css',
|
|
false,
|
|
EAEL_PLUGIN_VERSION
|
|
);
|
|
|
|
wp_register_script(
|
|
'eael-table-of-content',
|
|
EAEL_PLUGIN_URL . 'assets/front-end/js/view/table-of-content.min.js',
|
|
[ 'jquery' ],
|
|
EAEL_PLUGIN_VERSION
|
|
);
|
|
|
|
// register scroll to top assets
|
|
wp_register_style(
|
|
'eael-scroll-to-top',
|
|
EAEL_PLUGIN_URL . 'assets/front-end/css/view/scroll-to-top.min.css',
|
|
false,
|
|
EAEL_PLUGIN_VERSION
|
|
);
|
|
|
|
wp_register_script(
|
|
'eael-scroll-to-top',
|
|
EAEL_PLUGIN_URL . 'assets/front-end/js/view/scroll-to-top.min.js',
|
|
[ 'jquery' ],
|
|
EAEL_PLUGIN_VERSION
|
|
);
|
|
|
|
// localize object
|
|
$this->localize_objects = apply_filters( 'eael/localize_objects', [
|
|
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
|
'nonce' => wp_create_nonce( 'essential-addons-elementor' ),
|
|
'i18n' => [
|
|
'added' => __( 'Added ', 'essential-addons-for-elementor-lite' ),
|
|
'compare' => __( 'Compare', 'essential-addons-for-elementor-lite' ),
|
|
'loading' => esc_html__( 'Loading...', 'essential-addons-for-elementor-lite' )
|
|
],
|
|
'eael_translate_text' => [
|
|
'required_text' => esc_html__( 'is a required field', 'essential-addons-for-elementor-lite' ),
|
|
'invalid_text' => esc_html__( 'Invalid', 'essential-addons-for-elementor-lite' ),
|
|
'billing_text' => esc_html__( 'Billing', 'essential-addons-for-elementor-lite' ),
|
|
'shipping_text' => esc_html__( 'Shipping', 'essential-addons-for-elementor-lite' ),
|
|
'fg_mfp_counter_text' => apply_filters( 'eael/filterble-gallery/mfp-counter-text', __( 'of', 'essential-addons-for-elementor-lite' ) ),
|
|
],
|
|
'page_permalink' => get_the_permalink(),
|
|
'cart_redirectition' => get_option( 'woocommerce_cart_redirect_after_add' ),
|
|
'cart_page_url' => function_exists( 'wc_get_cart_url' ) ? wc_get_cart_url() : '',
|
|
'el_breakpoints' => method_exists( Plugin::$instance->breakpoints, 'get_breakpoints_config' ) ? Plugin::$instance->breakpoints->get_breakpoints_config() : '',
|
|
] );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* enqueue_asset
|
|
*
|
|
* @param int $post_id
|
|
* @param array $elements
|
|
* @param string $context
|
|
*/
|
|
public function enqueue_asset( $post_id = null, $elements = [], $context = 'view' ) {
|
|
$dynamic_asset_id = ( $post_id ? '-' . $post_id : '' );
|
|
|
|
if ( $this->css_print_method == 'internal' ) {
|
|
$this->css_strings .= $this->elements_manager->generate_strings( $elements, $context, 'css' );
|
|
} else {
|
|
if ( ! $this->has_asset( $post_id, 'css' ) ) {
|
|
$this->elements_manager->generate_script( $post_id, $elements, $context, 'css' );
|
|
}
|
|
|
|
wp_enqueue_style(
|
|
'eael' . $dynamic_asset_id,
|
|
$this->safe_url( EAEL_ASSET_URL . '/' . 'eael' . $dynamic_asset_id . '.css' ),
|
|
[ 'eael-general' ],
|
|
get_post_modified_time()
|
|
);
|
|
}
|
|
|
|
if ( $this->js_print_method == 'internal' ) {
|
|
$this->custom_js .= $this->elements_manager->generate_strings( $elements, $context, 'js' );
|
|
} else {
|
|
if ( ! $this->has_asset( $post_id, 'js' ) ) {
|
|
$this->elements_manager->generate_script( $post_id, $elements, $context, 'js' );
|
|
}
|
|
|
|
wp_enqueue_script(
|
|
'eael' . $dynamic_asset_id,
|
|
$this->safe_url( EAEL_ASSET_URL . '/' . 'eael' . $dynamic_asset_id . '.js' ),
|
|
[ 'eael-general' ],
|
|
get_post_modified_time(),
|
|
true
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* delete_cache_data
|
|
*
|
|
* @param int $post_id
|
|
*/
|
|
public function delete_cache_data( $post_id ) {
|
|
$this->elements_manager->remove_files( $post_id );
|
|
|
|
delete_post_meta( $post_id, '_eael_custom_js' );
|
|
delete_post_meta( $post_id, '_eael_widget_elements' );
|
|
}
|
|
|
|
/**
|
|
* has_asset
|
|
*
|
|
* @param int $post_id
|
|
* @param string $file
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function has_asset( $post_id, $file = 'css' ) {
|
|
if ( file_exists( $this->safe_path( EAEL_ASSET_PATH . '/' . 'eael' . ( $post_id ? '-' . $post_id : '' ) . '.' . $file ) ) ) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public function load_custom_js( $post_id ) {
|
|
static $post_ids_array = [];
|
|
|
|
if ( in_array( $post_id, $post_ids_array ) ) {
|
|
return false;
|
|
}
|
|
|
|
$post_ids_array[] = $post_id;
|
|
|
|
if ( ! $this->custom_js_enable ) {
|
|
return false;
|
|
}
|
|
|
|
$custom_js = get_post_meta( $post_id, '_eael_custom_js', true );
|
|
if ( $custom_js ) {
|
|
// add semicolon if someone misses adding this in custom js code .
|
|
$this->custom_js .= $custom_js.';';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* is_edit
|
|
* check is edit page
|
|
* @return bool
|
|
*/
|
|
public function is_edit() {
|
|
return (
|
|
Plugin::instance()->editor->is_edit_mode() ||
|
|
Plugin::instance()->preview->is_preview_mode() ||
|
|
is_preview()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* set_main_page
|
|
*
|
|
* @param $post_id
|
|
*/
|
|
protected function set_main_page( $post_id ) {
|
|
$this->main_page = get_post_meta( $post_id, '_elementor_template_type', true ) == 'wp-page';
|
|
}
|
|
|
|
}
|