get_color_by_palette_variable( $overlay_color );
}
if ( '#' === $updated_overlay_color[0] ) {
$updated_overlay_color = astra_hex_to_rgba( $updated_overlay_color, $overlay_opacity );
}
}
$gen_bg_css['background-image'] = 'linear-gradient(to right, ' . $updated_overlay_color . ', ' . $updated_overlay_color . '), url(' . $bg_img . ');';
} elseif ( 'gradient' === $overlay_type && '' !== $overlay_grad ) {
$gen_bg_css['background-image'] = $overlay_grad . ', url(' . $bg_img . ');';
} else {
$gen_bg_css['background-image'] = 'url(' . $bg_img . ');';
}
} else {
$gen_bg_css['background-image'] = 'url(' . $bg_img . ');';
}
}
break;
case 'gradient':
if ( isset( $bg_color ) ) {
$gen_bg_css['background-image'] = $bg_color . ';';
}
break;
default:
break;
}
} elseif ( '' !== $bg_color ) {
$gen_bg_css['background-color'] = $bg_color . ';';
}
if ( '' !== $bg_img ) {
if ( isset( $bg_obj['background-repeat'] ) ) {
$gen_bg_css['background-repeat'] = esc_attr( $bg_obj['background-repeat'] );
}
if ( isset( $bg_obj['background-position'] ) ) {
$gen_bg_css['background-position'] = esc_attr( $bg_obj['background-position'] );
}
if ( isset( $bg_obj['background-size'] ) ) {
$gen_bg_css['background-size'] = esc_attr( $bg_obj['background-size'] );
}
if ( isset( $bg_obj['background-attachment'] ) ) {
$gen_bg_css['background-attachment'] = esc_attr( $bg_obj['background-attachment'] );
}
}
return $gen_bg_css;
}
}
/**
* Parse CSS
*/
if ( ! function_exists( 'astra_parse_css' ) ) {
/**
* Parse CSS
*
* @param array $css_output Array of CSS.
* @param mixed $min_media Min Media breakpoint.
* @param mixed $max_media Max Media breakpoint.
* @return string Generated CSS.
*/
function astra_parse_css( $css_output = array(), $min_media = '', $max_media = '' ) {
$parse_css = '';
if ( is_array( $css_output ) && count( $css_output ) > 0 ) {
foreach ( $css_output as $selector => $properties ) {
if ( null === $properties ) {
break;
}
if ( ! count( $properties ) ) {
continue;
}
$temp_parse_css = $selector . '{';
$properties_added = 0;
foreach ( $properties as $property => $value ) {
// to ignore if the value is empty with just !important appended.
if ( ( '' == $value && 0 !== $value ) || '!important' === $value ) {
continue;
}
$properties_added++;
$temp_parse_css .= $property . ':' . $value . ';';
}
$temp_parse_css .= '}';
if ( $properties_added > 0 ) {
$parse_css .= $temp_parse_css;
}
}
if ( '' != $parse_css && ( '' !== $min_media || '' !== $max_media ) ) {
$media_css = '@media ';
$min_media_css = '';
$max_media_css = '';
$media_separator = '';
if ( '' !== $min_media ) {
$min_media_css = '(min-width:' . $min_media . 'px)';
}
if ( '' !== $max_media ) {
$max_media_css = '(max-width:' . $max_media . 'px)';
}
if ( '' !== $min_media && '' !== $max_media ) {
$media_separator = ' and ';
}
$media_css .= $min_media_css . $media_separator . $max_media_css . '{' . $parse_css . '}';
return $media_css;
}
}
return $parse_css;
}
}
/**
* Return theme options from astra-settings option key.
*/
if ( ! function_exists( 'astra_get_options' ) ) {
/**
* Retrieve Astra theme options array.
*
* @return array The theme options array.
*
* @since 4.8.9
*/
function astra_get_options() {
// Ensure we're not interfering during WordPress installation.
if ( wp_installing() ) {
return [];
}
/**
* Filter to bypass the cached Astra options.
*
* Example usage:
* add_filter( 'astra_get_options_nocache', '__return_true' );
*
* @since 4.8.9
* @return bool Whether to bypass the cache. Default is false.
*/
if ( apply_filters( 'astra_get_options_nocache', false ) ) {
$astra_options = get_option( ASTRA_THEME_SETTINGS );
} else {
// Use a static variable to cache the options for this request.
static $cached_astra_options = null;
// Fetch the options once and cache them in the static variable.
if ( is_null( $cached_astra_options ) || is_customize_preview() ) {
$cached_astra_options = Astra_Theme_Options::get_astra_options();
}
$astra_options = $cached_astra_options;
}
/**
* Filter the options array for Astra Settings.
*
* @since 4.8.9
* @return array The theme options array.
*/
return apply_filters( 'astra_get_options', $astra_options );
}
}
/**
* Return Theme option.
*/
if ( ! function_exists( 'astra_get_option' ) ) {
/**
* Return Theme options.
*
* @param string $option Option key.
* @param mixed $default Option default value.
* @param string $deprecated Option default value.
* @return mixed Return option value.
*/
function astra_get_option( $option, $default = '', $deprecated = '' ) {
if ( '' != $deprecated ) {
$default = $deprecated;
}
$theme_options = Astra_Theme_Options::get_options();
/**
* Filter the options array for Astra Settings.
*
* @since 1.0.20
* @var Array
*/
$theme_options = apply_filters( 'astra_get_option_array', $theme_options, $option, $default );
$value = ( isset( $theme_options[ $option ] ) && '' !== $theme_options[ $option ] ) ? $theme_options[ $option ] : $default;
/**
* Dynamic filter astra_get_option_$option.
* $option is the name of the Astra Setting, Refer Astra_Theme_Options::defaults() for option names from the theme.
*
* @since 1.0.20
* @var Mixed.
*/
return apply_filters( "astra_get_option_{$option}", $value, $option, $default );
}
}
/**
* Return translated theme option.
*/
if ( ! function_exists( 'astra_get_i18n_option' ) ) {
/**
* Returns translated string for strings saved in Astra settings.
*
* This function retrieves a theme option value and checks if it needs translation.
* If the option's translation is needed, it looks it up based on the provided context.
* If the translation is not available, it returns the default value.
*
* Usage examples:
* - Retrieve translated theme option with a context description:
* $value = astra_get_i18n_option( 'astra-option-key', esc_html_x( '%astra%', 'Context Description', 'astra-addon' ) );
*
* - Retrieve translated theme option with a different context:
* $value = astra_get_i18n_option( 'astra-option-key', _x( '%astra%', 'Context Description', 'astra-addon' ) );
*
* @param string $option Option key.
* @param string $translated Default translation flag.
* @param mixed $default Option default value.
* @param string $deprecated Option default value.
*
* @return string Return option value.
*
* @since 4.8.1
*/
function astra_get_i18n_option( $option, $translated, $default = '', $deprecated = '' ) {
// #%astra%# is for TranslatePress compatibility.
$is_translated = '%astra%' !== $translated && ! strpos( $translated, '#%astra%#' );
return $is_translated ? $translated : astra_get_option( $option, $default, $deprecated );
}
}
/**
* Return translated string.
*/
if ( ! function_exists( 'astra_get_i18n_string' ) ) {
/**
* Returns translated string.
*
* This function checks if string has translation.
* If the translation is not available, it returns the default value.
*
* Usage examples:
* - Retrieve translated theme option with a context description:
* $value = astra_get_i18n_string( $default, esc_html_x( '%astra%', 'Context Description', 'astra-addon' ) );
*
* - Retrieve translated theme option with a different context:
* $value = astra_get_i18n_string( $default, _x( '%astra%', 'Context Description', 'astra-addon' ) );
*
* @param string $default Default string value.
* @param string $translated Default translation flag.
*
* @return string Return string value.
*
* @since 4.8.1
*/
function astra_get_i18n_string( $default, $translated ) {
// #%astra%# is for TranslatePress compatibility.
$is_translated = '%astra%' !== $translated && ! strpos( $translated, '#%astra%#' );
return $is_translated ? $translated : $default;
}
}
if ( ! function_exists( 'astra_update_option' ) ) {
/**
* Update Theme options.
*
* @param string $option option key.
* @param Mixed $value option value.
* @return void
*/
function astra_update_option( $option, $value ) {
do_action( "astra_before_update_option_{$option}", $value, $option );
// Get all customizer options.
$theme_options = get_option( ASTRA_THEME_SETTINGS );
// Update value in options array.
if ( ! is_array( $theme_options ) ) {
$theme_options = array();
}
$theme_options[ $option ] = $value;
update_option( ASTRA_THEME_SETTINGS, $theme_options );
do_action( "astra_after_update_option_{$option}", $value, $option );
}
}
if ( ! function_exists( 'astra_delete_option' ) ) {
/**
* Update Theme options.
*
* @param string $option option key.
* @return void
*/
function astra_delete_option( $option ) {
do_action( "astra_before_delete_option_{$option}", $option );
// Get all customizer options.
$theme_options = get_option( ASTRA_THEME_SETTINGS );
// Update value in options array.
unset( $theme_options[ $option ] );
update_option( ASTRA_THEME_SETTINGS, $theme_options );
do_action( "astra_after_delete_option_{$option}", $option );
}
}
/**
* Return Theme options from postmeta.
*/
if ( ! function_exists( 'astra_get_option_meta' ) ) {
/**
* Return Theme options from postmeta.
*
* @param string $option_id Option ID.
* @param string $default Option default value.
* @param boolean $only_meta Get only meta value.
* @param string $extension Is value from extension.
* @param string $post_id Get value from specific post by post ID.
* @return Mixed Return option value.
*/
function astra_get_option_meta( $option_id, $default = '', $only_meta = false, $extension = '', $post_id = '' ) {
$post_id = ( '' != $post_id ) ? $post_id : astra_get_post_id();
$value = astra_get_option( $option_id, $default );
// Get value from option 'post-meta'.
if ( is_singular() || ( is_home() && ! is_front_page() ) ) {
$value = get_post_meta( $post_id, $option_id, true );
if ( empty( $value ) || 'default' == $value ) {
if ( true === $only_meta ) {
return false;
}
$value = astra_get_option( $option_id, $default );
}
}
/**
* Dynamic filter astra_get_option_meta_$option.
* $option_id is the name of the Astra Meta Setting.
*
* @since 1.0.20
* @var Mixed.
*/
return apply_filters( "astra_get_option_meta_{$option_id}", $value, $default, $default );
}
}
/**
* Helper function to get the current post id.
*/
if ( ! function_exists( 'astra_get_post_id' ) ) {
/**
* Get post ID.
*
* @param string $post_id_override Get override post ID.
* @return number Post ID.
*/
function astra_get_post_id( $post_id_override = '' ) {
if ( null == Astra_Theme_Options::$post_id ) {
global $post;
$post_id = 0;
if ( is_home() ) {
$post_id = get_option( 'page_for_posts' );
} elseif ( is_archive() ) {
global $wp_query;
$post_id = $wp_query->get_queried_object_id();
} elseif ( isset( $post->ID ) && ! is_search() && ! is_category() ) {
$post_id = $post->ID;
}
Astra_Theme_Options::$post_id = $post_id;
}
return apply_filters( 'astra_get_post_id', Astra_Theme_Options::$post_id, $post_id_override );
}
}
/**
* Display classes for primary div
*/
if ( ! function_exists( 'astra_primary_class' ) ) {
/**
* Display classes for primary div
*
* @param string|array $class One or more classes to add to the class list.
* @return void Echo classes.
*/
function astra_primary_class( $class = '' ) {
// Separates classes with a single space, collates classes for body element.
echo 'class="' . esc_attr( join( ' ', astra_get_primary_class( $class ) ) ) . '"';
}
}
/**
* Retrieve the classes for the primary element as an array.
*/
if ( ! function_exists( 'astra_get_primary_class' ) ) {
/**
* Retrieve the classes for the primary element as an array.
*
* @param string|array $class One or more classes to add to the class list.
* @return array Return array of classes.
*/
function astra_get_primary_class( $class = '' ) {
// array of class names.
$classes = array();
// default class for content area.
$classes[] = 'content-area';
// primary base class.
$classes[] = 'primary';
if ( ! empty( $class ) ) {
if ( ! is_array( $class ) ) {
$class = preg_split( '#\s+#', $class );
}
$classes = array_merge( $classes, $class );
} else {
// Ensure that we always coerce class to being an array.
$class = array();
}
// Filter primary div class names.
$classes = apply_filters( 'astra_primary_class', $classes, $class );
$classes = array_map( 'sanitize_html_class', $classes );
return array_unique( $classes );
}
}
/**
* Display classes for secondary div
*/
if ( ! function_exists( 'astra_secondary_class' ) ) {
/**
* Retrieve the classes for the secondary element as an array.
*
* @param string|array $class One or more classes to add to the class list.
* @return void echo classes.
*/
function astra_secondary_class( $class = '' ) {
// Separates classes with a single space, collates classes for body element.
echo 'class="' . esc_attr( join( ' ', astra_get_secondary_class( $class ) ) ) . '"';
}
}
/**
* Retrieve the classes for the secondary element as an array.
*/
if ( ! function_exists( 'astra_get_secondary_class' ) ) {
/**
* Retrieve the classes for the secondary element as an array.
*
* @param string|array $class One or more classes to add to the class list.
* @return array Return array of classes.
*/
function astra_get_secondary_class( $class = '' ) {
// array of class names.
$classes = array();
// default class from widget area.
$classes[] = 'widget-area';
// secondary base class.
$classes[] = 'secondary';
if ( ! empty( $class ) ) {
if ( ! is_array( $class ) ) {
$class = preg_split( '#\s+#', $class );
}
$classes = array_merge( $classes, $class );
} else {
// Ensure that we always coerce class to being an array.
$class = array();
}
// Filter secondary div class names.
$classes = apply_filters( 'astra_secondary_class', $classes, $class );
$classes = array_map( 'sanitize_html_class', $classes );
return array_unique( $classes );
}
}
/**
* Get post format
*/
if ( ! function_exists( 'astra_get_post_format' ) ) {
/**
* Get post format
*
* @param string $post_format_override Override post formate.
* @return string Return post format.
*/
function astra_get_post_format( $post_format_override = '' ) {
if ( ( is_home() ) || is_archive() ) {
$post_format = 'blog';
} else {
$post_format = get_post_format();
}
return apply_filters( 'astra_get_post_format', $post_format, $post_format_override );
}
}
/**
* Wrapper function for get_the_title() for blog post.
*/
if ( ! function_exists( 'astra_the_post_title' ) ) {
/**
* Wrapper function for get_the_title() for blog post.
*
* Displays title only if the page title bar is disabled.
*
* @since 1.0.15
* @param string $before Optional. Content to prepend to the title.
* @param string $after Optional. Content to append to the title.
* @param int $post_id Optional, default to 0. Post id.
* @param bool $echo Optional, default to true.Whether to display or return.
* @return string|void String if $echo parameter is false.
*/
function astra_the_post_title( $before = '', $after = '', $post_id = 0, $echo = true ) {
$enabled = apply_filters( 'astra_the_post_title_enabled', true );
if ( $enabled ) {
$title = astra_get_the_title( $post_id );
$before = apply_filters( 'astra_the_post_title_before', $before );
$after = apply_filters( 'astra_the_post_title_after', $after );
// This will work same as `the_title` function but with Custom Title if exits.
if ( $echo ) {
echo $before . $title . $after; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
return $before . $title . $after;
}
}
}
}
if ( ! function_exists( 'astra_the_search_page_title' ) ) {
/**
* Function to get the search page custom title.
*
* @param string $before Optional. Content to prepend to the title.
* @param string $after Optional. Content to append to the title.
* @param bool $echo Optional, default to true.Whether to display or return.
*
* @return string Returns search page custom title.
*
* @since 4.8.4
*/
function astra_the_search_page_title( $before = '', $after = '', $echo = false ) {
$title = apply_filters(
'astra_the_search_page_title',
sprintf(
/* translators: 1: search title, 2: search string */
'%1$s %2$s',
astra_get_i18n_option( 'section-search-page-title-custom-title', _x( '%astra%', 'Search Page Title: Heading - Text', 'astra' ) ),
'' . get_search_query() . ''
)
);
if ( $echo ) {
echo $before . $title . $after; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
return $before . $title . $after;
}
}
}
/**
* Wrapper function for the_title()
*/
if ( ! function_exists( 'astra_the_title' ) ) {
/**
* Wrapper function for the_title()
*
* Displays title only if the page title bar is disabled.
*
* @param string $before Optional. Content to prepend to the title.
* @param string $after Optional. Content to append to the title.
* @param int $post_id Optional, default to 0. Post id.
* @param bool $echo Optional, default to true.Whether to display or return.
* @return string|void String if $echo parameter is false.
*/
function astra_the_title( $before = '', $after = '', $post_id = 0, $echo = true ) {
$title = '';
$post_type = astra_get_post_type();
$blog_post_title = astra_get_option( 'ast-dynamic-archive-' . $post_type . '-structure', array( 'ast-dynamic-archive-' . $post_type . '-title', 'ast-dynamic-archive-' . $post_type . '-description' ) );
$single_post_title = astra_get_option( 'ast-dynamic-single-' . $post_type . '-structure', 'page' === $post_type ? array( 'ast-dynamic-single-' . $post_type . '-image', 'ast-dynamic-single-' . $post_type . '-title' ) : array( 'ast-dynamic-single-' . $post_type . '-title', 'ast-dynamic-single-' . $post_type . '-meta' ) );
if ( ( ! is_singular() && ( in_array( 'ast-dynamic-archive-' . $post_type . '-title', $blog_post_title ) || in_array( 'ast-dynamic-archive-' . $post_type . '-meta', $blog_post_title ) ) )
|| ( is_singular() && ( in_array( 'ast-dynamic-single-' . $post_type . '-title', $single_post_title ) || in_array( 'ast-dynamic-single-' . $post_type . '-meta', $single_post_title ) ) )
) {
if ( apply_filters( 'astra_the_title_enabled', true ) ) {
$title = astra_get_the_title( $post_id );
$before = apply_filters( 'astra_the_title_before', $before );
$after = apply_filters( 'astra_the_title_after', $after );
$title = $before . $title . $after;
}
}
// This will work same as `the_title` function but with Custom Title if exits.
if ( $echo ) {
echo $title; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
return $title;
}
}
}
/**
* Wrapper function for get_the_title()
*/
if ( ! function_exists( 'astra_get_the_title' ) ) {
/**
* Wrapper function for get_the_title()
*
* Return title for Title Bar and Normal Title.
*
* @param int $post_id Optional, default to 0. Post id.
* @param bool $echo Optional, default to false. Whether to display or return.
* @return string|void String if $echo parameter is false.
*/
function astra_get_the_title( $post_id = 0, $echo = false ) {
$title = '';
if ( $post_id || is_singular() ) {
$title = get_the_title( $post_id );
} else {
if ( is_front_page() && is_home() ) {
// Default homepage.
$title = apply_filters( 'astra_the_default_home_page_title', esc_html__( 'Home', 'astra' ) );
} elseif ( is_home() ) {
// blog page.
$title = apply_filters( 'astra_the_blog_home_page_title', get_the_title( get_option( 'page_for_posts', true ) ) );
} elseif ( is_404() ) {
// for 404 page - title always display.
$title = apply_filters( 'astra_the_404_page_title', esc_html__( 'This page doesn\'t seem to exist.', 'astra' ) );
// for search page - title always display.
} elseif ( is_search() ) {
$title = astra_the_search_page_title();
} elseif ( class_exists( 'WooCommerce' ) && is_shop() ) {
$title = woocommerce_page_title( false );
} elseif ( is_archive() ) {
$title = get_the_archive_title();
}
}
$title = apply_filters( 'astra_the_title', $title, $post_id );
// This will work same as `get_the_title` function but with Custom Title if exits.
if ( $echo ) {
echo $title; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
return $title;
}
}
}
/**
* Don't apply direct new layouts to legacy users.
*
* @since 4.0.0
* @return boolean false if it is an existing user , true if not.
*/
function astra_use_dynamic_blog_layouts() {
$astra_settings = astra_get_options();
return apply_filters( 'astra_get_option_dynamic_blog_layouts', isset( $astra_settings['dynamic-blog-layouts'] ) ? $astra_settings['dynamic-blog-layouts'] : true );
}
/**
* Get taxonomy archive banner for layout 1.
*
* @since 4.0.0
*/
function astra_get_taxonomy_banner_legacy_layout() {
$post_type = astra_get_post_type();
$banner_structure = is_search() ? astra_get_option( 'section-search-page-title-structure' ) : astra_get_option( 'ast-dynamic-archive-' . $post_type . '-structure', array( 'ast-dynamic-archive-' . $post_type . '-title', 'ast-dynamic-archive-' . $post_type . '-description' ) );
if ( empty( $banner_structure ) ) {
return;
}
?>
', '', true );
} else {
add_filter( 'get_the_archive_title_prefix', '__return_empty_string' );
the_archive_title( '', '
' );
remove_filter( 'get_the_archive_title_prefix', '__return_empty_string' );
}
do_action( 'astra_after_archive_title' );
break;
case 'archive-breadcrumb':
if ( ! is_author() ) {
do_action( 'astra_before_archive_breadcrumb' );
echo astra_get_breadcrumb(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
do_action( 'astra_after_archive_breadcrumb' );
}
break;
case 'archive-description':
do_action( 'astra_before_archive_description' );
if ( is_search() ) {
$title = have_posts()
? astra_get_i18n_option( 'section-search-page-title-found-custom-description', _x( '%astra%', 'Search Page Custom `When Results Found` Text', 'astra' ) )
: astra_get_i18n_option( 'section-search-page-title-not-found-custom-description', _x( '%astra%', 'Search Page Custom `When Results Not Found` Text', 'astra' ) );
echo wp_kses_post( wpautop( $title ) );
} else {
echo wp_kses_post( wpautop( get_the_archive_description() ) );
}
do_action( 'astra_after_archive_description' );
break;
}
}
?>
hexdec( substr( $hex, 0, 2 ) ),
'g' => hexdec( substr( $hex, 2, 2 ) ),
'b' => hexdec( substr( $hex, 4, 2 ) ),
);
// Should we darken the color?
if ( 'reverse' == $type && $shortcode_atts['r'] + $shortcode_atts['g'] + $shortcode_atts['b'] > 382 ) {
$steps = -$steps;
} elseif ( 'darken' == $type ) {
$steps = -$steps;
}
// Build the new color.
$steps = max( -255, min( 255, $steps ) );
$shortcode_atts['r'] = max( 0, min( 255, $shortcode_atts['r'] + $steps ) );
$shortcode_atts['g'] = max( 0, min( 255, $shortcode_atts['g'] + $steps ) );
$shortcode_atts['b'] = max( 0, min( 255, $shortcode_atts['b'] + $steps ) );
$r_hex = str_pad( dechex( $shortcode_atts['r'] ), 2, '0', STR_PAD_LEFT );
$g_hex = str_pad( dechex( $shortcode_atts['g'] ), 2, '0', STR_PAD_LEFT );
$b_hex = str_pad( dechex( $shortcode_atts['b'] ), 2, '0', STR_PAD_LEFT );
return '#' . $r_hex . $g_hex . $b_hex;
}
} // End if.
/**
* Convert colors from HEX to RGBA
*/
if ( ! function_exists( 'astra_hex_to_rgba' ) ) :
/**
* Convert colors from HEX to RGBA
*
* @param string $color Color code in HEX.
* @param mixed $opacity Color code opacity.
* @return string Color code in RGB or RGBA.
*/
function astra_hex_to_rgba( $color, $opacity = false ) {
$default = 'rgb(0,0,0)';
// Return default if no color provided.
if ( empty( $color ) ) {
return $default;
}
// Sanitize $color if "#" is provided.
if ( '#' == $color[0] ) {
$color = substr( $color, 1 );
}
// Check if color has 6 or 3 characters and get values.
if ( 6 == strlen( $color ) ) {
$hex = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5] );
} elseif ( 3 == strlen( $color ) ) {
$hex = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] );
} else {
return $default;
}
// Convert HEX to RGB.
$rgb = array_map( 'hexdec', $hex );
// Check if opacity is set(RGBA or RGB).
if ( $opacity ) {
if ( 1 < abs( $opacity ) ) {
$opacity = 1.0;
}
$output = 'rgba(' . implode( ',', $rgb ) . ',' . $opacity . ')';
} else {
$output = 'rgb(' . implode( ',', $rgb ) . ')';
}
// Return RGB(a) color string.
return $output;
}
endif;
if ( ! function_exists( 'astra_enable_page_builder_compatibility' ) ) :
/**
* Allow filter to enable/disable page builder compatibility.
*
* @see https://wpastra.com/docs/recommended-settings-beaver-builder-astra/
* @see https://wpastra.com/docs/recommended-settings-for-elementor/
*
* @since 1.2.2
* @return bool True - If the page builder compatibility is enabled. False - IF the page builder compatibility is disabled.
*/
function astra_enable_page_builder_compatibility() {
return apply_filters( 'astra_enable_page_builder_compatibility', true );
}
endif;
if ( ! function_exists( 'astra_get_pro_url' ) ) :
/**
* Returns an URL with utm tags
* the admin settings page.
*
* @param string $url URL fo the site.
* @param string $source utm source.
* @param string $medium utm medium.
* @param string $campaign utm campaign.
* @return mixed
*/
function astra_get_pro_url( $url, $source = '', $medium = '', $campaign = '' ) {
$astra_pro_url = trailingslashit( $url );
// Set up our URL if we have a source.
if ( ! empty( $source ) ) {
$astra_pro_url = add_query_arg( 'utm_source', sanitize_text_field( $source ), $url );
}
// Set up our URL if we have a medium.
if ( ! empty( $medium ) ) {
$astra_pro_url = add_query_arg( 'utm_medium', sanitize_text_field( $medium ), $astra_pro_url );
}
// Set up our URL if we have a campaign.
if ( ! empty( $campaign ) ) {
$astra_pro_url = add_query_arg( 'utm_campaign', sanitize_text_field( $campaign ), $astra_pro_url );
}
$astra_pro_url = apply_filters( 'astra_get_pro_url', $astra_pro_url, $url );
$astra_pro_url = remove_query_arg( 'bsf', $astra_pro_url );
$ref = get_option( 'astra_partner_url_param', '' );
if ( ! empty( $ref ) ) {
$astra_pro_url = add_query_arg( 'bsf', sanitize_text_field( $ref ), $astra_pro_url );
}
return $astra_pro_url;
}
endif;
/**
* Search Form
*/
if ( ! function_exists( 'astra_get_search_form' ) ) :
/**
* Display search form.
*
* @param bool $echo Default to echo and not return the form.
* @return string|void String when $echo is false.
*/
function astra_get_search_form( $echo = true ) {
$form = get_search_form(
array(
'input_placeholder' => apply_filters( 'astra_search_field_placeholder', esc_attr_x( 'Search...', 'placeholder', 'astra' ) ),
'data_attributes' => apply_filters( 'astra_search_field_toggle_data_attrs', '' ),
'input_value' => get_search_query(),
'show_input_submit' => false,
)
);
/**
* Filters the HTML output of the search form.
*
* @param string $form The search form HTML output.
*/
$result = apply_filters( 'astra_get_search_form', $form );
if ( null === $result ) {
$result = $form;
}
if ( $echo ) {
echo $result; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
return $result;
}
}
endif;
/**
* Check if we're being delivered AMP
*
* @return bool
*/
function astra_is_amp_endpoint() {
return function_exists( 'is_amp_endpoint' ) && is_amp_endpoint();
}
/*
* Get Responsive Spacing
*/
if ( ! function_exists( 'astra_responsive_spacing' ) ) {
/**
* Get Spacing value
*
* @param array $option CSS value.
* @param string $side top | bottom | left | right.
* @param string $device CSS device.
* @param string $default Default value.
* @param string $prefix Prefix value.
* @return mixed
*/
function astra_responsive_spacing( $option, $side = '', $device = 'desktop', $default = '', $prefix = '' ) {
if ( isset( $option[ $device ][ $side ] ) && isset( $option[ $device . '-unit' ] ) ) {
$spacing = astra_get_css_value( $option[ $device ][ $side ], $option[ $device . '-unit' ], $default );
} elseif ( is_numeric( $option ) ) {
$spacing = astra_get_css_value( $option );
} else {
$spacing = ( ! is_array( $option ) ) ? $option : '';
}
if ( '' !== $prefix && '' !== $spacing ) {
return $prefix . $spacing;
}
return $spacing;
}
}
/**
* Get the tablet breakpoint value.
*
* @param mixed $min min.
* @param mixed $max max.
*
* @since 2.4.0
*
* @return number $breakpoint.
*/
function astra_get_tablet_breakpoint( $min = '', $max = '' ) {
$update_breakpoint = astra_get_option( 'can-update-theme-tablet-breakpoint', true );
// Change default for new users.
$default = ( true === $update_breakpoint ) ? 921 : 768;
$header_breakpoint = apply_filters( 'astra_tablet_breakpoint', $default );
if ( '' !== $min ) {
$header_breakpoint = $header_breakpoint - $min;
} elseif ( '' !== $max ) {
$header_breakpoint = $header_breakpoint + $max;
}
return absint( $header_breakpoint );
}
/**
* Get the mobile breakpoint value.
*
* @param mixed $min min.
* @param mixed $max max.
*
* @since 2.4.0
*
* @return number header_breakpoint.
*/
function astra_get_mobile_breakpoint( $min = '', $max = '' ) {
$header_breakpoint = apply_filters( 'astra_mobile_breakpoint', 544 );
if ( '' !== $min ) {
$header_breakpoint = $header_breakpoint - $min;
} elseif ( '' !== $max ) {
$header_breakpoint = $header_breakpoint + $max;
}
return absint( $header_breakpoint );
}
/*
* Apply CSS for the element
*/
if ( ! function_exists( 'astra_color_responsive_css' ) ) {
/**
* Astra Responsive Colors
*
* @param array $setting Responsive colors.
* @param string $css_property CSS property.
* @param string $selector CSS selector.
* @return string Dynamic responsive CSS.
*/
function astra_color_responsive_css( $setting, $css_property, $selector ) {
$css = '';
if ( isset( $setting['desktop'] ) && ! empty( $setting['desktop'] ) ) {
$css .= $selector . '{' . $css_property . ':' . esc_attr( $setting['desktop'] ) . ';}';
}
if ( isset( $setting['tablet'] ) && ! empty( $setting['tablet'] ) ) {
$css .= '@media (max-width:' . astra_get_tablet_breakpoint() . 'px) {' . $selector . '{' . $css_property . ':' . esc_attr( $setting['tablet'] ) . ';} }';
}
if ( isset( $setting['mobile'] ) && ! empty( $setting['mobile'] ) ) {
$css .= '@media (max-width:' . astra_get_mobile_breakpoint() . 'px) {' . $selector . '{' . $css_property . ':' . esc_attr( $setting['mobile'] ) . ';} }';
}
return $css;
}
}
if ( ! function_exists( 'astra_check_is_bb_themer_layout' ) ) :
/**
* Check if layout is bb themer's layout
*/
function astra_check_is_bb_themer_layout() {
$is_layout = false;
$post_type = get_post_type();
$post_id = get_the_ID();
if ( 'fl-theme-layout' === $post_type && $post_id ) {
$is_layout = true;
}
return $is_layout;
}
endif;
if ( ! function_exists( 'astra_is_white_labelled' ) ) :
/**
* Check if white label option is enabled in astra pro plugin
*/
function astra_is_white_labelled() {
if ( is_callable( 'Astra_Ext_White_Label_Markup::show_branding' ) && ! Astra_Ext_White_Label_Markup::show_branding() ) {
return apply_filters( 'astra_is_white_labelled', true );
}
return apply_filters( 'astra_is_white_labelled', false );
}
endif;
/**
* Get the value for font-display property.
*
* @since 1.8.6
* @return string
*/
function astra_get_fonts_display_property() {
return apply_filters( 'astra_fonts_display_property', 'fallback' );
}
/**
* Generate Responsive Background Color CSS.
*
* @param array $bg_obj_res array of background object.
* @param string $device CSS for which device.
* @return array
*/
function astra_get_responsive_background_obj( $bg_obj_res, $device ) {
$gen_bg_css = array();
if ( ! is_array( $bg_obj_res ) ) {
return;
}
$bg_obj = $bg_obj_res[ $device ];
$bg_img = isset( $bg_obj['background-image'] ) ? $bg_obj['background-image'] : '';
$bg_tab_img = isset( $bg_obj_res['tablet']['background-image'] ) ? $bg_obj_res['tablet']['background-image'] : '';
$bg_desk_img = isset( $bg_obj_res['desktop']['background-image'] ) ? $bg_obj_res['desktop']['background-image'] : '';
$bg_color = isset( $bg_obj['background-color'] ) ? $bg_obj['background-color'] : '';
$tablet_css = ( isset( $bg_obj_res['tablet']['background-image'] ) && $bg_obj_res['tablet']['background-image'] ) ? true : false;
$desktop_css = ( isset( $bg_obj_res['desktop']['background-image'] ) && $bg_obj_res['desktop']['background-image'] ) ? true : false;
$bg_type = ( isset( $bg_obj['background-type'] ) && $bg_obj['background-type'] ) ? $bg_obj['background-type'] : '';
if ( '' !== $bg_type ) {
switch ( $bg_type ) {
case 'color':
if ( '' !== $bg_img && '' !== $bg_color ) {
$gen_bg_css['background-image'] = 'linear-gradient(to right, ' . $bg_color . ', ' . $bg_color . '), url(' . $bg_img . ')';
} elseif ( 'mobile' === $device ) {
if ( $desktop_css ) {
$gen_bg_css['background-image'] = 'linear-gradient(to right, ' . $bg_color . ', ' . $bg_color . '), url(' . $bg_desk_img . ')';
} elseif ( $tablet_css ) {
$gen_bg_css['background-image'] = 'linear-gradient(to right, ' . $bg_color . ', ' . $bg_color . '), url(' . $bg_tab_img . ')';
} else {
if ( '' !== $bg_color ) {
$gen_bg_css['background-color'] = $bg_color;
$gen_bg_css['background-image'] = 'none';
}
}
} elseif ( 'tablet' === $device ) {
if ( $desktop_css ) {
$gen_bg_css['background-image'] = 'linear-gradient(to right, ' . $bg_color . ', ' . $bg_color . '), url(' . $bg_desk_img . ')';
} else {
if ( '' !== $bg_color ) {
$gen_bg_css['background-color'] = $bg_color;
$gen_bg_css['background-image'] = 'none';
}
}
} elseif ( '' === $bg_img ) {
$gen_bg_css['background-color'] = $bg_color;
$gen_bg_css['background-image'] = 'none';
}
break;
case 'image':
/** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$overlay_type = isset( $bg_obj['overlay-type'] ) ? $bg_obj['overlay-type'] : 'none';
/** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$overlay_color = isset( $bg_obj['overlay-color'] ) ? $bg_obj['overlay-color'] : '';
/** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$overlay_grad = isset( $bg_obj['overlay-gradient'] ) ? $bg_obj['overlay-gradient'] : '';
/** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$overlay_opacity = isset( $bg_obj['overlay-opacity'] ) ? $bg_obj['overlay-opacity'] : '';
/** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
if ( '' !== $bg_img ) {
if ( 'none' !== $overlay_type ) {
if ( 'classic' === $overlay_type && '' !== $overlay_color ) {
$updated_overlay_color = $overlay_color;
// Compatibility of overlay color opacity to HEX & VAR colors.
if ( '' !== $overlay_opacity ) {
$is_linked_with_gcp = 'var' === substr( $overlay_color, 0, 3 );
if ( $is_linked_with_gcp ) {
$astra_gcp_instance = new Astra_Global_Palette();
$updated_overlay_color = $astra_gcp_instance->get_color_by_palette_variable( $overlay_color );
}
if ( '#' === $updated_overlay_color[0] ) {
$updated_overlay_color = astra_hex_to_rgba( $updated_overlay_color, $overlay_opacity );
}
}
$gen_bg_css['background-image'] = 'linear-gradient(to right, ' . $updated_overlay_color . ', ' . $updated_overlay_color . '), url(' . $bg_img . ')';
} elseif ( 'gradient' === $overlay_type && '' !== $overlay_grad ) {
$gen_bg_css['background-image'] = $overlay_grad . ', url(' . $bg_img . ')';
} else {
$gen_bg_css['background-image'] = 'url(' . $bg_img . ')';
}
} else {
$gen_bg_css['background-image'] = 'url(' . $bg_img . ')';
}
}
break;
case 'gradient':
if ( isset( $bg_color ) ) {
$gen_bg_css['background-image'] = $bg_color;
}
break;
default:
break;
}
} elseif ( '' !== $bg_color ) {
$gen_bg_css['background-color'] = $bg_color;
}
if ( '' !== $bg_img ) {
if ( isset( $bg_obj['background-repeat'] ) ) {
$gen_bg_css['background-repeat'] = esc_attr( $bg_obj['background-repeat'] );
}
if ( isset( $bg_obj['background-position'] ) ) {
$gen_bg_css['background-position'] = esc_attr( $bg_obj['background-position'] );
}
if ( isset( $bg_obj['background-size'] ) ) {
$gen_bg_css['background-size'] = esc_attr( $bg_obj['background-size'] );
}
if ( isset( $bg_obj['background-attachment'] ) ) {
$gen_bg_css['background-attachment'] = esc_attr( $bg_obj['background-attachment'] );
}
}
return $gen_bg_css;
}
/**
* Common function to check is pagination is enabled on current page.
*
* @since 3.0.1
* @return boolean
*/
function astra_check_pagination_enabled() {
global $wp_query;
return ( $wp_query->max_num_pages > 1 && apply_filters( 'astra_pagination_enabled', true ) );
}
/**
* Verify is current post comments are enabled or not for applying dynamic CSS.
*
* @since 3.0.1
* @return boolean
*/
function astra_check_current_post_comment_enabled() {
return ( is_singular() && comments_open() );
}
/**
* Dont apply zero size to existing user.
*
* @since 3.6.9
* @return boolean false if it is an existing user , true if not.
*/
function astra_zero_font_size_case() {
$astra_settings = astra_get_options();
return apply_filters( 'astra_zero_font_size_case', isset( $astra_settings['astra-zero-font-size-case-css'] ) ? false : true );
}
/**
* Check the WordPress version.
*
* @since 2.5.4
* @param string $version WordPress version to compare with the current version.
* @param mixed $compare Comparison value i.e > or < etc.
* @return bool|null True/False based on the $version and $compare value.
*/
function astra_wp_version_compare( $version, $compare ) {
return version_compare( get_bloginfo( 'version' ), $version, $compare );
}
/**
* Check if existing setup is live with old block editor compatibilities.
*
* @return bool true|false.
*/
function astra_block_based_legacy_setup() {
$astra_settings = astra_get_options();
return ( isset( $astra_settings['blocks-legacy-setup'] ) && isset( $astra_settings['wp-blocks-ui'] ) && 'legacy' === $astra_settings['wp-blocks-ui'] ) ? true : false;
}
/**
* Check is new structural things are updated.
*
* @return bool true|false.
*/
function astra_check_is_structural_setup() {
$astra_settings = astra_get_options();
return apply_filters( 'astra_get_option_customizer-default-layout-update', isset( $astra_settings['customizer-default-layout-update'] ) ? false : true ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
}
/**
* Check if the user is old sidebar user.
*
* @since 3.9.4
* @return bool true|false.
*/
function astra_check_old_sidebar_user() {
$astra_settings = astra_get_options();
return apply_filters( 'astra_old_global_sidebar_defaults', isset( $astra_settings['astra-old-global-sidebar-default'] ) ? false : true );
}
/**
* Check if user is old for hiding/showing password icon field for login my-account form.
*
* @since 3.9.2
* @return bool true|false.
*/
function astra_load_woocommerce_login_form_password_icon() {
$astra_settings = astra_get_options();
return apply_filters( 'astra_get_option_woo-show-password-icon', isset( $astra_settings['woo-show-password-icon'] ) ? false : true ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
}
/**
* Function to add narrow width properties in the frontend.
*
* @since 4.0.0
* @param string $location container layout for single-post, archives, pages, page meta.
* @param string $narrow_container_max_width dynamic container width in px.
* @return string Parsed CSS based on $location and $narrow_container_max_width.
*/
function astra_narrow_container_width( $location, $narrow_container_max_width ) {
if ( 'narrow-container' === $location ) {
$narrow_container_css = array(
'.ast-narrow-container .site-content > .ast-container' => array(
'max-width' => astra_get_css_value( $narrow_container_max_width, 'px' ),
),
);
// Remove Sidebar for Narrow Width Container Layout.
if ( 'narrow-container' === astra_get_content_layout() ) {
add_filter(
'astra_page_layout',
function() { // phpcs:ignore PHPCompatibility.FunctionDeclarations.NewClosure.Found
return 'no-sidebar';
}
);
}
return astra_parse_css( $narrow_container_css, astra_get_tablet_breakpoint( '', 1 ) );
} else {
return '';
}
}
/**
* Function which will return the Sidebar Layout to determine default body classes for Editor.
*
* @since 4.2.0
* @param string $post_type Post Type.
* @return string Sidebar Layout.
*/
function astra_get_sidebar_layout_for_editor( $post_type ) {
$sidebar_layout = astra_get_option( 'single-' . $post_type . '-sidebar-layout' );
if ( 'default' === $sidebar_layout ) {
$sidebar_layout = astra_get_option( 'site-sidebar-layout' );
}
return $sidebar_layout;
}
/**
* Gets the SVG for the duotone filter definition.
*
* @since 4.2.2
*
* @param string $filter_id The ID of the filter.
* @param array $color An array of color strings.
* @return string An SVG with a duotone filter definition.
*/
function astra_get_filter_svg( $filter_id, $color ) {
$duotone_values = array(
'r' => array(),
'g' => array(),
'b' => array(),
'a' => array(),
);
/** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$duotone_values['r'][] = $color['r'] / 255;
/** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$duotone_values['g'][] = $color['g'] / 255;
/** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$duotone_values['b'][] = $color['b'] / 255;
/** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$duotone_values['a'][] = $color['a'];
ob_start();
?>
<', '><', $svg );
$svg = trim( $svg );
return $svg;
}
/**
* Converts HEX to RGB.
*
* @since 4.2.2
*
* @param string $hex Hex color.
* @return array split version of rgb.
*/
function astra_hex_to_rgb( $hex ) {
// @codingStandardsIgnoreStart
/**
* @psalm-suppress PossiblyNullArrayAccess
*/
list($r, $g, $b) = sscanf( $hex, '#%02x%02x%02x' );
// @codingStandardsIgnoreEnd
return array(
'r' => $r,
'g' => $g,
'b' => $b,
'a' => 1,
);
}
/**
* Converts RGBA to split array RGBA.
*
* @since 4.2.2
*
* @param string $rgba RGBA value.
* @return array split version of rgba.
*/
function astra_split_rgba( $rgba ) {
// Remove the "rgba(" and ")" from the input string.
$rgba = str_replace( array( 'rgba(', ')' ), '', $rgba );
// Split the RGBA values by comma.
$values = explode( ',', $rgba );
// Convert each value from string to integer.
$r = intval( $values[0] );
$g = intval( $values[1] );
$b = intval( $values[2] );
$a = floatval( $values[3] );
// Create the split RGBA string.
return array(
'r' => $r,
'g' => $g,
'b' => $b,
'a' => $a,
);
}
/**
* Render svg mask.
*
* @since 4.2.2
*
* @param string $id id.
* @param string $filter_name filter name.
* @param string $color color.
* @return mixed masked svg,
*/
function astra_render_svg_mask( $id, $filter_name, $color ) {
if ( 0 === strpos( $color, 'var(--' ) ) {
$agp = new Astra_Global_Palette();
/** @psalm-suppress UndefinedFunction */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$svg_color = astra_hex_to_rgb( $agp->get_color_by_palette_variable( $color ) );
} elseif ( preg_match( '/^#[a-f0-9]{6}$/i', $color ) ) {
/** @psalm-suppress UndefinedFunction */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$svg_color = astra_hex_to_rgb( $color );
} else {
/** @psalm-suppress UndefinedFunction */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$svg_color = astra_split_rgba( $color );
}
/** @psalm-suppress UndefinedFunction */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
echo astra_get_filter_svg( $id, apply_filters( 'astra_' . $filter_name, $svg_color ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
/**
* Returns an array of logo svg icons.
*
* @return array
* @since 4.7.0
*/
function astra_get_logo_svg_icons_array() {
static $ast_all_svg_icons = array();
if ( $ast_all_svg_icons ) {
return $ast_all_svg_icons;
}
$icons_dir = ASTRA_THEME_DIR . 'assets/svg/logo-svg-icons';
for ( $i = 0; $i < 4; $i++ ) {
$file = "{$icons_dir}/icons-v6-{$i}.php";
if ( file_exists( $file ) ) {
$icons = include_once $file;
foreach ( $icons as &$icon ) {
$fallback = isset( $icon['svg']['solid'] ) ? $icon['svg']['solid'] : array();
$icon_brand_or_solid = isset( $icon['svg']['brands'] ) ? $icon['svg']['brands'] : $fallback;
$path = isset( $icon_brand_or_solid['path'] ) ? $icon_brand_or_solid['path'] : '';
$width = isset( $icon_brand_or_solid['width'] ) ? $icon_brand_or_solid['width'] : '';
$height = isset( $icon_brand_or_solid['height'] ) ? $icon_brand_or_solid['height'] : '';
$view = (bool) $width && (bool) $height ? "0 0 {$width} {$height}" : null;
if ( $path && $view ) {
ob_start();
?>
taxonomy ?? '';
$post_types = get_post_types();
// Loop through all post types to see which ones support the current taxonomy.
foreach ( $post_types as $type ) {
if ( in_array( $taxonomy, get_object_taxonomies( $type ) ) ) {
// If a custom post type matches the taxonomy, assign it.
$post_type = $type;
break;
}
}
}
}
/**
* Filter the detected post type before returning.
*
* @param string $post_type The detected post type.
*/
return apply_filters( 'astra_get_post_type', strval( $post_type ) );
}
/**
* Get Astra's upgrade URL based on org or woo package version.
*
* @param string $type Type of upgrade URL.
* @since 4.8.4
* @return string Upgrade URL.
*/
function astra_get_upgrade_url( $type = 'pro' ) {
$upgrade_url = 'pricing' === $type ? astra_get_pro_url( 'https://wpastra.com/pricing/', 'customizer', 'free-theme', 'main-cta' ) : astra_get_pro_url( 'https://wpastra.com/pro/', 'dashboard', 'free-theme', 'upgrade-now' );
/** @psalm-suppress TypeDoesNotContainType */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
if ( false === ASTRA_THEME_ORG_VERSION ) {
/** @psalm-suppress TypeDoesNotContainType */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$upgrade_url = 'https://woo.com/products/astra-pro/';
}
return $upgrade_url;
}