geno/wp-content/themes/astra/inc/addons/transparent-header/classes/class-astra-ext-transparent-header-markup.php
2024-02-01 11:54:18 +00:00

387 lines
11 KiB
PHP

<?php
/**
* Transparent Header Markup
*
* @package Astra
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
if ( ! class_exists( 'Astra_ExtTransparenty_Header_Markup' ) ) {
/**
* Transparent Header Markup Initial Setup
*
* @since 1.0.0
*/
class Astra_Ext_Transparent_Header_Markup {
/**
* 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_action( 'body_class', array( $this, 'add_body_class' ) );
/* Fixed header markup */
add_action( 'astra_header', array( $this, 'transparent_header_logo' ), 1 );
/**
* 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_action( 'astra_customizer_save', array( $this, 'customizer_save' ) );
}
/**
* Add Body Classes
*
* @param array $classes Body Class Array.
* @return array
*/
public function add_body_class( $classes ) {
/** @psalm-suppress InvalidArgument */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$inherit_desk_logo = astra_get_option( 'different-transparent-logo', false );
$transparent_header_logo = astra_get_option( 'transparent-header-logo', true );
$transparent_header_logo_retina = astra_get_option( 'transparent-header-retina-logo', true );
if ( '1' == $inherit_desk_logo && ( '' !== $transparent_header_logo || '' !== $transparent_header_logo_retina ) ) {
$classes[] = 'ast-replace-site-logo-transparent';
}
if ( '1' !== $inherit_desk_logo ) {
$classes[] = 'ast-inherit-site-logo-transparent';
}
/**
* Add class 'ast-theme-transparent-header'
*/
if ( self::is_transparent_header() ) {
$classes[] = 'ast-theme-transparent-header';
}
return $classes;
}
/**
* Astra check if transparent header is enabled.
*
* @return boolean true/false.
*/
public static function is_transparent_header() {
// Transparent Header.
$enable_trans_header = astra_get_option( 'transparent-header-enable' );
$trans_meta_option = astra_get_option_meta( 'theme-transparent-header-meta', 'default' );
if ( $enable_trans_header ) {
if ( ( is_archive() || is_search() || is_404() ) && '1' == astra_get_option( 'transparent-header-disable-archive' ) ) {
$enable_trans_header = false;
}
if ( is_home() && '1' == astra_get_option( 'transparent-header-disable-index' ) && ( 'posts' !== get_option( 'show_on_front' ) ) ) {
$enable_trans_header = false;
}
if ( is_front_page() && 'posts' == get_option( 'show_on_front' ) && '1' == astra_get_option( 'transparent-header-disable-latest-posts-index' ) ) {
$enable_trans_header = false;
}
if ( is_page() && '1' == astra_get_option( 'transparent-header-disable-page' ) ) {
$enable_trans_header = false;
}
if ( is_single() && '1' == astra_get_option( 'transparent-header-disable-posts' ) ) {
$enable_trans_header = false;
}
}
if ( class_exists( 'Astra_Woocommerce' ) ) {
if ( is_product() && '1' == astra_get_option( 'transparent-header-disable-woo-products' ) ) {
$enable_trans_header = false;
}
}
// Force Meta settings to override global settings.
if ( 'enabled' === $trans_meta_option ) {
$enable_trans_header = true;
} elseif ( 'disabled' === $trans_meta_option ) {
$enable_trans_header = false;
}
return apply_filters( 'astra_is_transparent_header', $enable_trans_header );
}
/**
* Site Header - <header>
*
* @since 1.0.0
*/
public function transparent_header_logo() {
/** @psalm-suppress InvalidArgument */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$inherit_desk_logo = astra_get_option( 'different-transparent-logo', false );
$transparent_header_logo = astra_get_option( 'transparent-header-logo' );
if ( self::is_transparent_header() && '1' == $inherit_desk_logo && '' !== $transparent_header_logo ) {
// Logo For None Effect.
add_filter( 'astra_has_custom_logo', '__return_true' );
add_filter( 'get_custom_logo', array( $this, 'transparent_custom_logo' ), 10, 2 );
}
}
/**
* Replace transparent header logo.
*
* @param sting $html Size name.
* @param int $blog_id Icon.
*
* @return string html markup of logo.
*/
public function transparent_custom_logo( $html, $blog_id ) {
$trans_logo = astra_get_option( 'transparent-header-logo' );
$transparent_header_devices = astra_get_option( 'transparent-header-on-devices' );
if ( '' !== $trans_logo ) {
/* Replace transparent header logo and width */
add_filter( 'wp_get_attachment_image_attributes', array( $this, 'replace_trans_header_attr' ), 10, 3 );
$custom_logo_id = attachment_url_to_postid( $trans_logo );
$size = 'ast-transparent-logo-size';
if ( is_customize_preview() ) {
$size = 'full';
}
$html = sprintf(
'<a href="%1$s" class="custom-logo-link transparent-custom-logo" rel="home" itemprop="url" aria-label="%3$s">%2$s</a>',
esc_url( home_url( '/' ) ),
wp_get_attachment_image(
$custom_logo_id,
$size,
false,
array(
'class' => 'custom-logo',
)
),
get_bloginfo()
);
if ( 'mobile' === $transparent_header_devices ) {
$html .= sprintf(
'<a href="%1$s" class="custom-logo-link ast-transparent-desktop-logo" rel="home" itemprop="url">%2$s</a>',
esc_url( home_url( '/' ) ),
wp_get_attachment_image(
get_theme_mod( 'custom_logo' ),
$size,
false,
array(
'class' => 'custom-logo',
)
)
);
}
if ( 'desktop' === $transparent_header_devices ) {
$html .= sprintf(
'<a href="%1$s" class="custom-logo-link ast-transparent-mobile-logo" rel="home" itemprop="url">%2$s</a>',
esc_url( home_url( '/' ) ),
wp_get_attachment_image(
get_theme_mod( 'custom_logo' ),
$size,
false,
array(
'class' => 'custom-logo',
)
)
);
}
remove_filter( 'wp_get_attachment_image_attributes', array( $this, 'replace_trans_header_attr' ) );
}
return $html;
}
/**
* Replace transparent header logo.
*
* @param array $attr Image.
* @param object $attachment Image obj.
* @param sting $size Size name.
*
* @return array Image attr.
*/
public function replace_trans_header_attr( $attr, $attachment, $size ) {
$trans_logo = astra_get_option( 'transparent-header-logo' );
$custom_logo_id = attachment_url_to_postid( $trans_logo );
if ( $custom_logo_id == $attachment->ID ) {
$attach_data = array();
if ( ! is_customize_preview() ) {
$attach_data = wp_get_attachment_image_src( $attachment->ID, 'ast-transparent-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['class'] = 'astra-logo-svg';
}
$diff_retina_logo = astra_get_option( 'different-transparent-retina-logo' );
if ( '1' == $diff_retina_logo ) {
$retina_logo = astra_get_option( 'transparent-header-retina-logo' );
$attr['srcset'] = '';
if ( apply_filters( 'astra_transparent_header_retina', true ) && '' !== $retina_logo ) {
$cutom_logo = wp_get_attachment_image_src( $custom_logo_id, 'full' );
$cutom_logo_url = $cutom_logo[0];
if ( astra_check_is_ie() ) {
// Replace header logo url to retina logo url.
$attr['src'] = $retina_logo;
}
$attr['srcset'] = $cutom_logo_url . ' 1x, ' . $retina_logo . ' 2x';
}
}
}
return $attr;
}
/**
* Add Meta Options
*
* @param array $meta_option Page Meta.
* @return array
*/
public function add_options( $meta_option ) {
$meta_option['theme-transparent-header-meta'] = array(
'sanitize' => 'FILTER_SANITIZE_STRING',
);
return $meta_option;
}
/**
* Transparent 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
*/
$trans_header_meta = ( isset( $meta['theme-transparent-header-meta']['default'] ) ) ? $meta['theme-transparent-header-meta']['default'] : 'default';
$show_meta_field = ! astra_check_is_bb_themer_layout();
?>
<?php if ( $show_meta_field ) { ?>
<div class="transparent-header-wrapper">
<p class="post-attributes-label-wrapper">
<strong> <?php esc_html_e( 'Transparent Header', 'astra' ); ?> </strong><br/>
</p>
<select name="theme-transparent-header-meta" id="theme-transparent-header-meta">
<option value="default" <?php selected( $trans_header_meta, 'default' ); ?>> <?php esc_html_e( 'Customizer Setting', 'astra' ); ?> </option>
<option value="enabled" <?php selected( $trans_header_meta, 'enabled' ); ?>> <?php esc_html_e( 'Enabled', 'astra' ); ?> </option>
<option value="disabled" <?php selected( $trans_header_meta, 'disabled' ); ?>> <?php esc_html_e( 'Disabled', 'astra' ); ?> </option>
</select>
</div>
<?php } ?>
<?php
}
/**
* Add Styles Callback
*/
public function customizer_save() {
/* Generate Transparent Header Logo */
$trans_logo = astra_get_option( 'transparent-header-logo' );
if ( '' !== $trans_logo ) {
add_filter( 'intermediate_image_sizes_advanced', array( $this, 'transparent_logo_image_sizes' ), 10, 2 );
$trans_logo_id = attachment_url_to_postid( $trans_logo );
Astra_Customizer::generate_logo_by_width( $trans_logo_id );
remove_filter( 'intermediate_image_sizes_advanced', array( $this, 'transparent_logo_image_sizes' ), 10 );
}
}
/**
* Add logo image sizes in filter.
*
* @since 1.0.0
* @param array $sizes Sizes.
* @param array $metadata attachment data.
*
* @return array
*/
public function transparent_logo_image_sizes( $sizes, $metadata ) {
$logo_width = astra_get_option( 'transparent-header-logo-width' );
if ( is_array( $sizes ) && '' != $logo_width['desktop'] ) {
$max_value = max( $logo_width );
$sizes['ast-transparent-logo-size'] = array(
'width' => (int) $max_value,
'height' => 0,
'crop' => false,
);
}
return $sizes;
}
}
}
/**
* Kicking this off by calling 'get_instance()' method
*/
Astra_Ext_Transparent_Header_Markup::get_instance();