oont-contents/plugins/astra-addon/addons/advanced-hooks/classes/class-astra-ext-advanced-hooks-markup.php
2025-02-08 15:10:23 +01:00

1248 lines
38 KiB
PHP

<?php
/**
* Advanced Hooks Markup
*
* @package Astra Addon
*/
if ( ! class_exists( 'Astra_Ext_Advanced_Hooks_Markup' ) ) {
/**
* Advanced Hooks Markup Initial Setup
*
* @since 1.0.0
*/
// @codingStandardsIgnoreStart
class Astra_Ext_Advanced_Hooks_Markup {
// @codingStandardsIgnoreEnd
/**
* Member Variable
*
* @var self instance
*/
private static $instance;
/**
* Member Variable
*
* @var bool is_layout_content_in_process
*/
private $is_layout_content_in_process = false;
/**
* Initiator
*/
public static function get_instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor
*/
public function __construct() {
// Overriding default layout using Custom Layout.
add_action( 'template_include', array( $this, 'override_template_include' ), 999 );
add_action( 'wp', array( $this, 'load_advanced_hooks_template' ), 1 );
add_action( 'wp', array( $this, 'load_markup' ), 1 );
add_action( 'wp', array( $this, 'remove_navigation_markup' ), 1 );
if ( defined( 'UAGB_VER' ) && version_compare( UAGB_VER, '1.23.0', '>=' ) ) {
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 '<header class="ast-custom-header" itemscope="itemscope" itemtype="https://schema.org/WPHeader">';
Astra_Ext_Advanced_Hooks_Markup::get_instance()->get_the_hook_content();
echo '</header>';
},
$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 '<footer class="ast-custom-footer" itemscope="itemscope" itemtype="https://schema.org/WPFooter">';
Astra_Ext_Advanced_Hooks_Markup::get_instance()->get_the_hook_content();
echo '</footer>';
},
$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 = '<div class="astra-advanced-hook-' . esc_attr( $post_id ) . ' ' . esc_attr( $display_device_classes ) . '">' . $content . '</div>';
}
}
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 '<header class="ast-custom-header" itemscope="itemscope" itemtype="https://schema.org/WPHeader">';
Astra_Ext_Advanced_Hooks_Markup::get_instance()->get_action_content( $post_id );
echo '</header>';
},
$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 '<footer class="ast-custom-footer" itemscope="itemscope" itemtype="https://schema.org/WPFooter">';
Astra_Ext_Advanced_Hooks_Markup::get_instance()->get_action_content( $post_id );
echo '</footer>';
},
$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 ) {
?>
<div class="astra-advanced-hook-<?php echo esc_attr( $post_id ); ?> <?php echo esc_attr( $display_device_classes ); ?>">
<?php
}
if ( ASTRA_WITH_EXTENDED_FUNCTIONALITY && astra_addon_is_code_editor_layout( $post_id ) ) {
astra_addon_echo_php_snippet( $post_id );
} else {
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 );
$page_builder_instance->render_content( $post_id );
}
}
if ( $with_wrapper ) {
?>
</div>
<?php
}
}
/**
* Add Styles Callback
*/
public function add_front_styles() {
/**
* Start Path Logic */
/* Define Variables */
$uri = ASTRA_ADDON_EXT_ADVANCED_HOOKS_URL . 'assets/css/';
$path = ASTRA_ADDON_EXT_ADVANCED_HOOKS_DIR . 'assets/css/';
$rtl = '';
if ( is_rtl() ) {
$rtl = '-rtl';
}
/* Directory and Extension */
$file_prefix = $rtl . '.min';
$dir_name = 'minified';
if ( SCRIPT_DEBUG ) {
$file_prefix = $rtl;
$dir_name = 'unminified';
}
$css_uri = $uri . $dir_name . '/';
$css_dir = $path . $dir_name . '/';
if ( defined( 'ASTRA_THEME_HTTP2' ) && ASTRA_THEME_HTTP2 ) {
$gen_path = $css_uri;
} else {
$gen_path = $css_dir;
}
/*** End Path Logic */
Astra_Minify::add_css( $gen_path . 'astra-hooks-sticky-header-footer' . $file_prefix . '.css' );
Astra_Minify::add_css( $gen_path . 'style' . $file_prefix . '.css' );
}
/**
* Add Scripts Callback
*/
public function add_scripts() {
/*** Start Path Logic */
/* Define Variables */
$uri = ASTRA_ADDON_EXT_ADVANCED_HOOKS_URL . 'assets/js/';
$path = ASTRA_ADDON_EXT_ADVANCED_HOOKS_DIR . 'assets/js/';
/* Directory and Extension */
$file_prefix = '.min';
$dir_name = 'minified';
if ( SCRIPT_DEBUG ) {
$file_prefix = '';
$dir_name = 'unminified';
}
$js_uri = $uri . $dir_name . '/';
$js_dir = $path . $dir_name . '/';
if ( defined( 'ASTRA_THEME_HTTP2' ) && ASTRA_THEME_HTTP2 ) {
$gen_path = $js_uri;
} else {
$gen_path = $js_dir;
}
/*** End Path Logic */
Astra_Minify::add_dependent_js( 'jquery' );
Astra_Minify::add_js( $gen_path . 'advanced-hooks-sticky-header-footer' . $file_prefix . '.js' );
}
/**
* Add Localize variables
*
* @param array $localize_vars Localize variables array.
* @return array
*/
public function localize_variables( $localize_vars ) {
$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_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();