1137 lines
36 KiB
PHP
1137 lines
36 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Class for Export/Import logic.
|
||
|
*
|
||
|
* @package ThemeIsle
|
||
|
*/
|
||
|
|
||
|
namespace ThemeIsle\GutenbergBlocks;
|
||
|
|
||
|
use ThemeIsle\GutenbergBlocks\Main, ThemeIsle\GutenbergBlocks\Pro, ThemeIsle\GutenbergBlocks\Plugins\Stripe_API;
|
||
|
use ThemeIsle\GutenbergBlocks\Plugins\LimitedOffers;
|
||
|
|
||
|
/**
|
||
|
* Class Registration.
|
||
|
*/
|
||
|
class Registration {
|
||
|
|
||
|
/**
|
||
|
* The main instance var.
|
||
|
*
|
||
|
* @var Registration|null
|
||
|
*/
|
||
|
public static $instance = null;
|
||
|
|
||
|
/**
|
||
|
* Flag to list all the blocks.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
public static $blocks = array();
|
||
|
|
||
|
/**
|
||
|
* Flag to list all the blocks dependencies.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
public static $block_dependencies = array();
|
||
|
|
||
|
/**
|
||
|
* The ids of the used widgets in the page.
|
||
|
*
|
||
|
* @var array<string>
|
||
|
*/
|
||
|
public static $widget_used = array(); // TODO: Monitor all the rendered widgets and enqueue the assets.
|
||
|
|
||
|
/**
|
||
|
* Flag to mark that the scripts which have loaded.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
public static $scripts_loaded = array(
|
||
|
'circle-counter' => false,
|
||
|
'countdown' => false,
|
||
|
'form' => false,
|
||
|
'google-map' => false,
|
||
|
'leaflet-map' => false,
|
||
|
'lottie' => false,
|
||
|
'slider' => false,
|
||
|
'sticky' => false,
|
||
|
'tabs' => false,
|
||
|
'popup' => false,
|
||
|
'progress-bar' => false,
|
||
|
'accordion' => false,
|
||
|
'condition_hide_on' => false,
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
* Flag to mark that the styles which have loaded.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
public static $styles_loaded = array();
|
||
|
|
||
|
/**
|
||
|
* Flag to mark that the FA has been loaded.
|
||
|
*
|
||
|
* @var bool $is_fa_loaded Is FA loaded?
|
||
|
*/
|
||
|
public static $is_fa_loaded = false;
|
||
|
|
||
|
/**
|
||
|
* Initialize the class
|
||
|
*/
|
||
|
public function init() {
|
||
|
add_filter( 'block_categories_all', array( $this, 'block_categories' ), 11, 2 );
|
||
|
add_action( 'init', array( $this, 'register_blocks' ) );
|
||
|
add_action( 'init', array( $this, 'init_amp_blocks' ) );
|
||
|
add_action( 'enqueue_block_assets', array( $this, 'enqueue_assets' ), 1 );
|
||
|
add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_block_editor_assets' ) ); // Don't change the priority or else Blocks CSS will stop working.
|
||
|
add_action( 'enqueue_block_assets', array( $this, 'enqueue_block_assets' ) );
|
||
|
add_filter( 'render_block', array( $this, 'load_sticky' ), 900, 2 );
|
||
|
add_filter( 'render_block', array( $this, 'subscribe_fa' ), 10, 2 );
|
||
|
add_filter( 'dynamic_sidebar_params', array( $this, 'watch_used_widgets' ), 9999 );
|
||
|
add_filter( 'render_block', array( $this, 'load_condition_hide_on_styles' ), 10, 2 );
|
||
|
|
||
|
add_action(
|
||
|
'wp_footer',
|
||
|
static function () {
|
||
|
if ( Registration::$is_fa_loaded ) {
|
||
|
wp_enqueue_style( 'font-awesome-5' );
|
||
|
wp_enqueue_style( 'font-awesome-4-shims' );
|
||
|
}
|
||
|
},
|
||
|
11
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register our custom block category.
|
||
|
*
|
||
|
* @param array $categories All categories.
|
||
|
* @param \WP_Block_Editor_Context $block_editor_context The current block editor context.
|
||
|
*
|
||
|
* @return mixed
|
||
|
* @since 2.0.0
|
||
|
* @access public
|
||
|
* @link https://wordpress.org/gutenberg/handbook/extensibility/extending-blocks/#managing-block-categories
|
||
|
*/
|
||
|
public function block_categories( $categories, $block_editor_context ) {
|
||
|
return array_merge(
|
||
|
array(
|
||
|
array(
|
||
|
'slug' => 'themeisle-blocks',
|
||
|
'title' => __( 'Otter', 'otter-blocks' ),
|
||
|
),
|
||
|
array(
|
||
|
'slug' => 'themeisle-woocommerce-blocks',
|
||
|
'title' => __( 'WooCommerce Builder by Otter', 'otter-blocks' ),
|
||
|
),
|
||
|
),
|
||
|
$categories
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get block metadata from file.
|
||
|
*
|
||
|
* @param string $metadata_file Metadata file link.
|
||
|
*
|
||
|
* @return mixed
|
||
|
* @since 2.0.0
|
||
|
* @access public
|
||
|
*/
|
||
|
public function get_metadata( $metadata_file ) {
|
||
|
if ( ! file_exists( $metadata_file ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$metadata = array();
|
||
|
|
||
|
if ( function_exists( 'wpcom_vip_file_get_contents' ) ) {
|
||
|
$metadata = json_decode( wpcom_vip_file_get_contents( $metadata_file ), true );
|
||
|
} else {
|
||
|
$metadata = json_decode( file_get_contents( $metadata_file ), true ); // phpcs:ignore WordPressVIPMinimum.Performance.FetchingRemoteData.FileGetContentsUnknown
|
||
|
}
|
||
|
|
||
|
if ( ! is_array( $metadata ) || empty( $metadata['name'] ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return $metadata;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register scripts for blocks.
|
||
|
*
|
||
|
* @since 2.0.0
|
||
|
* @access public
|
||
|
*/
|
||
|
public function enqueue_assets() {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/blocks.asset.php';
|
||
|
wp_register_style( 'font-awesome-5', OTTER_BLOCKS_URL . 'assets/fontawesome/css/all.min.css', [], $asset_file['version'] );
|
||
|
wp_register_style( 'font-awesome-4-shims', OTTER_BLOCKS_URL . 'assets/fontawesome/css/v4-shims.min.css', [], $asset_file['version'] );
|
||
|
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/leaflet-map.asset.php';
|
||
|
wp_register_script( 'leaflet', OTTER_BLOCKS_URL . 'assets/leaflet/leaflet.js', [], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'leaflet', 'async', true );
|
||
|
wp_register_script( 'leaflet-gesture-handling', OTTER_BLOCKS_URL . 'build/blocks/leaflet-gesture-handling.js', array( 'leaflet' ), $asset_file['version'], true );
|
||
|
wp_script_add_data( 'leaflet-gesture-handling', 'defer', true );
|
||
|
|
||
|
wp_register_style( 'leaflet', OTTER_BLOCKS_URL . 'assets/leaflet/leaflet.css', [], $asset_file['version'] );
|
||
|
wp_style_add_data( 'leaflet', 'path', OTTER_BLOCKS_PATH . '/assets/leaflet/leaflet.css' );
|
||
|
wp_register_style( 'leaflet-gesture-handling', OTTER_BLOCKS_URL . 'assets/leaflet/leaflet-gesture-handling.min.css', [], $asset_file['version'] );
|
||
|
wp_style_add_data( 'leaflet-gesture-handling', 'path', OTTER_BLOCKS_PATH . '/assets/leaflet/leaflet-gesture-handling.min.css' );
|
||
|
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/lottie.asset.php';
|
||
|
wp_register_script( 'lottie-player', OTTER_BLOCKS_URL . 'assets/lottie/lottie-player.min.js', [], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'lottie-player', 'async', true );
|
||
|
|
||
|
wp_register_script( 'dotlottie-player', OTTER_BLOCKS_URL . 'assets/lottie/dotlottie-player.min.js', [], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'dotlottie-player', 'async', true );
|
||
|
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/slider.asset.php';
|
||
|
wp_register_script( 'glidejs', OTTER_BLOCKS_URL . 'assets/glide/glide.min.js', [], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'glidejs', 'async', true );
|
||
|
|
||
|
wp_register_style( 'glidejs-core', OTTER_BLOCKS_URL . 'assets/glide/glide.core.min.css', [], $asset_file['version'] );
|
||
|
wp_style_add_data( 'glidejs-core', 'path', OTTER_BLOCKS_PATH . '/assets/glide/glide.core.min.css' );
|
||
|
wp_register_style( 'glidejs-theme', OTTER_BLOCKS_URL . 'assets/glide/glide.theme.min.css', [], $asset_file['version'] );
|
||
|
wp_style_add_data( 'glidejs-theme', 'path', OTTER_BLOCKS_PATH . '/assets/glide/glide.theme.min.css' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Load Gutenberg blocks.
|
||
|
*
|
||
|
* @since 2.0.0
|
||
|
* @access public
|
||
|
*/
|
||
|
public function enqueue_block_editor_assets() {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/blocks.asset.php';
|
||
|
|
||
|
$current_screen = get_current_screen();
|
||
|
|
||
|
if ( 'widgets' === $current_screen->base ) {
|
||
|
if ( in_array( 'wp-edit-post', $asset_file['dependencies'] ) ) {
|
||
|
unset( $asset_file['dependencies'][ array_search( 'wp-editor', $asset_file['dependencies'] ) ] );
|
||
|
unset( $asset_file['dependencies'][ array_search( 'wp-edit-post', $asset_file['dependencies'] ) ] );
|
||
|
}
|
||
|
|
||
|
if ( class_exists( 'WooCommerce' ) ) {
|
||
|
array_push( $asset_file['dependencies'], 'wc-blocks-data-store', 'wc-price-format' );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
wp_register_script( 'otter-vendor', OTTER_BLOCKS_URL . 'build/blocks/vendor.js', array( 'react', 'react-dom' ), $asset_file['version'], true );
|
||
|
|
||
|
wp_enqueue_script(
|
||
|
'otter-blocks',
|
||
|
OTTER_BLOCKS_URL . 'build/blocks/blocks.js',
|
||
|
array_merge(
|
||
|
$asset_file['dependencies'],
|
||
|
array( 'otter-vendor', 'glidejs', 'lottie-player', 'dotlottie-player' )
|
||
|
),
|
||
|
$asset_file['version'],
|
||
|
true
|
||
|
);
|
||
|
|
||
|
wp_set_script_translations( 'otter-blocks', 'otter-blocks' );
|
||
|
|
||
|
if ( defined( 'THEMEISLE_GUTENBERG_GOOGLE_MAPS_API' ) ) {
|
||
|
$api = THEMEISLE_GUTENBERG_GOOGLE_MAPS_API;
|
||
|
} else {
|
||
|
$api = false;
|
||
|
}
|
||
|
|
||
|
global $wp_roles;
|
||
|
|
||
|
wp_localize_script(
|
||
|
'otter-blocks',
|
||
|
'themeisleGutenberg',
|
||
|
array(
|
||
|
'hasNeve' => defined( 'NEVE_VERSION' ),
|
||
|
'hasPro' => Pro::is_pro_installed(),
|
||
|
'isProActive' => Pro::is_pro_active(),
|
||
|
'upgradeLink' => tsdk_utmify( Pro::get_url(), 'editor', Pro::get_reference() ),
|
||
|
'patternsLink' => tsdk_utmify( Pro::get_patterns_url(), 'editor', Pro::get_reference() ),
|
||
|
'should_show_upsell' => Pro::should_show_upsell(),
|
||
|
'assetsPath' => OTTER_BLOCKS_URL . 'assets',
|
||
|
'updatePath' => admin_url( 'update-core.php' ),
|
||
|
'optionsPath' => admin_url( 'admin.php?page=otter' ),
|
||
|
'mapsAPI' => $api,
|
||
|
'hasStripeAPI' => Stripe_API::has_keys(),
|
||
|
'globalDefaults' => json_decode( get_option( 'themeisle_blocks_settings_global_defaults', '{}' ) ),
|
||
|
'themeDefaults' => Main::get_global_defaults(),
|
||
|
'imageSizes' => function_exists( 'is_wpcom_vip' ) ? array( 'thumbnail', 'medium', 'medium_large', 'large' ) : get_intermediate_image_sizes(), // phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.get_intermediate_image_sizes_get_intermediate_image_sizes
|
||
|
'isWPVIP' => function_exists( 'is_wpcom_vip' ),
|
||
|
'canTrack' => 'yes' === get_option( 'otter_blocks_logger_flag', false ) ? true : false,
|
||
|
'userRoles' => $wp_roles->roles,
|
||
|
'isBlockEditor' => 'post' === $current_screen->base,
|
||
|
'postTypes' => get_post_types( [ 'public' => true ] ),
|
||
|
'rootUrl' => get_site_url(),
|
||
|
'restRoot' => get_rest_url( null, 'otter/v1' ),
|
||
|
'isPrettyPermalinks' => boolval( get_option( 'permalink_structure' ) ),
|
||
|
'showOnboarding' => $this->show_onboarding(),
|
||
|
'ratingScale' => get_option( 'themeisle_blocks_settings_review_scale', false ),
|
||
|
'hasModule' => array(
|
||
|
'blockCSS' => boolval( get_option( 'themeisle_blocks_settings_css_module', true ) ),
|
||
|
'blockAnimations' => boolval( get_option( 'themeisle_blocks_settings_blocks_animation', true ) ),
|
||
|
'blockConditions' => boolval( get_option( 'themeisle_blocks_settings_block_conditions', true ) ),
|
||
|
),
|
||
|
'isLegacyPre59' => version_compare( get_bloginfo( 'version' ), '5.8.22', '<=' ),
|
||
|
'isAncestorTypeAvailable' => version_compare( get_bloginfo( 'version' ), '5.9.22', '>=' ),
|
||
|
'version' => OTTER_BLOCKS_VERSION,
|
||
|
'isRTL' => is_rtl(),
|
||
|
'highlightDynamicText' => get_option( 'themeisle_blocks_settings_highlight_dynamic', true ),
|
||
|
'hasOpenAiKey' => ! empty( get_option( 'themeisle_open_ai_api_key' ) ),
|
||
|
)
|
||
|
);
|
||
|
|
||
|
wp_enqueue_style( 'otter-editor', OTTER_BLOCKS_URL . 'build/blocks/editor.css', array( 'wp-edit-blocks', 'font-awesome-5', 'font-awesome-4-shims' ), $asset_file['version'] );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Whether to show onboarding or not.
|
||
|
*
|
||
|
* @since 2.0.13
|
||
|
* @access public
|
||
|
*/
|
||
|
public function show_onboarding() {
|
||
|
$onboarding_option = get_option( 'themeisle_blocks_settings_onboarding', true );
|
||
|
$installed_thru_sdk = get_option( 'themeisle_sdk_promotions_otter_installed', false );
|
||
|
$otter_blocks_install = get_option( 'otter_blocks_install' );
|
||
|
|
||
|
if ( defined( 'ENABLE_OTTER_PRO_DEV' ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( ! $onboarding_option ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( $installed_thru_sdk && $otter_blocks_install > strtotime( '-2 days' ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Load frontend assets for our blocks.
|
||
|
*
|
||
|
* @since 2.0.0
|
||
|
* @access public
|
||
|
*/
|
||
|
public function enqueue_block_assets() {
|
||
|
global $wp_query, $wp_registered_sidebars;
|
||
|
|
||
|
if ( is_admin() ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
if ( is_singular() ) {
|
||
|
$this->enqueue_dependencies();
|
||
|
} else {
|
||
|
if ( ! is_null( $wp_query->posts ) && 0 < count( $wp_query->posts ) ) {
|
||
|
$posts = wp_list_pluck( $wp_query->posts, 'ID' );
|
||
|
|
||
|
foreach ( $posts as $post ) {
|
||
|
$this->enqueue_dependencies( $post );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
add_filter(
|
||
|
'the_content',
|
||
|
function ( $content ) {
|
||
|
$this->enqueue_dependencies();
|
||
|
|
||
|
return $content;
|
||
|
}
|
||
|
);
|
||
|
|
||
|
$has_widgets = false;
|
||
|
|
||
|
foreach ( $wp_registered_sidebars as $key => $sidebar ) {
|
||
|
if ( is_active_sidebar( $key ) ) {
|
||
|
$has_widgets = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( $has_widgets ) {
|
||
|
|
||
|
add_filter(
|
||
|
'wp_footer',
|
||
|
function ( $content ) {
|
||
|
$this->enqueue_dependencies( 'widgets' );
|
||
|
|
||
|
return $content;
|
||
|
}
|
||
|
);
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( function_exists( 'get_block_templates' ) && function_exists( 'wp_is_block_theme' ) && wp_is_block_theme() && current_theme_supports( 'block-templates' ) ) {
|
||
|
$this->enqueue_dependencies( 'block-templates' );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Handler which checks the blocks used and enqueue the assets which needs.
|
||
|
*
|
||
|
* @since 2.0.0
|
||
|
* @param string|int|null $post Current post.
|
||
|
* @access public
|
||
|
*/
|
||
|
public function enqueue_dependencies( $post = null ) {
|
||
|
$content = '';
|
||
|
|
||
|
if ( 'widgets' === $post ) {
|
||
|
$post = self::get_active_widgets_content();
|
||
|
} elseif ( 'block-templates' === $post ) {
|
||
|
global $_wp_current_template_content;
|
||
|
|
||
|
$slugs = array();
|
||
|
$template_blocks = parse_blocks( $_wp_current_template_content );
|
||
|
|
||
|
foreach ( $template_blocks as $template_block ) {
|
||
|
if ( 'core/template-part' === $template_block['blockName'] ) {
|
||
|
$slugs[] = $template_block['attrs']['slug'];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$templates_parts = get_block_templates( array( 'slugs__in' => $slugs ), 'wp_template_part' );
|
||
|
|
||
|
foreach ( $templates_parts as $templates_part ) {
|
||
|
if ( ! empty( $templates_part->content ) && ! empty( $templates_part->slug ) && in_array( $templates_part->slug, $slugs ) ) {
|
||
|
$content .= $templates_part->content;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$content .= $_wp_current_template_content;
|
||
|
$post = $content;
|
||
|
} else {
|
||
|
$content = get_the_content( null, false, $post );
|
||
|
}
|
||
|
|
||
|
$this->enqueue_block_styles( $post );
|
||
|
|
||
|
if ( has_block( 'core/block', $post ) ) {
|
||
|
$blocks = parse_blocks( $content );
|
||
|
$blocks = array_filter(
|
||
|
$blocks,
|
||
|
function( $block ) {
|
||
|
return 'core/block' === $block['blockName'] && isset( $block['attrs']['ref'] );
|
||
|
}
|
||
|
);
|
||
|
|
||
|
foreach ( $blocks as $block ) {
|
||
|
$this->enqueue_dependencies( $block['attrs']['ref'] );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( ( function_exists( 'is_amp_endpoint' ) && is_amp_endpoint() ) || is_admin() ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( ! self::$scripts_loaded['circle-counter'] && has_block( 'themeisle-blocks/circle-counter', $post ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/circle-counter.asset.php';
|
||
|
wp_register_script( 'otter-circle-counter', OTTER_BLOCKS_URL . 'build/blocks/circle-counter.js', $asset_file['dependencies'], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'otter-circle-counter', 'defer', true );
|
||
|
}
|
||
|
|
||
|
if ( ! self::$scripts_loaded['countdown'] && has_block( 'themeisle-blocks/countdown', $post ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/countdown.asset.php';
|
||
|
wp_register_script( 'otter-countdown', OTTER_BLOCKS_URL . 'build/blocks/countdown.js', $asset_file['dependencies'], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'otter-countdown', 'defer', true );
|
||
|
|
||
|
$offset = (float) get_option( 'gmt_offset' );
|
||
|
$hours = (int) $offset;
|
||
|
$minutes = ( $offset - $hours );
|
||
|
$sign = ( $offset < 0 ) ? '-' : '+';
|
||
|
$abs_hour = abs( $hours );
|
||
|
$abs_mins = abs( $minutes * 60 );
|
||
|
$tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );
|
||
|
|
||
|
wp_localize_script(
|
||
|
'otter-countdown',
|
||
|
'themeisleGutenbergCountdown',
|
||
|
array(
|
||
|
'i18n' => array(
|
||
|
'second' => __( 'Second', 'otter-blocks' ),
|
||
|
'seconds' => __( 'Seconds', 'otter-blocks' ),
|
||
|
'minute' => __( 'Minute', 'otter-blocks' ),
|
||
|
'minutes' => __( 'Minutes', 'otter-blocks' ),
|
||
|
'hour' => __( 'Hour', 'otter-blocks' ),
|
||
|
'hours' => __( 'Hours', 'otter-blocks' ),
|
||
|
'day' => __( 'Day', 'otter-blocks' ),
|
||
|
'days' => __( 'Days', 'otter-blocks' ),
|
||
|
),
|
||
|
'timezone' => $tz_offset,
|
||
|
)
|
||
|
);
|
||
|
|
||
|
add_action(
|
||
|
'wp_head',
|
||
|
function() {
|
||
|
echo '
|
||
|
<style type="text/css" data-source="otter-blocks">
|
||
|
[class*="o-countdown-trigger-on-end-"] {
|
||
|
transition: opacity 1s ease;
|
||
|
}
|
||
|
|
||
|
[class*="o-countdown-trigger-on-end-"].o-cntdn-bhv-show, [class*="o-countdown-trigger-on-end-"].o-cntdn-bhv-hide:not(.o-cntdn-ready), [class*="o-countdown-trigger-on-end-"].o-cntdn-bhv-hide.o-cntdn-hide, [data-intv-start]:not(.o-cntdn-ready) {
|
||
|
height: 0px !important;
|
||
|
max-height: 0px !important;
|
||
|
min-height: 0px !important;
|
||
|
visibility: hidden;
|
||
|
box-sizing: border-box;
|
||
|
margin: 0px !important;
|
||
|
padding: 0px !important;
|
||
|
opacity: 0;
|
||
|
}
|
||
|
|
||
|
.wp-block-themeisle-blocks-countdown:not(.o-cntdn-ready) {
|
||
|
visibility: hidden;
|
||
|
}
|
||
|
|
||
|
[class*="o-countdown-trigger-on-end-"].o-cntdn-bhv-show {
|
||
|
opacity: 0;
|
||
|
}
|
||
|
</style>
|
||
|
';
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if ( ! self::$scripts_loaded['form'] && has_block( 'themeisle-blocks/form', $post ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/form.asset.php';
|
||
|
wp_register_script( 'otter-form', OTTER_BLOCKS_URL . 'build/blocks/form.js', $asset_file['dependencies'], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'otter-form', 'defer', true );
|
||
|
|
||
|
wp_localize_script(
|
||
|
'otter-form',
|
||
|
'themeisleGutenbergForm',
|
||
|
array(
|
||
|
'reRecaptchaSitekey' => get_option( 'themeisle_google_captcha_api_site_key' ),
|
||
|
'reRecaptchaAPIURL' => apply_filters( 'otter_blocks_recaptcha_api_url', 'https://www.google.com/recaptcha/api.js' ),
|
||
|
'root' => esc_url_raw( rest_url() ),
|
||
|
'nonce' => wp_create_nonce( 'wp_rest' ),
|
||
|
'messages' => array(
|
||
|
'submission' => __( 'Form submission from', 'otter-blocks' ),
|
||
|
'captcha-not-loaded' => __( 'Captcha is not loaded. Please check your browser plugins to allow the Google reCaptcha.', 'otter-blocks' ),
|
||
|
'check-captcha' => __( 'Please check the captcha.', 'otter-blocks' ),
|
||
|
'invalid-email' => __( 'The email address is invalid!', 'otter-blocks' ),
|
||
|
'already-registered' => __( 'The email was already registered!', 'otter-blocks' ),
|
||
|
'try-again' => __( 'Error. Something is wrong with the server! Try again later.', 'otter-blocks' ),
|
||
|
'privacy' => __( 'I have read and agreed the privacy statement.', 'otter-blocks' ),
|
||
|
'too-many-files' => __( 'Too many files loaded. Maximum is: ', 'otter-blocks' ),
|
||
|
'big-file' => __( 'File size is to big. The limit is: ', 'otter-blocks' ),
|
||
|
'invalid-file' => __( 'Invalid files type. The submitted files could not be processed.', 'otter-blocks' ),
|
||
|
'confirmingSubmission' => __( 'Confirming submission', 'otter-blocks' ),
|
||
|
),
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if ( ! self::$scripts_loaded['google-map'] && has_block( 'themeisle-blocks/google-map', $post ) ) {
|
||
|
$apikey = get_option( 'themeisle_google_map_block_api_key' );
|
||
|
|
||
|
// Don't output anything if there is no API key.
|
||
|
if ( null !== $apikey && ! empty( $apikey ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/maps.asset.php';
|
||
|
wp_register_script( 'otter-google-map', OTTER_BLOCKS_URL . 'build/blocks/maps.js', $asset_file['dependencies'], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'otter-google-map', 'defer', true );
|
||
|
wp_register_script( 'google-maps', 'https://maps.googleapis.com/maps/api/js?key=' . esc_attr( $apikey ) . '&libraries=places&callback=initMapScript', array( 'otter-google-map' ), '', true ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NoExplicitVersion
|
||
|
wp_script_add_data( 'google-maps', 'defer', true );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( ! self::$scripts_loaded['leaflet-map'] && has_block( 'themeisle-blocks/leaflet-map', $post ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/leaflet-map.asset.php';
|
||
|
|
||
|
wp_register_script(
|
||
|
'otter-leaflet',
|
||
|
OTTER_BLOCKS_URL . 'build/blocks/leaflet-map.js',
|
||
|
array_merge(
|
||
|
$asset_file['dependencies'],
|
||
|
array( 'leaflet', 'leaflet-gesture-handling' )
|
||
|
),
|
||
|
$asset_file['version'],
|
||
|
true
|
||
|
);
|
||
|
|
||
|
wp_script_add_data( 'otter-leaflet', 'defer', true );
|
||
|
}
|
||
|
|
||
|
if ( ! self::$scripts_loaded['lottie'] && has_block( 'themeisle-blocks/lottie', $post ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/lottie.asset.php';
|
||
|
wp_register_script( 'lottie-interactivity', OTTER_BLOCKS_URL . 'assets/lottie/lottie-interactivity.min.js', array( 'lottie-player', 'dotlottie-player' ), $asset_file['version'], true );
|
||
|
wp_script_add_data( 'lottie-interactivity', 'async', true );
|
||
|
|
||
|
wp_register_script(
|
||
|
'otter-lottie',
|
||
|
OTTER_BLOCKS_URL . 'build/blocks/lottie.js',
|
||
|
array_merge(
|
||
|
$asset_file['dependencies'],
|
||
|
array( 'lottie-player', 'dotlottie-player', 'lottie-interactivity' )
|
||
|
),
|
||
|
$asset_file['version'],
|
||
|
true
|
||
|
);
|
||
|
|
||
|
wp_script_add_data( 'otter-lottie', 'defer', true );
|
||
|
}
|
||
|
|
||
|
if ( ! self::$scripts_loaded['slider'] && has_block( 'themeisle-blocks/slider', $post ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/slider.asset.php';
|
||
|
|
||
|
wp_register_script(
|
||
|
'otter-slider',
|
||
|
OTTER_BLOCKS_URL . 'build/blocks/slider.js',
|
||
|
array_merge(
|
||
|
$asset_file['dependencies'],
|
||
|
array( 'glidejs' )
|
||
|
),
|
||
|
$asset_file['version'],
|
||
|
true
|
||
|
);
|
||
|
|
||
|
wp_script_add_data( 'otter-slider', 'async', true );
|
||
|
|
||
|
wp_localize_script(
|
||
|
'otter-slider',
|
||
|
'themeisleGutenbergSlider',
|
||
|
array(
|
||
|
'isRTL' => is_rtl(),
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if ( ! self::$scripts_loaded['tabs'] && has_block( 'themeisle-blocks/tabs', $post ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/tabs.asset.php';
|
||
|
wp_register_script( 'otter-tabs', OTTER_BLOCKS_URL . 'build/blocks/tabs.js', $asset_file['dependencies'], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'otter-tabs', 'defer', true );
|
||
|
}
|
||
|
|
||
|
if ( ! self::$scripts_loaded['popup'] && has_block( 'themeisle-blocks/popup', $post ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/popup.asset.php';
|
||
|
wp_register_script( 'otter-popup', OTTER_BLOCKS_URL . 'build/blocks/popup.js', $asset_file['dependencies'], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'otter-popup', 'defer', true );
|
||
|
|
||
|
wp_localize_script(
|
||
|
'otter-popup',
|
||
|
'themeisleGutenberg',
|
||
|
array(
|
||
|
'isPreview' => is_preview(),
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if ( ! self::$scripts_loaded['progress-bar'] && has_block( 'themeisle-blocks/progress-bar', $post ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/progress-bar.asset.php';
|
||
|
wp_register_script( 'otter-progress-bar', OTTER_BLOCKS_URL . 'build/blocks/progress-bar.js', $asset_file['dependencies'], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'otter-progress-bar', 'defer', true );
|
||
|
}
|
||
|
|
||
|
if ( ! self::$scripts_loaded['accordion'] && has_block( 'themeisle-blocks/accordion', $post ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/accordion.asset.php';
|
||
|
wp_register_script( 'otter-accordion', OTTER_BLOCKS_URL . 'build/blocks/accordion.js', $asset_file['dependencies'], $asset_file['version'], true );
|
||
|
wp_script_add_data( 'otter-accordion', 'defer', true );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Enqueue block styles.
|
||
|
*
|
||
|
* @since 2.0.0
|
||
|
* @param null $post Current post.
|
||
|
* @access public
|
||
|
*/
|
||
|
public function enqueue_block_styles( $post ) {
|
||
|
foreach ( self::$blocks as $block ) {
|
||
|
if ( in_array( $block, self::$styles_loaded ) || ! has_block( 'themeisle-blocks/' . $block, $post ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$block_path = OTTER_BLOCKS_PATH . '/build/blocks/' . $block;
|
||
|
$style = OTTER_BLOCKS_URL . 'build/blocks/' . $block . '/style.css';
|
||
|
|
||
|
if ( ! file_exists( $block_path ) && defined( 'OTTER_PRO_BUILD_PATH' ) ) {
|
||
|
$block_path = OTTER_PRO_BUILD_PATH . $block;
|
||
|
$style = OTTER_PRO_BUILD_URL . $block . '/style.css';
|
||
|
}
|
||
|
|
||
|
$metadata_file = trailingslashit( $block_path ) . 'block.json';
|
||
|
$style_path = trailingslashit( $block_path ) . 'style.css';
|
||
|
|
||
|
$metadata = $this->get_metadata( $metadata_file );
|
||
|
|
||
|
if ( false === $metadata ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/blocks.asset.php';
|
||
|
|
||
|
$deps = array();
|
||
|
|
||
|
if ( isset( self::$block_dependencies[ $block ] ) ) {
|
||
|
$deps = self::$block_dependencies[ $block ];
|
||
|
}
|
||
|
|
||
|
if ( file_exists( $style_path ) && ! empty( $metadata['style'] ) ) {
|
||
|
wp_register_style(
|
||
|
$metadata['style'],
|
||
|
$style,
|
||
|
$deps,
|
||
|
$asset_file['version']
|
||
|
);
|
||
|
|
||
|
wp_style_add_data( $metadata['style'], 'path', $style_path );
|
||
|
}
|
||
|
|
||
|
array_push( self::$styles_loaded, $block );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Blocks Registration.
|
||
|
*
|
||
|
* @since 2.0.0
|
||
|
* @access public
|
||
|
*/
|
||
|
public function register_blocks() {
|
||
|
$dynamic_blocks = array(
|
||
|
'about-author' => '\ThemeIsle\GutenbergBlocks\Render\About_Author_Block',
|
||
|
'form-nonce' => '\ThemeIsle\GutenbergBlocks\Render\Form_Nonce_Block',
|
||
|
'google-map' => '\ThemeIsle\GutenbergBlocks\Render\Google_Map_Block',
|
||
|
'leaflet-map' => '\ThemeIsle\GutenbergBlocks\Render\Leaflet_Map_Block',
|
||
|
'plugin-cards' => '\ThemeIsle\GutenbergBlocks\Render\Plugin_Card_Block',
|
||
|
'posts-grid' => '\ThemeIsle\GutenbergBlocks\Render\Posts_Grid_Block',
|
||
|
'review' => '\ThemeIsle\GutenbergBlocks\Render\Review_Block',
|
||
|
'sharing-icons' => '\ThemeIsle\GutenbergBlocks\Render\Sharing_Icons_Block',
|
||
|
'stripe-checkout' => '\ThemeIsle\GutenbergBlocks\Render\Stripe_Checkout_Block',
|
||
|
'form-multiple-choice' => '\ThemeIsle\GutenbergBlocks\Render\Form_Multiple_Choice_Block',
|
||
|
);
|
||
|
|
||
|
$dynamic_blocks = apply_filters( 'otter_blocks_register_dynamic_blocks', $dynamic_blocks );
|
||
|
|
||
|
self::$blocks = array(
|
||
|
'about-author',
|
||
|
'accordion',
|
||
|
'accordion-item',
|
||
|
'advanced-column',
|
||
|
'advanced-columns',
|
||
|
'advanced-heading',
|
||
|
'button',
|
||
|
'button-group',
|
||
|
'circle-counter',
|
||
|
'countdown',
|
||
|
'flip',
|
||
|
'font-awesome-icons',
|
||
|
'form',
|
||
|
'form-input',
|
||
|
'form-nonce',
|
||
|
'form-textarea',
|
||
|
'form-multiple-choice',
|
||
|
'google-map',
|
||
|
'icon-list',
|
||
|
'icon-list-item',
|
||
|
'leaflet-map',
|
||
|
'lottie',
|
||
|
'plugin-cards',
|
||
|
'popup',
|
||
|
'posts-grid',
|
||
|
'pricing',
|
||
|
'progress-bar',
|
||
|
'review',
|
||
|
'service',
|
||
|
'sharing-icons',
|
||
|
'slider',
|
||
|
'stripe-checkout',
|
||
|
'tabs',
|
||
|
'tabs-item',
|
||
|
'testimonials',
|
||
|
);
|
||
|
|
||
|
self::$blocks = apply_filters( 'otter_blocks_register_blocks', self::$blocks );
|
||
|
|
||
|
$this->enqueue_assets();
|
||
|
|
||
|
self::$block_dependencies = array(
|
||
|
'leaflet-map' => array( 'leaflet', 'leaflet-gesture-handling' ),
|
||
|
'slider' => array( 'glidejs-core', 'glidejs-theme' ),
|
||
|
);
|
||
|
|
||
|
$local_dependencies = array_merge(
|
||
|
self::$block_dependencies,
|
||
|
array(
|
||
|
'button-group' => array( 'font-awesome-5', 'font-awesome-4-shims' ),
|
||
|
'font-awesome-icons' => array( 'font-awesome-5', 'font-awesome-4-shims' ),
|
||
|
'icon-list-item' => array( 'font-awesome-5', 'font-awesome-4-shims' ),
|
||
|
'plugin-cards' => array( 'font-awesome-5', 'font-awesome-4-shims' ),
|
||
|
'sharing-icons' => array( 'font-awesome-5', 'font-awesome-4-shims' ),
|
||
|
)
|
||
|
);
|
||
|
|
||
|
foreach ( self::$blocks as $block ) {
|
||
|
$block_path = OTTER_BLOCKS_PATH . '/build/blocks/' . $block;
|
||
|
$editor_style = OTTER_BLOCKS_URL . 'build/blocks/' . $block . '/editor.css';
|
||
|
|
||
|
if ( ! file_exists( $block_path ) && defined( 'OTTER_PRO_BUILD_PATH' ) ) {
|
||
|
$block_path = OTTER_PRO_BUILD_PATH . $block;
|
||
|
$editor_style = OTTER_PRO_BUILD_URL . $block . '/editor.css';
|
||
|
}
|
||
|
|
||
|
$metadata_file = trailingslashit( $block_path ) . 'block.json';
|
||
|
$editor_style_path = trailingslashit( $block_path ) . 'editor.css';
|
||
|
|
||
|
$metadata = $this->get_metadata( $metadata_file );
|
||
|
|
||
|
if ( false === $metadata ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/blocks.asset.php';
|
||
|
|
||
|
$deps = array();
|
||
|
|
||
|
if ( isset( $local_dependencies[ $block ] ) ) {
|
||
|
$deps = $local_dependencies[ $block ];
|
||
|
}
|
||
|
|
||
|
if ( file_exists( $editor_style_path ) && ! empty( $metadata['editorStyle'] ) ) {
|
||
|
wp_register_style(
|
||
|
$metadata['editorStyle'],
|
||
|
$editor_style,
|
||
|
$deps,
|
||
|
$asset_file['version']
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if ( isset( $dynamic_blocks[ $block ] ) ) {
|
||
|
$classname = $dynamic_blocks[ $block ];
|
||
|
$renderer = new $classname();
|
||
|
|
||
|
if ( method_exists( $renderer, 'render' ) ) {
|
||
|
register_block_type_from_metadata(
|
||
|
$metadata_file,
|
||
|
array(
|
||
|
'render_callback' => array( $renderer, 'render' ),
|
||
|
)
|
||
|
);
|
||
|
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
register_block_type_from_metadata( $metadata_file );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Initialize AMP blocks.
|
||
|
*
|
||
|
* @since 1.0.0
|
||
|
* @access public
|
||
|
*/
|
||
|
public function init_amp_blocks() {
|
||
|
$classnames = array(
|
||
|
'\ThemeIsle\GutenbergBlocks\Render\AMP\Circle_Counter_Block',
|
||
|
'\ThemeIsle\GutenbergBlocks\Render\AMP\Lottie_Block',
|
||
|
'\ThemeIsle\GutenbergBlocks\Render\AMP\Slider_Block',
|
||
|
);
|
||
|
|
||
|
foreach ( $classnames as $classname ) {
|
||
|
$classname = new $classname();
|
||
|
|
||
|
if ( method_exists( $classname, 'instance' ) ) {
|
||
|
$classname->instance();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Subscribe to FA enqueue.
|
||
|
*
|
||
|
* @param string $block_content Block content parsed.
|
||
|
* @param array $block Block details.
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function subscribe_fa( $block_content, $block ) {
|
||
|
if ( ! isset( $block['blockName'] ) ) {
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
if ( self::$is_fa_loaded ) {
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
// always load for those.
|
||
|
static $always_load = [
|
||
|
'themeisle-blocks/sharing-icons' => true,
|
||
|
'themeisle-blocks/plugin-cards' => true,
|
||
|
];
|
||
|
|
||
|
if ( isset( $always_load[ $block['blockName'] ] ) ) {
|
||
|
self::$is_fa_loaded = true;
|
||
|
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
if ( 'themeisle-blocks/button' === $block['blockName'] ) {
|
||
|
if ( isset( $block['attrs']['library'] ) && 'themeisle-icons' === $block['attrs']['library'] ) {
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
if ( isset( $block['attrs']['iconType'] ) ) {
|
||
|
self::$is_fa_loaded = true;
|
||
|
|
||
|
return $block_content;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( 'themeisle-blocks/font-awesome-icons' === $block['blockName'] ) {
|
||
|
if ( ! isset( $block['attrs']['library'] ) ) {
|
||
|
self::$is_fa_loaded = true;
|
||
|
|
||
|
return $block_content;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( 'themeisle-blocks/icon-list-item' === $block['blockName'] ) {
|
||
|
if ( ! isset( $block['attrs']['library'] ) ) {
|
||
|
self::$is_fa_loaded = true;
|
||
|
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
if ( 'fontawesome' === $block['attrs']['library'] ) {
|
||
|
self::$is_fa_loaded = true;
|
||
|
|
||
|
return $block_content;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$has_navigation_block = \WP_Block_Type_Registry::get_instance()->is_registered( 'core/navigation' );
|
||
|
|
||
|
if ( $has_navigation_block && ( 'core/navigation-link' === $block['blockName'] || 'core/navigation-submenu' === $block['blockName'] ) ) {
|
||
|
if ( isset( $block['attrs']['className'] ) && strpos( $block['attrs']['className'], 'fa-' ) !== false ) {
|
||
|
self::$is_fa_loaded = true;
|
||
|
|
||
|
// See the src/blocks/plugins/menu-icons/inline.css file for where this comes from.
|
||
|
$styles = '.fab.wp-block-navigation-item,.far.wp-block-navigation-item,.fas.wp-block-navigation-item{-moz-osx-font-smoothing:inherit;-webkit-font-smoothing:inherit;font-weight:inherit}.fab.wp-block-navigation-item:before,.far.wp-block-navigation-item:before,.fas.wp-block-navigation-item:before{font-family:Font Awesome\ 5 Free;margin-right:5px}.fab.wp-block-navigation-item:before,.far.wp-block-navigation-item:before{font-weight:400;padding-right:5px}.fas.wp-block-navigation-item:before{font-weight:900;padding-right:5px}.fab.wp-block-navigation-item:before{font-family:Font Awesome\ 5 Brands}';
|
||
|
|
||
|
wp_add_inline_style( 'font-awesome-5', $styles );
|
||
|
return $block_content;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( 'themeisle-blocks/accordion' === $block['blockName'] ) {
|
||
|
if ( isset( $block['attrs']['icon'] ) || isset( $block['attrs']['openItemIcon'] ) ) {
|
||
|
self::$is_fa_loaded = true;
|
||
|
|
||
|
return $block_content;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Load assets in frontend.
|
||
|
*
|
||
|
* @param string $block_content Content of block.
|
||
|
* @param array $block Block Attributes.
|
||
|
* @return string
|
||
|
* @since 2.0.5
|
||
|
*/
|
||
|
public function load_sticky( $block_content, $block ) {
|
||
|
if ( ( function_exists( 'is_amp_endpoint' ) && is_amp_endpoint() ) || self::$scripts_loaded['sticky'] ) {
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
if ( isset( $block['attrs']['className'] ) && false !== strpos( $block['attrs']['className'], 'o-sticky' ) ) {
|
||
|
$asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/sticky.asset.php';
|
||
|
wp_enqueue_script(
|
||
|
'otter-sticky',
|
||
|
OTTER_BLOCKS_URL . 'build/blocks/sticky.js',
|
||
|
$asset_file['dependencies'],
|
||
|
$asset_file['version'],
|
||
|
true
|
||
|
);
|
||
|
wp_script_add_data( 'otter-sticky', 'defer', true );
|
||
|
|
||
|
add_action( 'wp_head', array( $this, 'sticky_style' ) );
|
||
|
|
||
|
self::$scripts_loaded['sticky'] = true;
|
||
|
}
|
||
|
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get styles for sticky blocks.
|
||
|
*
|
||
|
* @static
|
||
|
* @since 2.0.14
|
||
|
* @access public
|
||
|
*/
|
||
|
public static function sticky_style() {
|
||
|
echo '<style id="o-sticky-inline-css">.o-sticky.o-sticky-float { height: 0px; } </style>';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Load the Hide on condition styles.
|
||
|
*
|
||
|
* @param string $block_content The block content.
|
||
|
* @param array $block The block data.
|
||
|
* @return string
|
||
|
*/
|
||
|
public function load_condition_hide_on_styles( $block_content, $block ) {
|
||
|
if ( self::$scripts_loaded['condition_hide_on'] ) {
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
if ( empty( $block['attrs']['otterConditions'] ) || ! is_array( $block['attrs']['otterConditions'] ) ) {
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
$has_condition = false;
|
||
|
|
||
|
foreach ( $block['attrs']['otterConditions'] as $group ) {
|
||
|
foreach ( $group as $condition ) {
|
||
|
if ( array_key_exists( 'type', $condition ) && 'screenSize' === $condition['type'] && isset( $condition['screen_sizes'] ) && is_array( $condition['screen_sizes'] ) ) {
|
||
|
$has_condition = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( $has_condition ) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( ! $has_condition ) {
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
add_action( 'wp_footer', array( $this, 'condition_hide_on_style' ) );
|
||
|
self::$scripts_loaded['condition_hide_on'] = true;
|
||
|
|
||
|
return $block_content;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the styles for Hide on condition.
|
||
|
*
|
||
|
* @static
|
||
|
* @since 2.4
|
||
|
* @access public
|
||
|
*/
|
||
|
public static function condition_hide_on_style() {
|
||
|
echo '<style id="o-condition-hide-inline-css">@media (max-width:768px){.o-hide-on-mobile{display:none!important}}@media (min-width:767px) and (max-width:1024px){.o-hide-on-tablet{display:none!important}}@media (min-width:1023px){.o-hide-on-desktop{display:none!important}}</style>';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the content of all active widgets.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public static function get_active_widgets_content() {
|
||
|
$content = '';
|
||
|
|
||
|
if ( 0 === count( self::$widget_used ) ) {
|
||
|
return $content;
|
||
|
}
|
||
|
|
||
|
global $wp_registered_widgets;
|
||
|
$valid_widgets = array();
|
||
|
$widget_data = get_option( 'widget_block', array() );
|
||
|
|
||
|
// Loop through all widgets, and add any that are active.
|
||
|
foreach ( $wp_registered_widgets as $widget_name => $widget ) {
|
||
|
if ( ! in_array( $widget['id'], self::$widget_used, true ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$key = $widget['params'][0]['number'];
|
||
|
|
||
|
if ( isset( $widget_data[ $key ] ) ) {
|
||
|
$valid_widgets[] = (object) $widget_data[ $key ];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
foreach ( $valid_widgets as $widget ) {
|
||
|
if ( isset( $widget->content ) ) {
|
||
|
$content .= $widget->content;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $content;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Watch and save the used widgets.
|
||
|
*
|
||
|
* @param array $params The widget params.
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function watch_used_widgets( $params ) {
|
||
|
if ( isset( $params[0]['widget_id'] ) && ! in_array( $params[0]['widget_id'], self::$widget_used ) ) {
|
||
|
self::$widget_used[] = $params[0]['widget_id'];
|
||
|
}
|
||
|
|
||
|
return $params;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The instance method for the static class.
|
||
|
* Defines and returns the instance of the static class.
|
||
|
*
|
||
|
* @static
|
||
|
* @since 1.0.0
|
||
|
* @access public
|
||
|
* @return Registration
|
||
|
*/
|
||
|
public static function instance() {
|
||
|
if ( is_null( self::$instance ) ) {
|
||
|
self::$instance = new self();
|
||
|
self::$instance->init();
|
||
|
}
|
||
|
|
||
|
return self::$instance;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Throw error on object clone
|
||
|
*
|
||
|
* The whole idea of the singleton design pattern is that there is a single
|
||
|
* object therefore, we don't want the object to be cloned.
|
||
|
*
|
||
|
* @access public
|
||
|
* @since 1.0.0
|
||
|
* @return void
|
||
|
*/
|
||
|
public function __clone() {
|
||
|
// Cloning instances of the class is forbidden.
|
||
|
_doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin’ huh?', 'otter-blocks' ), '1.0.0' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Disable unserializing of the class
|
||
|
*
|
||
|
* @access public
|
||
|
* @since 1.0.0
|
||
|
* @return void
|
||
|
*/
|
||
|
public function __wakeup() {
|
||
|
// Unserializing instances of the class is forbidden.
|
||
|
_doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin’ huh?', 'otter-blocks' ), '1.0.0' );
|
||
|
}
|
||
|
}
|