=' ) ) { add_action( 'wp_enqueue_scripts', array( $this, 'load_ultimate_gutenberg_blocks_assets' ) ); } else { add_action( 'wp', array( $this, 'load_ultimate_gutenberg_blocks_assets' ) ); } add_action( 'template_redirect', array( $this, 'advanced_hook_template_frontend' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'add_styles' ) ); add_action( 'astra_advanced_hook_template', array( $this, 'template_empty_content' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'advanced_hook_scripts' ) ); add_filter( 'the_content', array( $this, 'advanced_hook_content_markup' ) ); add_filter( 'single_template', array( $this, 'get_custom_post_type_template' ) ); /* Add Body Classes */ add_filter( 'body_class', array( $this, 'body_classes' ), 10, 1 ); add_action( 'astra_addon_get_css_files', array( $this, 'add_front_styles' ) ); add_action( 'astra_addon_get_js_files', array( $this, 'add_scripts' ) ); add_filter( 'astra_addon_js_localize', array( $this, 'localize_variables' ) ); add_filter( 'astra_addon_dynamic_css', array( $this, 'astra_ext_advanced_hooks_dynamic_css' ) ); add_shortcode( 'astra_custom_layout', array( $this, 'shortcode_output' ) ); } /** * Overriding default template by Custom Layout. * * @since 4.3.0 * @param int $post_id post id. * @return string */ public static function render_overridden_template( $post_id ) { $post_content = get_post( $post_id ); if ( empty( $post_content ) ) { return; } get_header(); do_action( 'astra_addon_before_custom_single_content', $post_id ); ob_start(); self::get_instance()->get_action_content( $post_id ); echo do_shortcode( ob_get_clean() ); do_action( 'astra_addon_after_custom_single_content', $post_id ); get_footer(); } /** * Overriding default template by Custom Layout. * * @since 4.3.0 * @param mixed $template template. * @return string */ public function override_template_include( $template ) { $post_type = get_post_type(); if ( ASTRA_ADVANCED_HOOKS_POST_TYPE !== $post_type ) { $option = array( 'location' => 'ast-advanced-hook-location', 'exclusion' => 'ast-advanced-hook-exclusion', 'users' => 'ast-advanced-hook-users', ); $ids = Astra_Target_Rules_Fields::get_instance()->get_posts_by_conditions( ASTRA_ADVANCED_HOOKS_POST_TYPE, $option ); $ids = array_keys( $ids ); $template_layouts = array(); if ( empty( $ids ) || is_embed() ) { return $template; } else { // Get all the template layouts. foreach ( $ids as $index => $post_id ) { if ( 'template' === get_post_meta( $post_id, 'ast-advanced-hook-layout', true ) ) { $template_layouts[] = $post_id; } } } if ( empty( $template_layouts ) ) { return $template; } if ( is_singular() ) { $page_template = get_page_template_slug(); if ( ASTRA_ADVANCED_HOOKS_POST_TYPE !== get_post_type() && $page_template && 'default' !== $page_template ) { return $template; } } if ( ASTRA_ADVANCED_HOOKS_POST_TYPE === get_post_type() && count( $template_layouts ) > 1 ) { global $post; $post_id = $post->ID; } else { $post_id = isset( $template_layouts[0] ) ? $template_layouts[0] : 0; } if ( ! $post_id ) { return $template; } $enabled = get_post_meta( $post_id, 'ast-advanced-hook-enabled', true ); $layout = get_post_meta( $post_id, 'ast-advanced-hook-layout', true ); if ( false === apply_filters( 'astra_addon_render_custom_template_content', true, $post_id ) || 'no' === $enabled || 'template' !== $layout ) { return $template; } return astra_addon_get_template( apply_filters( 'astra_addon_overriding_custom_template', 'advanced-hooks/template/dynamic-content.php' ), array( 'template_id' => $post_id, ) ); } return $template; } /** * Render shortcode. * * @param array $atts the shortcode args. * @return string */ public function shortcode_output( $atts ) { $atts = shortcode_atts( array( 'id' => 0, ), $atts, 'astra_custom_layout' ); if ( empty( $atts['id'] ) ) { return; } $post_content = get_post( $atts['id'] ); if ( empty( $post_content ) ) { return; } ob_start(); self::get_instance()->get_action_content( $atts['id'] ); return ob_get_clean(); } /** * Get the classes for custom layout. * * @param int $post_id post id. * @param bool $layout is header | footer | 404-page. */ private function prepare_astra_header_filter( $post_id, $layout ) { $hide_classes = explode( ' ', $this->get_display_device( $post_id, false ) ); if ( 'footer' === $layout && true === astra_addon_builder_helper()->is_header_footer_builder_active ) { add_action( 'astra_footer', array( Astra_Builder_Footer::get_instance(), 'footer_markup' ), 1 ); } if ( ! static::get_time_duration_eligibility( $post_id ) ) { return; } if ( 3 === count( $hide_classes ) ) { // If displayed on desktop, tablet & mobile. $custom_layout_status = get_post_meta( $post_id, 'ast-advanced-hook-enabled', true ); // Remove Previous Content only if custom layout is active. if ( 'no' !== $custom_layout_status ) { switch ( $layout ) { case 'header': remove_action( 'astra_header', 'astra_header_markup' ); break; case 'footer': remove_action( 'astra_footer', 'astra_footer_markup' ); if ( true === astra_addon_builder_helper()->is_header_footer_builder_active ) { remove_action( 'astra_footer', array( Astra_Builder_Footer::get_instance(), 'footer_markup' ), 1 ); } break; case '404-page': remove_action( 'astra_entry_content_404_page', 'astra_entry_content_404_page_template' ); break; default: break; } } return; } switch ( $layout ) { case 'header': case 'footer': $filter = 'astra_get_' . $layout . '_classes'; break; case '404-page': $filter = 'astra_attr_404_page'; break; default: $filter = ''; break; } if ( $filter ) { add_filter( $filter, function ( $classes ) use ( $hide_classes, $layout ) { if ( '404-page' === $layout ) { $hide_classes = implode( ' ', $hide_classes ); $classes['class'] = isset( $classes['class'] ) ? $classes['class'] . ' ' . $hide_classes : $hide_classes; return $classes; } return array_merge( $classes, $hide_classes ); } ); } } /** * Empty Content area for Advanced hooks. * * @return void */ public function template_empty_content() { $post_id = get_the_id(); $layout = get_post_meta( $post_id, 'ast-advanced-hook-layout', true ); if ( empty( $layout ) ) { the_content(); } } /** * Custom template for Advanced Hook post type. * * @param string $template Single Post template path. * @return string */ public function get_custom_post_type_template( $template ) { global $post; $post_id = get_the_id(); $action = get_post_meta( $post_id, 'ast-advanced-hook-action', true ); $layout = get_post_meta( $post_id, 'ast-advanced-hook-layout', true ); // Dispaly single post content as normal post content only for woocommerce actions. $woocommerce_hooks = array( 'woo-global', 'woo-shop', 'woo-product', 'woo-cart', 'woo-checkout', 'woo-distraction-checkout', 'woo-account' ); $woocommerce_activated = false; if ( ASTRA_ADVANCED_HOOKS_POST_TYPE == $post->post_type ) { if ( 'hooks' === $layout ) { foreach ( Astra_Ext_Advanced_Hooks_Meta::$hooks as $key => $value ) { if ( in_array( $key, $woocommerce_hooks ) && isset( Astra_Ext_Advanced_Hooks_Meta::$hooks[ $key ]['hooks'][ $action ] ) ) { $woocommerce_activated = true; } } } // Exclude rendeting the content in correct action for WooCommerce and 404 Layout. if ( ( 'hooks' === $layout && false == $woocommerce_activated ) || 'header' === $layout || 'footer' === $layout ) { $template = ASTRA_ADDON_EXT_ADVANCED_HOOKS_DIR . '/template/template.php'; } } return $template; } /** * Filters the hooks list that should be excluded from the excluded wrapper hooks for advanced hooks layouts. * * @return array List of hooks to exclude from the advanced hook wrapper. * * @since 4.8.3 */ public function get_exclude_wrapper_hooks() { // Default list of hooks to exclude. $exclude_wrapper_hooks = array( 'astra_html_before', 'astra_body_top', 'astra_head_top', 'astra_head_bottom', 'wp_head', 'astra_body_bottom', 'wp_footer', ); /** * Filter the hooks that should be excluded from the excluded wrapper hooks for advanced hooks layouts. * * @param array $exclude_wrapper_hooks List of hooks to exclude. */ return apply_filters( 'astra_advanced_hook_exclude_wrapper_hooks', $exclude_wrapper_hooks ); } /** * Load Advanced hook markup. * * @return void */ public function load_advanced_hooks_template() { if ( is_singular( ASTRA_ADVANCED_HOOKS_POST_TYPE ) ) { $post_id = get_the_id(); $action = get_post_meta( $post_id, 'ast-advanced-hook-action', true ); $layout = get_post_meta( $post_id, 'ast-advanced-hook-layout', true ); $priority = get_post_meta( $post_id, 'ast-advanced-hook-priority', true ); // Exclude default p tag wrapper from the content if selected hook is from exclude hooks list. $exclude_wrapper_hooks = $this->get_exclude_wrapper_hooks(); $with_wrapper = in_array( $action, $exclude_wrapper_hooks ); if ( $with_wrapper ) { remove_filter( 'the_content', 'wpautop' ); } $astra_hooks = Astra_Ext_Advanced_Hooks_Meta::$hooks; if ( isset( $astra_hooks['content']['hooks'][ $action ] ) || isset( $astra_hooks['comment']['hooks'][ $action ] ) || isset( $astra_hooks['sidebar']['hooks'][ $action ] ) ) { $action = 'astra_advanced_hook_template'; } $vc_activated = Astra_Addon_Page_Builder_Compatibility::is_vc_activated( $post_id ); if ( 'astra_advanced_hook_template' == $action || $vc_activated ) { remove_action( 'astra_advanced_hook_template', array( $this, 'template_empty_content' ) ); add_action( 'astra_advanced_hook_template', 'the_content' ); } elseif ( 'header' == $layout ) { $this->prepare_astra_header_filter( $post_id, 'header' ); // remove default site's fixed header if sticky header is activated. add_filter( 'astra_fixed_header_markup_enabled', '__return_false' ); $action = 'astra_custom_header'; // if astra_custom_header not exist then call astra_header. if ( ! has_action( 'astra_custom_header' ) ) { $action = 'astra_header'; } add_action( $action, function() use ( $post_id ) { echo '
'; Astra_Ext_Advanced_Hooks_Markup::get_instance()->get_the_hook_content(); echo '
'; }, $priority ); } elseif ( 'footer' == $layout ) { $this->prepare_astra_header_filter( $post_id, 'footer' ); $action = 'astra_custom_footer'; // if astra_custom_footer not exist then call astra_footer. if ( ! has_action( 'astra_custom_footer' ) ) { $action = 'astra_footer'; } // Add Action for custom header advanced-hooks. add_action( $action, function() use ( $post_id ) { echo ''; }, $priority ); } else { if ( 'custom_hook' === $action ) { $action = get_post_meta( $post_id, 'ast-custom-hook', true ); } add_action( $action, function() use ( $post_id ) { Astra_Ext_Advanced_Hooks_Markup::get_instance()->get_the_hook_content(); }, $priority ); } } } /** * Get the content of the hook */ public function get_the_hook_content() { while ( have_posts() ) : the_post(); the_content(); endwhile; } /** * Filter content markup for Advanced Hook post type. * * @param html $content the_content markup. * @return html */ public function advanced_hook_content_markup( $content ) { if ( is_singular( ASTRA_ADVANCED_HOOKS_POST_TYPE ) ) { $post_id = get_the_id(); if ( ! static::get_time_duration_eligibility( $post_id ) ) { return ''; } if ( ASTRA_WITH_EXTENDED_FUNCTIONALITY ) { $php_snippet = astra_addon_get_php_snippet( $post_id ); if ( $php_snippet ) { $content = $php_snippet; } } $display_device_classes = $this->get_display_device( $post_id ); $action = get_post_meta( $post_id, 'ast-advanced-hook-action', true ); // Exclude default parent div wrapper from the content if selected hook is from exclude hooks list. $exclude_wrapper_hooks = $this->get_exclude_wrapper_hooks(); $with_wrapper = ! in_array( $action, $exclude_wrapper_hooks ); if ( $with_wrapper ) { $content = '
' . $content . '
'; } } return $content; } /** * Add style for Advanced Hook post type. * * @return void */ public function advanced_hook_scripts() { if ( is_singular( ASTRA_ADVANCED_HOOKS_POST_TYPE ) ) { $post_id = get_the_id(); $styles = ''; $padding = get_post_meta( $post_id, 'ast-advanced-hook-padding', true ); $padding_top = isset( $padding['top'] ) ? $padding['top'] : ''; $padding_top = is_numeric( $padding_top ) ? $padding_top . 'px' : $padding_top; $padding_bottom = isset( $padding['bottom'] ) ? $padding['bottom'] : ''; $padding_bottom = is_numeric( $padding_bottom ) ? $padding_bottom . 'px' : $padding_bottom; if ( ! ( empty( $padding_top ) && empty( $padding_bottom ) ) ) { $styles .= ' .astra-advanced-hook-' . $post_id . ' { '; if ( ! empty( $padding_top ) ) { $styles .= 'padding-top: ' . $padding_top . ';'; } if ( ! empty( $padding_bottom ) ) { $styles .= 'padding-bottom: ' . $padding_bottom . ';'; } $styles .= '}'; wp_add_inline_style( 'astra-addon-css', $styles ); } } } /** * Remove Navigation Links. */ public function remove_navigation_markup() { $post_type = get_post_type(); if ( ASTRA_ADVANCED_HOOKS_POST_TYPE == $post_type ) { remove_action( 'astra_entry_after', 'astra_single_post_navigation_markup' ); } } /** * Add Styles */ public function add_styles() { $option = array( 'location' => 'ast-advanced-hook-location', 'exclusion' => 'ast-advanced-hook-exclusion', 'users' => 'ast-advanced-hook-users', ); $result = Astra_Target_Rules_Fields::get_instance()->get_posts_by_conditions( ASTRA_ADVANCED_HOOKS_POST_TYPE, $option ); foreach ( $result as $post_id => $post_data ) { if ( class_exists( 'Astra_Addon_Page_Builder_Compatibility' ) ) { $page_builder_base_instance = Astra_Addon_Page_Builder_Compatibility::get_instance(); $page_builder_instance = $page_builder_base_instance->get_active_page_builder( $post_id ); if ( is_callable( array( $page_builder_instance, 'enqueue_scripts' ) ) ) { $page_builder_instance->enqueue_scripts( $post_id ); } } } } /** * Load all Guttenberg compatibility styles & scripts. * * @since 2.5.1 */ public function load_ultimate_gutenberg_blocks_assets() { $option = array( 'location' => 'ast-advanced-hook-location', 'exclusion' => 'ast-advanced-hook-exclusion', 'users' => 'ast-advanced-hook-users', ); $result = Astra_Target_Rules_Fields::get_instance()->get_posts_by_conditions( ASTRA_ADVANCED_HOOKS_POST_TYPE, $option ); foreach ( $result as $post_id => $post_data ) { if ( class_exists( 'Astra_Addon_Gutenberg_Compatibility' ) ) { $astra_gutenberg_instance = new Astra_Addon_Gutenberg_Compatibility(); if ( is_callable( array( $astra_gutenberg_instance, 'enqueue_blocks_assets' ) ) ) { $astra_gutenberg_instance->enqueue_blocks_assets( $post_id ); } } } } /** * Don't display the elementor header footer templates on the frontend for non edit_posts capable users. * * @since 1.0.0 */ public function advanced_hook_template_frontend() { if ( is_singular( ASTRA_ADVANCED_HOOKS_POST_TYPE ) && ! current_user_can( 'edit_posts' ) ) { wp_safe_redirect( site_url(), 301 ); die; } } /** * Advanced Hooks markup loader * * Loads appropriate template file based on the style option selected in options panel. * * @since 1.0.0 */ public function load_markup() { $option = array( 'location' => 'ast-advanced-hook-location', 'exclusion' => 'ast-advanced-hook-exclusion', 'users' => 'ast-advanced-hook-users', 'enabled' => 'ast-advanced-hook-enabled', // to prevent irrelevant parent container markup. ); $result = Astra_Target_Rules_Fields::get_instance()->get_posts_by_conditions( ASTRA_ADVANCED_HOOKS_POST_TYPE, $option ); $header_counter = 0; $footer_counter = 0; $layout_404_counter = 0; foreach ( $result as $post_id => $post_data ) { $post_type = get_post_type(); if ( ASTRA_ADVANCED_HOOKS_POST_TYPE != $post_type ) { $action = get_post_meta( $post_id, 'ast-advanced-hook-action', true ); $layout = get_post_meta( $post_id, 'ast-advanced-hook-layout', false ); $priority = get_post_meta( $post_id, 'ast-advanced-hook-priority', true ); add_action( 'wp_enqueue_scripts', function() use ( $post_id ) { $styles = ''; // Add VC style if it is activated. $wpb_custom_css = get_post_meta( $post_id, '_wpb_shortcodes_custom_css', true ); $styles .= $wpb_custom_css; $padding = get_post_meta( $post_id, 'ast-advanced-hook-padding', true ); $padding_top = isset( $padding['top'] ) ? $padding['top'] : ''; $padding_top = is_numeric( $padding_top ) ? $padding_top . 'px' : $padding_top; $padding_bottom = isset( $padding['bottom'] ) ? $padding['bottom'] : ''; $padding_bottom = is_numeric( $padding_bottom ) ? $padding_bottom . 'px' : $padding_bottom; if ( ! ( empty( $padding_top ) && empty( $padding_bottom ) ) ) { $styles .= ' .astra-advanced-hook-' . $post_id . ' { '; if ( ! empty( $padding_top ) ) { $styles .= 'padding-top: ' . $padding_top . ';'; } if ( ! empty( $padding_bottom ) ) { $styles .= 'padding-bottom: ' . $padding_bottom . ';'; } $styles .= '}'; wp_add_inline_style( 'astra-addon-css', $styles ); } } ); if ( isset( $layout[0] ) && '404-page' == $layout[0] && 0 == $layout_404_counter ) { $this->prepare_astra_header_filter( $post_id, '404-page' ); add_action( 'astra_get_content_layout', 'astra_addon_return_content_layout_page_builder' ); add_action( 'astra_page_layout', 'astra_addon_return_page_layout_no_sidebar' ); $layout_404_settings = get_post_meta( $post_id, 'ast-404-page', true ); if ( isset( $layout_404_settings['disable_header'] ) && 'enabled' == $layout_404_settings['disable_header'] ) { remove_action( 'astra_header', 'astra_header_markup' ); if ( true === astra_addon_builder_helper()->is_header_footer_builder_active ) { remove_action( 'astra_header', array( Astra_Builder_Header::get_instance(), 'prepare_header_builder_markup' ) ); } } if ( isset( $layout_404_settings['disable_footer'] ) && 'enabled' == $layout_404_settings['disable_footer'] ) { remove_action( 'astra_footer', 'astra_footer_markup' ); if ( true === astra_addon_builder_helper()->is_header_footer_builder_active ) { remove_action( 'astra_footer', array( Astra_Builder_Footer::get_instance(), 'footer_markup' ) ); } } add_action( 'astra_entry_content_404_page', function() use ( $post_id ) { Astra_Ext_Advanced_Hooks_Markup::get_instance()->get_action_content( $post_id ); }, $priority ); $layout_404_counter ++; } elseif ( isset( $layout[0] ) && 'header' == $layout[0] && 0 == $header_counter ) { $this->prepare_astra_header_filter( $post_id, 'header' ); if ( true === astra_addon_builder_helper()->is_header_footer_builder_active ) { remove_action( 'astra_header', array( Astra_Builder_Header::get_instance(), 'prepare_header_builder_markup' ) ); } $action = 'astra_custom_header'; // if astra_custom_header not exist then call astra_header. if ( ! has_action( 'astra_custom_header' ) ) { $action = 'astra_header'; } add_action( $action, function() use ( $post_id ) { echo '
'; Astra_Ext_Advanced_Hooks_Markup::get_instance()->get_action_content( $post_id ); echo '
'; }, $priority ); $header_counter++; } elseif ( isset( $layout[0] ) && 'footer' == $layout[0] && 0 == $footer_counter ) { $this->prepare_astra_header_filter( $post_id, 'footer' ); if ( true === astra_addon_builder_helper()->is_header_footer_builder_active ) { remove_action( 'astra_footer', array( Astra_Builder_Footer::get_instance(), 'footer_markup' ) ); } $action = 'astra_custom_footer'; // if astra_custom_footer not exist then call astra_footer. if ( ! has_action( 'astra_custom_footer' ) ) { $action = 'astra_footer'; } // Add Action for custom header advanced-hooks. add_action( $action, function() use ( $post_id ) { echo ''; }, $priority ); $footer_counter++; } elseif ( isset( $layout[0] ) && 'content' == $layout[0] ) { add_filter( 'render_block', function ( $content, $parsed_block ) use ( $post_id ) { return Astra_Ext_Advanced_Hooks_Markup::get_instance()->render_inside_content( $post_id, $content, $parsed_block ); }, 10, 2 ); } if ( isset( $layout[0] ) && 'hooks' === $layout[0] ) { if ( 'custom_hook' === $action ) { $action = get_post_meta( $post_id, 'ast-custom-hook', true ); } // Add Action for advanced-hooks. add_action( $action, function() use ( $post_id ) { Astra_Ext_Advanced_Hooks_Markup::get_instance()->get_action_content( $post_id ); }, $priority ); } } } } /** * Generates block array with layout content. * * @param int $post_id Post ID. * @since 3.2.0 */ public function generate_blocks( $post_id ) { $blocks = array(); ob_start(); self::get_instance()->get_action_content( $post_id ); $content = ob_get_clean(); $blocks = array( array( 'blockName' => 'core/html', 'attrs' => array(), 'innerBlocks' => array(), 'innerHTML' => $content, 'innerContent' => array( $content ), ), ); return $blocks; } /** * Insert array at specific position. * * @param array $array Array. * @param int $position position of new array element. * @param array $insert_array Array needs to be inserted. * @since 3.2.0 */ public function array_insert( &$array, $position, $insert_array ) { $first_array = array_splice( $array, 0, $position ); $array = array_merge( $first_array, $insert_array, $array ); } /** * Prepare a class to hide custom layout as per selected device. * * @param int $post_id post id. * @param bool $hide_classes get the hide/show classes. * @return string */ public function get_display_device( $post_id, $hide_classes = true ) { // bail early if the custom layout or hook is disabled. if ( 'no' === get_post_meta( $post_id, 'ast-advanced-hook-enabled', true ) ) { return ''; } $classes = ''; $display_device = get_post_meta( $post_id, 'ast-advanced-display-device', true ); $devices = array( 'desktop', 'tablet', 'mobile' ); if ( '' === $display_device ) { $display_device = $devices; // Managing backward compatibility. } if ( ! is_array( $display_device ) ) { return $classes; } if ( $hide_classes ) { $devices = array( 'desktop', 'tablet', 'mobile' ); $display_device = array_diff( $devices, $display_device ); } if ( ! empty( $display_device ) ) { $classes = implode( ' ', preg_filter( '/^/', 'ast-hide-display-device-', $display_device ) ); } return $classes; } /** * Check if post eligible to show on time duration * * @param int $post_id post id. */ public static function get_time_duration_eligibility( $post_id ) { $time_duration = get_post_meta( $post_id, 'ast-advanced-time-duration', 'true' ); if ( isset( $time_duration['enabled'] ) && 'enabled' !== $time_duration['enabled'] ) { return true; // Eligible to display as not enabled time duration. } $start_dt = isset( $time_duration['start-dt'] ) ? strtotime( $time_duration['start-dt'] ) : false; $end_dt = isset( $time_duration['end-dt'] ) ? strtotime( $time_duration['end-dt'] ) : false; $current_dt = strtotime( current_time( 'mysql' ) ); if ( $start_dt && $start_dt > $current_dt ) { return false; // Not eligible if not started yet. } if ( $end_dt && $end_dt < $current_dt ) { return false; // Not eligible if already time passed. } return true; // Fallback true. } /** * Advanced Hooks get content * * Loads content * * @since 1.0.0 * @param int $post_id post id. */ public function get_action_content( $post_id ) { $enabled = get_post_meta( $post_id, 'ast-advanced-hook-enabled', true ); if ( false === apply_filters( 'astra_addon_render_custom_layout_content', true, $post_id ) || 'no' === $enabled ) { return; } if ( ! static::get_time_duration_eligibility( $post_id ) ) { return; } $action = get_post_meta( $post_id, 'ast-advanced-hook-action', true ); $display_device_classes = $this->get_display_device( $post_id ); // Exclude default parent div wrapper from the content if selected hook is from exclude hooks list. $exclude_wrapper_hooks = $this->get_exclude_wrapper_hooks(); $with_wrapper = ! in_array( $action, $exclude_wrapper_hooks ); if ( $with_wrapper ) { ?>
get_active_page_builder( $post_id ); $page_builder_instance->render_content( $post_id ); } } if ( $with_wrapper ) { ?>
'ast-advanced-hook-location', 'exclusion' => 'ast-advanced-hook-exclusion', 'users' => 'ast-advanced-hook-users', ); $result = Astra_Target_Rules_Fields::get_instance()->get_posts_by_conditions( ASTRA_ADVANCED_HOOKS_POST_TYPE, $option ); $counter_header = 0; $counter_footer = 0; foreach ( $result as $post_id => $post_data ) { $post_type = get_post_type(); if ( ASTRA_ADVANCED_HOOKS_POST_TYPE != $post_type ) { $header = get_post_meta( $post_id, 'ast-advanced-hook-header', true ); $footer = get_post_meta( $post_id, 'ast-advanced-hook-footer', true ); $layout = get_post_meta( $post_id, 'ast-advanced-hook-layout', false ); if ( 0 == $counter_header && isset( $layout[0] ) && 'header' == $layout[0] ) { $localize_vars['hook_sticky_header'] = isset( $header['sticky'] ) ? $header['sticky'] : ''; $localize_vars['hook_shrink_header'] = isset( $header['shrink'] ) ? $header['shrink'] : ''; $localize_vars['hook_sticky_header_on_devices'] = isset( $header['sticky-header-on-devices'] ) ? $header['sticky-header-on-devices'] : ''; $localize_vars['hook_custom_header_break_point'] = apply_filters( 'astra_custom_header_break_point', 921 ); $counter_header++; } if ( 0 == $counter_footer && isset( $layout[0] ) && 'footer' == $layout[0] ) { $localize_vars['hook_sticky_footer'] = isset( $footer['sticky'] ) ? $footer['sticky'] : ''; $localize_vars['hook_sticky_footer_on_devices'] = isset( $footer['sticky-footer-on-devices'] ) ? $footer['sticky-footer-on-devices'] : ''; $localize_vars['hook_custom_footer_break_point'] = apply_filters( 'astra_custom_footer_break_point', 921 ); $counter_footer++; } } } return $localize_vars; } /** * Add Body Classes * * @param array $classes Body Class Array. * @return array */ public function body_classes( $classes ) { // Apply Above Below header layout class to the body. $option = array( 'location' => 'ast-advanced-hook-location', 'exclusion' => 'ast-advanced-hook-exclusion', 'users' => 'ast-advanced-hook-users', ); $result = Astra_Target_Rules_Fields::get_instance()->get_posts_by_conditions( ASTRA_ADVANCED_HOOKS_POST_TYPE, $option ); $counter = 0; foreach ( $result as $post_id => $post_data ) { $post_type = get_post_type(); if ( ASTRA_ADVANCED_HOOKS_POST_TYPE != $post_type ) { $footer = get_post_meta( $post_id, 'ast-advanced-hook-footer', true ); $layout = get_post_meta( $post_id, 'ast-advanced-hook-layout', false ); if ( 0 == $counter && isset( $layout[0] ) && 'footer' == $layout[0] ) { if ( isset( $footer['sticky'] ) && 'enabled' == $footer['sticky'] && isset( $footer['sticky-footer-on-devices'] ) && ( 'desktop' == $footer['sticky-footer-on-devices'] || 'both' == $footer['sticky-footer-on-devices'] ) && ! wp_is_mobile() ) { $classes[] = 'ast-footer-sticky-active'; } if ( isset( $footer['sticky'] ) && 'enabled' == $footer['sticky'] && isset( $footer['sticky-footer-on-devices'] ) && 'mobile' == $footer['sticky-footer-on-devices'] && wp_is_mobile() ) { $classes[] = 'ast-footer-sticky-active'; } $counter++; } if ( self::is_elementor_activated( $post_id ) && is_404() ) { $classes[] = 'elementor-page elementor-page-' . $post_id; } } } return $classes; } /** * Dynamic CSS * * @param string $dynamic_css Astra Dynamic CSS. * @param string $dynamic_css_filtered Astra Dynamic CSS Filters. * @return string */ public function astra_ext_advanced_hooks_dynamic_css( $dynamic_css, $dynamic_css_filtered = '' ) { /** * - Variable Declaration */ $page_width = '100%'; $parse_css = ''; $layout = astra_get_option( 'site-layout', 'ast-full-width-layout' ); // set page width depending on site layout. if ( 'ast-box-layout' == $layout ) { $page_width = astra_get_option( 'site-layout-box-width' ) . 'px'; } /* Box Layout CSS */ if ( 'ast-box-layout' == $layout ) : $box_css = array( '.ast-custom-header, .ast-custom-footer' => array( 'max-width' => $page_width, 'margin-left' => 'auto', 'margin-right' => 'auto', ), ); $parse_css .= astra_parse_css( $box_css ); endif; return $dynamic_css . $parse_css; } /** * Check is elementor activated. * * @param int $id Post/Page Id. * @return boolean */ public static function is_elementor_activated( $id ) { if ( ! class_exists( '\Elementor\Plugin' ) ) { return false; } if ( version_compare( ELEMENTOR_VERSION, '1.5.0', '<' ) ) { return ( 'builder' === Elementor\Plugin::$instance->db->get_edit_mode( $id ) ); } else { $elementor_document = Elementor\Plugin::$instance->documents->get( $id ); if ( $elementor_document ) { return $elementor_document->is_built_with_elementor(); } else { return false; } } } /** * Set the hash of duplicated content. * * @var array * @since 4.6.10 */ private static $duplicate_content_hash = array(); /** * Create layout blocks data to insert in content. * * @param int $post_id post ID. * @param string $content block content. * @param array $parsed_block Block array. * @since 3.2.0 */ public function render_inside_content( $post_id, $content, $parsed_block ) { // We don't want to run this filter when we are processing layout content as it will result in infinite loop. if ( true === $this->is_layout_content_in_process ) { return $content; } $layout_meta = get_post_meta( $post_id, 'ast-advanced-hook-content', true ); $location = isset( $layout_meta['location'] ) ? $layout_meta['location'] : 0; $this->is_layout_content_in_process = true; if ( 'after_blocks' === $location ) { $after_blocks = isset( $layout_meta['after_block_number'] ) ? $layout_meta['after_block_number'] : 0; // Match block index with After Blocks number and display the content. if ( isset( $parsed_block['firstLevelBlock'] ) && $parsed_block['firstLevelBlock'] && isset( $parsed_block['firstLevelBlockIndex'] ) && intval( $parsed_block['firstLevelBlockIndex'] ) + 1 === intval( $after_blocks ) ) { ob_start(); self::get_instance()->get_action_content( $post_id ); $layout_content = ob_get_clean(); $layout_content_hash = hash( 'sha256', $layout_content ); if ( ! in_array( $layout_content_hash, self::$duplicate_content_hash, true ) ) { /** * Only concat the "$layout_content" to "$content" if it is not already rendered. */ $content .= $layout_content; } self::$duplicate_content_hash[] = $layout_content_hash; } } elseif ( 'before_headings' === $location ) { $headings_number = isset( $layout_meta['before_heading_number'] ) ? $layout_meta['before_heading_number'] : 0; // Match block index with before headings number and display the content. if ( isset( $parsed_block['firstLevelBlock'] ) && $parsed_block['firstLevelBlock'] && isset( $parsed_block['firstLevelHeadingIndex'] ) && intval( $parsed_block['firstLevelHeadingIndex'] ) + 1 === intval( $headings_number ) ) { ob_start(); self::get_instance()->get_action_content( $post_id ); $layout_content = ob_get_clean(); $layout_content_hash = hash( 'sha256', $layout_content ); if ( ! in_array( $layout_content_hash, self::$duplicate_content_hash, true ) ) { /** * Only concat the "$layout_content" to "$content" if it is not already rendered. */ $content = $layout_content . $content; } self::$duplicate_content_hash[] = $layout_content_hash; } } $this->is_layout_content_in_process = false; return $content; } } } /** * Kicking this off by calling 'get_instance()' method */ Astra_Ext_Advanced_Hooks_Markup::get_instance();