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

664 lines
22 KiB
PHP

<?php
/**
* Advanced Headers Markup
*
* @package Astra Addon
*/
if ( ! class_exists( 'Astra_Ext_Advanced_Headers_Markup' ) ) {
/**
* Advanced Headers Markup Initial Setup
*
* @since 1.0.0
*/
// @codingStandardsIgnoreStart
class Astra_Ext_Advanced_Headers_Markup {
// @codingStandardsIgnoreEnd
/**
* Member Variable
*
* @var object instance
*/
private static $instance;
/**
* Initiator
*/
public static function get_instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor
*/
public function __construct() {
add_filter( 'body_class', array( $this, 'body_classes' ), 10, 1 );
add_filter( 'get_the_archive_title', array( $this, 'archive_title' ) );
/* Fixed site logo markup */
add_action( 'astra_header', array( $this, 'page_header_logo' ), 1 );
// Remove single Page/Post featured image.
add_filter( 'astra_featured_image_enabled', array( $this, 'remove_post_thumbnail' ), 10 );
// Advanced Header with Merge header action.
add_action( 'astra_header_before', array( $this, 'advanced_header_merged' ) );
// Advanced Headers action.
add_action( 'astra_header_after', array( $this, 'load_markup' ), 0 );
add_filter( 'wp_nav_menu_args', array( $this, 'custom_primary_menu' ) );
add_action( 'wp_enqueue_scripts', array( $this, 'add_scripts' ), 9 );
/**
* Metabox setup
*/
add_filter( 'astra_meta_box_options', array( $this, 'add_options' ) );
add_action( 'astra_meta_box_markup_after', array( $this, 'add_options_markup' ) );
add_filter( 'astra_get_option_header-main-rt-section', array( $this, 'header_custom_menu_item' ) );
add_filter( 'astra_get_option_header-display-outside-menu', array( $this, 'header_display_outside_menu' ) );
add_filter( 'astra_get_option_header-main-rt-section-html', array( $this, 'header_custom_menu_text' ) );
add_filter( 'astra_search_style_header_main_rt_section', array( $this, 'default_search_type' ) );
add_filter( 'astra_breadcrumb_enabled', array( $this, 'disable_breadcrumb_page_header' ) );
}
/**
* Disable breadcrumb if Page Header already has Breadcrumb enabled.
*
* @param boolean $status checks ruleset value.
* @return boolean
*/
public function disable_breadcrumb_page_header( $status ) {
$show_breadcrumb = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'breadcrumb' );
if ( $show_breadcrumb ) {
$status = false;
}
return $status;
}
/**
* Advanced Header Search Style
*
* @param string $default Search style.
* @return string
*/
public function default_search_type( $default ) {
$search_style = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'search-style' );
if ( ! empty( $search_style ) && 'default' !== $search_style ) {
return $search_style;
}
return $default;
}
/**
* Advanced Header Custom Menu Text/HTML
*
* @param html $value Custom menu text/html.
* @return html
*/
public function header_custom_menu_text( $value ) {
$custom_menu_item = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'custom-menu-item' );
if ( ! ( self::advanced_header_enabled() ) || ( is_front_page() && 'posts' == get_option( 'show_on_front' ) ) || 'default' == $custom_menu_item || '' == $custom_menu_item ) {
return $value;
}
$custom_html = '';
$custom_html_content = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'custom-menu-item-text-html' );
if ( ! empty( $custom_html_content ) ) {
$custom_html = do_shortcode( $custom_html_content );
} elseif ( current_user_can( 'edit_theme_options' ) ) {
$id = Astra_Ext_Advanced_Headers_Data::get_current_page_header_ids();
$page_header_url = get_edit_post_link( $id );
$custom_html = '<a href="' . esc_url( $page_header_url ) . '">' . __( 'Add Custom HTML', 'astra-addon' ) . '</a>';
}
return html_entity_decode( $custom_html, ENT_COMPAT, 'UTF-8' );
}
/**
* Advanced Header Custom Menu Outside/Inside
*
* @param string|boolean $value display menu outside or not.
* @return string|boolean
*/
public function header_display_outside_menu( $value ) {
$custom_menu_item = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'custom-menu-item' );
if ( ! ( self::advanced_header_enabled() ) || ( is_front_page() && 'posts' == get_option( 'show_on_front' ) ) || 'default' == $custom_menu_item || '' == $custom_menu_item ) {
return $value;
}
$display_outside = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'custom-menu-item-outside' );
return $display_outside;
}
/**
* Advanced Header Custom Menu Item
*
* @param string $value Custom Menu Item.
* @return string
*/
public function header_custom_menu_item( $value ) {
$custom_menu_item = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'custom-menu-item' );
if ( ! ( self::advanced_header_enabled() ) || ( is_front_page() && 'posts' == get_option( 'show_on_front' ) ) || 'default' == $custom_menu_item || '' == $custom_menu_item ) {
return $value;
}
return $custom_menu_item;
}
/**
* Remove Post Featured Image If advanced headers is enable with featured image as background image
*
* @param boolean $is_featured Markup of featured image.
* @return boolean $is_featured
*/
public function remove_post_thumbnail( $is_featured ) {
if ( self::advanced_header_enabled() ) {
if ( ! ( is_archive() || is_home() || is_search() || is_404() || wp_doing_ajax() ) ) {
$page_post_featured = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'page-post-featured' );
$advanced_headers_layout = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'layout' );
// If selected Post / Page Featured image.
if ( 'disable' != $advanced_headers_layout && 'enabled' == $page_post_featured ) {
$is_featured = false;
}
}
}
return $is_featured;
}
/**
* Add cutom Logo for Advanced Headers
*
* @param string $html Markup of custom logo.
* @param string $blog_id blog id.
* @return strung $html updated Markup of Custom Logo.
*/
public function add_custom_logo( $html, $blog_id ) {
$advanced_headers_merged = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'merged' );
$advanced_headers_inherit_logo = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'diff-header-logo' );
if ( ! $advanced_headers_merged || ( is_front_page() && 'posts' == get_option( 'show_on_front' ) ) || 'enabled' != $advanced_headers_inherit_logo ) {
return $html;
}
$custom_logo_id = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'logo-id' );
// Site logo.
if ( $custom_logo_id ) {
add_filter( 'astra_main_header_retina', '__return_false' );
add_filter( 'wp_get_attachment_image_attributes', array( $this, 'adv_replace_header_logo_attr' ), 10, 3 );
// Custom Site logo.
$html = sprintf(
'<a href="%1$s" class="custom-logo-link advanced-header-logo" rel="home" %3$s >%2$s</a>',
esc_url( home_url( '/' ) ),
wp_get_attachment_image(
$custom_logo_id,
'ast-adv-header-logo-size',
false,
array(
'class' => 'custom-logo',
)
),
astra_attr(
'site-title-custom-link',
array(
'class' => '',
)
)
);
remove_filter( 'wp_get_attachment_image_attributes', array( $this, 'adv_replace_header_logo_attr' ) );
}
return $html;
}
/**
* Replace header logo.
*
* @param array $attr Image.
* @param object $attachment Image obj.
* @param sting $size Size name.
*
* @return array Image attr.
*/
public function adv_replace_header_logo_attr( $attr, $attachment, $size ) {
$custom_logo_id = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'logo-id' );
if ( $custom_logo_id == $attachment->ID ) {
$attach_data = array();
$attach_data = wp_get_attachment_image_src( $attachment->ID, 'ast-adv-header-logo-size' );
if ( isset( $attach_data[0] ) ) {
$attr['src'] = $attach_data[0];
}
$file_type = wp_check_filetype( $attr['src'] );
$file_extension = $file_type['ext'];
if ( 'svg' == $file_extension ) {
$attr['width'] = '100%';
$attr['height'] = '100%';
$attr['class'] = 'astra-logo-svg';
}
$diff_retina_logo = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'diff-header-retina-logo' );
if ( 'enabled' === $diff_retina_logo ) {
$custom_logo = $attr['src'];
$retina_logo = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'retina-logo-url' );
$attr['srcset'] = '';
if ( '' !== $retina_logo ) {
if ( astra_check_is_ie() ) {
// Replace header logo url to retina logo url.
$attr['src'] = $retina_logo;
}
$attr['srcset'] = $custom_logo . ' 1x, ' . $retina_logo . ' 2x';
}
}
}
return $attr;
}
/**
* Remove Prefix : from Archive title
*
* @param string $title Default title.
* @return string $title updated title.
*/
public function archive_title( $title ) {
if ( is_category() ) {
$title = single_cat_title( '', false );
} elseif ( is_tag() ) {
$title = single_tag_title( '', false );
} elseif ( is_author() ) {
// Added author details with hCard if schema is enabled.
$title = '<span ' . astra_attr( 'archive-meta-author', array( 'class' => '' ) ) . '>' . get_the_author() . '</span>';
} elseif ( is_tax() ) {
$title = single_term_title( '', false );
}
return $title;
}
/**
* Add Body Classes
*
* @param array $classes Body Class Array.
* @return array
*/
public function body_classes( $classes ) {
$advanced_headers_layout = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'layout' );
$transparent_header = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'merged' );
$custom_logo_id = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'logo-id' );
// Site logo.
if ( $custom_logo_id && $transparent_header ) {
$classes[] = 'ast-advanced-headers-different-logo';
}
if ( $advanced_headers_layout ) {
$classes[] = 'ast-advanced-headers';
}
if ( 'enabled' == $transparent_header && 'disable' == $advanced_headers_layout ) {
// Add class.
$classes[] = 'ast-transparent-header';
}
return $classes;
}
/**
* Advanced Headers Bar markup loader if we are using merged with header
*
* @since 1.0.0
*/
public function advanced_header_merged() {
// Get our options.
$advanced_headers_merged = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'merged' );
$advanced_header_bg_size = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'bg-size' );
$advanced_header_parallax_device = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'parallax-device' );
if ( ! self::advanced_header_enabled() || ( is_front_page() && 'posts' == get_option( 'show_on_front' ) ) ) {
return;
}
if ( ! $advanced_headers_merged ) {
return;
}
$combined = 'ast-merged-advanced-header ast-title-bar-wrap';
// Parallax variable.
$parallax = ( 'none' !== $advanced_header_parallax_device ) ? ' ast-advanced-headers-parallax' : '';
// Parallax Device.
$parallax_device = ( 'none' !== $advanced_header_parallax_device ) ? $advanced_header_parallax_device : '';
// Parallax speed variable.
$parallax_speed = apply_filters( 'astra_advanced_header_parallax_speed', 2 );
// Full Screen vertical align center.
$vertical_center = ' ast-advanced-headers-vertical-center';
// Full Screen.
$full_screen = ( 'full-screen' == $advanced_header_bg_size ) ? ' ast-full-advanced-header' : '';
// Add advanced header wrapper classes.
printf(
'<div class="%1$s" %2$s %3$s>',
esc_attr( $combined ) . esc_attr( $parallax ) . esc_attr( $full_screen ) . esc_attr( $vertical_center ),
( ! empty( $parallax ) ) ? 'data-parallax-speed="' . esc_attr( $parallax_speed ) . '" data-parallax-device="' . esc_attr( $parallax_device ) . '"' : '',
'aria-label="' . esc_attr( $this->get_header_background_image_alt_text() ) . '"'
);
}
/**
* Advanced Headers markup loader
*
* Loads appropriate template file based on the style option selected in options panel.
*
* @since 1.0.0
*/
public function load_markup() {
// Get our options.
$advanced_headers_layout = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'layout' );
$advanced_headers_merged = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'merged' );
$advanced_header_bg_size = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'bg-size' );
$advanced_header_parallax_device = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'parallax-device' );
if ( ! self::advanced_header_enabled() || ( is_front_page() && 'posts' == get_option( 'show_on_front' ) ) ) {
return;
}
if ( ! $advanced_headers_merged ) {
$combined = 'ast-title-bar-wrap';
// Parallax variable.
$parallax = ( 'none' !== $advanced_header_parallax_device ) ? ' ast-advanced-headers-parallax' : '';
// Parallax Device.
$parallax_device = ( 'none' !== $advanced_header_parallax_device ) ? $advanced_header_parallax_device : '';
// Parallax speed variable.
$parallax_speed = apply_filters( 'astra_advanced_header_parallax_speed', 2 );
// Full Screen vertical align center.
$vertical_center = ' ast-advanced-headers-vertical-center';
// Full Screen.
$full_screen = ( 'full-screen' == $advanced_header_bg_size ) ? ' ast-full-advanced-header' : '';
// Add advanced header wrapper classes.
printf(
'<div class="%1$s" %2$s %3$s>',
esc_attr( $combined ) . esc_attr( $parallax ) . esc_attr( $full_screen ) . esc_attr( $vertical_center ),
( ! empty( $parallax ) ) ? 'data-parallax-speed="' . esc_attr( $parallax_speed ) . '" data-parallax-device="' . esc_attr( $parallax_device ) . '"' : '',
'aria-label="' . esc_attr( $this->get_header_background_image_alt_text() ) . '"'
);
}
if ( $advanced_headers_layout && 'disable' !== $advanced_headers_layout ) {
// Add markup.
astra_addon_get_template( 'advanced-headers/template/' . $advanced_headers_layout . '.php' );
}
echo '</div>';
// Page Header with no content is selected.
if ( $advanced_headers_layout && 'disable' !== $advanced_headers_layout ) {
add_filter( 'astra_the_title_enabled', '__return_false' );
if ( is_singular() && Astra_Addon_Update_Filter_Function::astra_addon_restrict_banner_area_with_page_header() ) {
add_filter( 'astra_apply_hero_header_banner', '__return_false' ); // If page header is set then banner title area of layout-2 won't be visible.
}
}
}
/**
* Custom Primary Menu
*
* If custom primary menu is selected.
*
* @param array $args menu arguments.
* @return array $args menu arguments.
*/
public function custom_primary_menu( $args ) {
$transparent_header = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'merged' );
if ( ! ( self::advanced_header_enabled() || $transparent_header ) || ( is_front_page() && 'posts' == get_option( 'show_on_front' ) ) ) {
return $args;
}
$custom_menu = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'custom-menu' );
if ( ( '' != $custom_menu || 0 != $custom_menu ) && 'primary' == $args['theme_location'] ) {
$args['menu'] = $custom_menu;
}
return $args;
}
/**
* Next Breadcrumbs
*
* If yoast SEO breadcrumbs are active loads their function else loads custom breadcrumbs.
*
* @since 1.0.0
*/
public static function advanced_headers_breadcrumbs_markup() {
$show_breadcrumb = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'breadcrumb' );
if ( ! $show_breadcrumb ) {
return;
}
$id = Astra_Ext_Advanced_Headers_Data::get_current_page_header_ids();
$breadcrumb_old_version = get_post_meta( $id, 'astra-breadcrumb-old', true );
if ( true === apply_filters( 'astra_addon_advanced_headers_use_astra_breadcrumb_trail', false ) || 'true' !== $breadcrumb_old_version ) {
astra_get_breadcrumb();
} else {
$wpseo_option = get_option( 'wpseo_internallinks' );
if ( function_exists( 'yoast_breadcrumb' ) && $wpseo_option && true === $wpseo_option['breadcrumbs-enable'] ) {
yoast_breadcrumb( '<div id="breadcrumbs" >', '</div>' );
} else {
astra_breadcrumb();
}
}
}
/**
* Add Styles
*/
public function add_scripts() {
$advanced_headers_layout = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'layout' );
if ( ! self::advanced_header_enabled() || 'disable' == $advanced_headers_layout || ( is_front_page() && 'posts' == get_option( 'show_on_front' ) ) ) {
return;
}
if ( SCRIPT_DEBUG ) {
wp_enqueue_style( 'astra-advanced-headers-css', ASTRA_ADDON_EXT_ADVANCED_HEADERS_URL . 'assets/css/unminified/style.css', array(), ASTRA_EXT_VER );
wp_enqueue_style( 'astra-advanced-headers-layout-css', ASTRA_ADDON_EXT_ADVANCED_HEADERS_URL . 'assets/css/unminified/' . $advanced_headers_layout . '.css', array(), ASTRA_EXT_VER );
wp_enqueue_script( 'astra-advanced-headers-js', ASTRA_ADDON_EXT_ADVANCED_HEADERS_URL . 'assets/js/unminified/advanced-headers.js', array( 'jquery' ), ASTRA_EXT_VER, false );
} else {
wp_enqueue_style( 'astra-advanced-headers-css', ASTRA_ADDON_EXT_ADVANCED_HEADERS_URL . 'assets/css/minified/style.min.css', array(), ASTRA_EXT_VER );
wp_enqueue_style( 'astra-advanced-headers-layout-css', ASTRA_ADDON_EXT_ADVANCED_HEADERS_URL . 'assets/css/minified/' . $advanced_headers_layout . '.min.css', array(), ASTRA_EXT_VER );
wp_enqueue_script( 'astra-advanced-headers-js', ASTRA_ADDON_EXT_ADVANCED_HEADERS_URL . 'assets/js/minified/advanced-headers.min.js', array( 'jquery' ), ASTRA_EXT_VER, false );
}
}
/**
* Check transparent header is enabled or not
*/
public static function transparent_header_disabled_archive() {
$force_transparent_header = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_layout_option( 'force-transparent-disabled' );
if ( ! apply_filters( 'astra_transparent_header_disable', false ) && ! $force_transparent_header ) {
return true;
}
return false;
}
/**
* Check page header is enabled or not
*/
public static function advanced_header_enabled() {
$ids = Astra_Ext_Advanced_Headers_Data::get_current_page_header_ids();
if ( false == $ids ) {
return false;
}
return true;
}
/**
* Add Meta Options
*
* @param array $meta_option Page Meta.
* @return array
*/
public function add_options( $meta_option ) {
$meta_option['adv-header-id-meta'] = array(
'sanitize' => 'FILTER_SANITIZE_STRING',
'default' => astra_get_option_meta( 'adv-header-id-meta' ),
);
return $meta_option;
}
/**
* Sticky Header Meta Field markup
*
* Loads appropriate template file based on the style option selected in options panel.
*
* @param array $meta Page Meta.
* @since 1.0.0
*/
public function add_options_markup( $meta ) {
/**
* Get options
*/
$header_id = ( isset( $meta['adv-header-id-meta']['default'] ) ) ? $meta['adv-header-id-meta']['default'] : '';
$header_options = Astra_Target_Rules_Fields::get_post_selection( 'astra_adv_header' );
$show_meta_field = ! astra_check_is_bb_themer_layout();
if ( empty( $header_options ) ) {
$header_options = array(
'' => __( 'No Page Headers Found', 'astra-addon' ),
);
}
?>
<?php if ( $show_meta_field ) { ?>
<div class="adv-header-wrapper">
<p class="post-attributes-label-wrapper">
<strong> <?php esc_html_e( 'Page Header', 'astra-addon' ); ?> </strong><br/>
</p>
<select name="adv-header-id-meta" id="adv-header-id-meta">
<?php foreach ( $header_options as $key => $value ) { ?>
<option value="<?php echo esc_attr( $key ); ?>" <?php selected( $header_id, $key ); ?>> <?php echo esc_html( $value ); ?></option>
<?php } ?>
</select>
</div>
<?php
}
}
/**
* Page Header Logo
*
* @since 1.4.0
*/
public function page_header_logo() {
// Update site Logo for Merge header.
add_filter( 'astra_has_custom_logo', '__return_true', 10 );
add_filter( 'get_custom_logo', array( $this, 'add_custom_logo' ), 10, 2 );
}
/**
* Get Page Header Image Alt Text
*
* @since 2.2.0
* @return string Alt text if provided for the image else post/archive title.
*/
public function get_header_background_image_alt_text() {
$page_post_featured = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'page-post-featured' );
$bg_image = Astra_Ext_Advanced_Headers_Loader::astra_advanced_headers_design_option( 'bg-image' );
// If advanced header disabled.
$title_bar_bg_img = '';
if ( ( is_archive() || is_search() || is_404() || is_home() ) && $bg_image ) {
$title_bar_bg_img = $bg_image;
} else {
// If selected Post / Page Featured image.
if ( 'enabled' == $page_post_featured ) {
$src = wp_get_attachment_image_src( get_post_thumbnail_id( get_the_ID() ), 'thumbnail_size' );
if ( has_post_thumbnail( get_the_ID() ) && ! empty( $src ) ) {
$title_bar_bg_img = $src[0];
} else {
// Custom Background Image.
if ( $bg_image ) {
$title_bar_bg_img = $bg_image;
}
}
} else {
// Custom Background Image.
if ( $bg_image ) {
$title_bar_bg_img = $bg_image;
}
}
}
$img_alt_text = get_post_meta( attachment_url_to_postid( $title_bar_bg_img ), '_wp_attachment_image_alt', true );
if ( ! empty( $img_alt_text ) ) {
return esc_attr( $img_alt_text );
}
return __return_empty_string();
}
}
}
/**
* Kicking this off by calling 'get_instance()' method
*/
Astra_Ext_Advanced_Headers_Markup::get_instance();