'default',
'themeoo_secondary_header' => 'default',
'themeoo_section_height' => 0,
'themeoo_site_layout' => 'default',
'themeoo_titlebar' => 'default',
'themeoo_page_title' => 'default',
'themeoo_content_layout' => 'default',
'themeoo_sidebar' => 'default',
)
);
// fx option name.
if ( ! $option ) {
$option = 'all';
} else {
$option = str_replace( 'themeoo_', '', $option );
}
if ( $post ) {
if ( 'all' !== $option && has_filter( "themeoo_pre_get_post_{$option}_option" ) ) {
// Eg. themeoo_pre_get_post_content_layout_option
// Eg. themeoo_pre_get_post_display_header_option
return apply_filters( "themeoo_pre_get_post_{$option}_option", $post );
}
if ( ! isset( $themeoo_loaded_layout_options[ $post->ID ] ) ) {
$settings = (array) get_post_meta( $post->ID, 'themeoo', true );
$settings = array_filter( $settings );
$settings = wp_parse_args( $settings, $defaults );
$settings = apply_filters( 'themeoo_post_layout_options', $settings, $post );
// Store into cache.
$themeoo_loaded_layout_options[ $post->ID ] = $settings;
} else {
// Read from cache.
$settings = $themeoo_loaded_layout_options[ $post->ID ];
}
} else {
// This function can be called from any archive pages...
$settings = apply_filters( 'themeoo_post_layout_options', $defaults, null );
}
if ( 'all' === $option ) {
return $settings;
}
if ( isset( $settings[ $option ] ) ) {
return $settings[ $option ];
}
if ( isset( $settings[ 'themeoo_' . $option ] ) ) {
return $settings[ 'themeoo_' . $option ];
}
_doing_it_wrong(
__FUNCTION__,
sprintf(
/* translators: %s: Option name. */
esc_html__( 'Option %s is not registered within current theme', 'ayyash' ),
'' . esc_html( $option ) . '
'
),
'1.0.0'
);
return false;
}
/**
* Determine the current view.
*
* @return string The string representing the current view.
*/
function themeoo_get_current_screen() {
global $themeoo_screen;
if ( isset( $themeoo_screen ) ) {
return $themeoo_screen;
}
// Post types.
$post_types = get_post_types(
array(
'public' => true,
'_builtin' => false,
)
);
$post_types[] = 'post';
// Post parent.
$parent_post_type = '';
if ( is_attachment() ) {
$attachment = get_post();
$parent_post_type = $attachment ? get_post_type( $attachment->post_parent ) : '';
}
$themeoo_screen = 'post';
if ( is_home() ) {
$themeoo_screen = 'blog'; // Blog.
} elseif ( is_archive() && ! is_post_type_archive( 'product' ) ) {
$themeoo_screen = 'archive'; // Archives.
} elseif ( is_search() ) {
$themeoo_screen = 'search'; // Search results.
// @phpstan-ignore-next-line
} elseif ( is_singular( $post_types ) || ( is_attachment() && in_array( $parent_post_type, $post_types, true ) ) ) {
$themeoo_screen = 'post'; // Posts and public custom post types.
} elseif ( is_page() || ( is_attachment() && 'page' === $parent_post_type ) ) {
$themeoo_screen = 'page'; // Pages.
}
return apply_filters( 'themeoo_current_screen', $themeoo_screen );
}
/**
* Get Sidebar Position.
*
* @param string $screen current view.
*
* @return string
*/
function themeoo_get_sidebar_position( $screen = '' ) {
global $themeoo_loaded_sidebar_position;
if ( ! $screen ) {
$screen = themeoo_get_current_screen();
}
if ( null === $themeoo_loaded_sidebar_position ) {
$themeoo_loaded_sidebar_position = array();
}
if ( isset( $themeoo_loaded_sidebar_position[ $screen ] ) ) {
return $themeoo_loaded_sidebar_position[ $screen ];
}
if ( class_exists( 'WooCommerce' ) && ( is_post_type_archive( 'product' ) ) ) {
$position = themeoo_get_mod( 'woocommerce_shop_archive_layout' );
} elseif ( class_exists( 'WooCommerce' ) && is_product() ) {
$position = themeoo_get_mod( 'woocommerce_single_layout' );
} elseif ( class_exists( 'WooCommerce' ) && is_cart() ) {
$position = themeoo_get_mod( 'woocommerce_cart_sidebar_layout' );
} elseif ( class_exists( 'WooCommerce' ) && is_checkout() ) {
$position = themeoo_get_mod( 'woocommerce_checkout_sidebar_layout' );
} elseif ( class_exists( 'WooCommerce' ) && is_account_page() ) {
$position = themeoo_get_mod( 'woocommerce_myaccount_sidebar_layout' );
} elseif ( class_exists( 'WooCommerce' ) && is_product_category() ) {
$position = themeoo_get_mod( 'woocommerce_product_catalog_sidebar_layout' );
} else {
/**
* @var string $single_sidebar_position
*/
$single_sidebar_position = themeoo_get_post_layout_options( 'content_layout' );
if ( 'default' !== $single_sidebar_position && $single_sidebar_position ) {
$position = $single_sidebar_position;
} else {
$position = themeoo_get_mod( 'layout_' . $screen . '_sidebar' );
// In case current screen is modified and not found in default values.
if ( ! $position ) {
$position = 'none';
}
}
}
$themeoo_loaded_sidebar_position[ $screen ] = apply_filters( 'themeoo_sidebar_position', $position, $screen );
return $themeoo_loaded_sidebar_position[ $screen ];
}
/**
* Checks if lazy-loading images is enabled.
*
* @return bool
*/
function themeoo_layzload_enabled() {
return (bool) themeoo_get_mod( 's_config_lazyload_enable' );
}
/**
* Themeoo rest api request
*
* @return false|mixed|void
*/
function themeoo_doing_rest() {
if ( empty( $_SERVER['REQUEST_URI'] ) ) {
return false;
}
$rest_prefix = trailingslashit( rest_get_url_prefix() );
$is_rest_api_request = ( false !== strpos( $_SERVER['REQUEST_URI'], $rest_prefix ) ); // phpcs:disable WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
return apply_filters( 'themeoo_is_rest_api_request', $is_rest_api_request );
}
/**
* Themeoo lazyload post thumbnail
*
* @return mixed|void
*/
function themeoo_maybe_lazyload_post_thumbnail() {
return apply_filters(
'themeoo_lazyload_post_thumbnail',
(
themeoo_layzload_enabled() &&
! is_admin() &&
! wp_doing_ajax() &&
! themeoo_doing_rest()
)
);
}
if ( ! function_exists( 'themeoo_search_menu_icon' ) ) {
/**
* Mobile search icon
*
* @param string $items nav items.
* @param object $args nav args.
*
* @return string
*/
function themeoo_search_menu_icon( $items, $args ) {
if ( themeoo_get_mod( 'layout_header_search' ) && isset( $args->theme_location ) && 'primary' === $args->theme_location ) {
// @phpstan-ignore-next-line
$items .= '
';
}
return $items;
}
}
if ( ! function_exists( 'themeoo_mobile_icon' ) ) {
/**
* Mobile Menu Icon.
*
* @return void
*/
function themeoo_mobile_icon() {
$mobile_icon_grid = themeoo_get_mod( 'layout_header_menu_mobileshow' );
switch ( $mobile_icon_grid ) {
case 'sm':
$mobile_icon_grid = ' d-block d-md-none';
break;
case 'md':
$mobile_icon_grid = ' d-block d-lg-none';
break;
case 'lg':
$mobile_icon_grid = ' d-block d-xl-none';
break;
case 'xl':
$mobile_icon_grid = ' d-block';
break;
default:
$mobile_icon_grid = ' d-block d-xl-none';
}
?>
'mobile' ) );
} else {
wp_nav_menu(
array(
'theme_location' => 'primary',
'mobile' => true,
)
);
}
}
}
if ( ! function_exists( 'themeoo_header_user_account_info' ) ) {
/**
* Right Nav Panel.
*
* @return void
*/
function themeoo_header_user_account_info() {
$stat = is_user_logged_in();
$label = $stat ? __( 'My Account', 'ayyash' ) : __( 'Sign Up / Log In', 'ayyash' );
$title = $stat ? __( 'My Account', 'ayyash' ) : __( 'Login', 'ayyash' );
/** @noinspection HtmlUnknownTarget */
printf(
' %s',
esc_url( get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ) ), // @phpstan-ignore-line
esc_attr( $title ),
esc_html( $label )
);
}
}
if ( ! function_exists( 'themeoo_wp_page_menu' ) ) {
/**
* Display or retrieve list of pages with optional home link.
*
* This function is copied from WP wp_page_menu function to add an extra class as
* the default WP function has no inbuilt way to achieve this without using hacks
*
* @param array $args args.
*
* @return string html menu
*/
function themeoo_wp_page_menu( $args = array() ) {
$defaults = array(
'sort_column' => 'menu_order, post_title',
'menu_class' => 'menu',
'echo' => true,
'link_before' => '',
'link_after' => '',
);
$args = wp_parse_args( $args, $defaults );
/**
* Filter the arguments used to generate a page-based menu.
*
* @see wp_page_menu()
*
* @param array $args An array of page menu arguments.
*/
$args = apply_filters( 'wp_page_menu_args', $args ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound,WPThemeReview.CoreFunctionality.PrefixAllGlobals.NonPrefixedHooknameFound
$menu = '';
$list_args = $args;
// Show Home in the menu.
if ( ! empty( $args['show_home'] ) ) {
if ( true === $args['show_home'] || '1' === $args['show_home'] || 1 === $args['show_home'] ) {
$text = __( 'Home', 'ayyash' );
} else {
$text = $args['show_home'];
}
$class = '';
if ( is_front_page() && ! is_paged() ) {
$class = 'class="current_page_item"';
}
$menu .= '' . $args['link_before'] . $text . $args['link_after'] . '';
// If the front page is a page, add it to the exclude list.
if ( 'page' === get_option( 'show_on_front' ) ) {
if ( ! empty( $list_args['exclude'] ) ) {
$list_args['exclude'] .= ',';
} else {
$list_args['exclude'] = ''; // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_exclude
}
$list_args['exclude'] .= get_option( 'page_on_front' );
}
}
$list_args['echo'] = false;
$list_args['depth'] = 1;
$list_args['title_li'] = '';
$menu .= str_replace( array( "\r", "\n", "\t" ), '', wp_list_pages( $list_args ) ); // @phpstan-ignore-line
if ( $menu ) {
$menu = '';
}
$menu = '\n";
/**
* Filter the HTML output of a page-based menu.
*
* @see wp_page_menu()
*
* @param string $menu The HTML output.
* @param array $args An array of arguments.
*/
$menu = apply_filters( 'wp_page_menu', $menu, $args ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound,WPThemeReview.CoreFunctionality.PrefixAllGlobals.NonPrefixedHooknameFound
if ( $args['echo'] ) {
echo $menu; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
return $menu;
}
}
if ( class_exists( 'WooCommerce' ) ) {
/**
* CPT notice.
*
* @return void
*/
function themeoo_show_cpt_archive_notice() {
global $post;
$shop_page_id = wc_get_page_id( 'shop' );
if ( $post && absint( $shop_page_id ) === absint( $post->ID ) ) {
?>
get_sale_price();
$regular_price = $product->get_regular_price();
if ( ! empty( $sale_price ) && $regular_price > $sale_price ) {
$discount = ( ( (float) $regular_price - (float) $sale_price ) / (float) $regular_price ) * 100;
$discount = round( $discount, $precision );
}
}
if ( $discount > 0 ) {
printf( '%1$s%%', (float) $discount );
}
}
}
if ( ! function_exists( 'themeoo_get_product_badge' ) ) {
/**
* Get product badge.
*
* @param int $product_id Product ID.
* @param array $check check.
*
* @return void
*/
function themeoo_get_product_badge( $product_id = null, $check = array() ) {
$product_id = ! $product_id ? get_the_ID() : $product_id;
$product = wc_get_product( $product_id );
if ( ! $product ) {
return;
}
$product_tags = array_map(
function ( $tag_id ) use ( $check ) {
$term = get_term_by( 'id', $tag_id, 'product_tag' );
// @phpstan-ignore-next-line
if ( ! $term || is_wp_error( $term ) ) {
return null;
}
/**
* @var WP_Term $term
*/
if ( ! empty( $check ) && ! in_array( $term->slug, $check ) ) { // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
return null;
}
return sprintf( '%s', esc_attr( $term->slug ), esc_html( $term->name ) );
},
$product->get_tag_ids()
);
$product_tags = array_filter( $product_tags );
if ( ! empty( $product_tags ) ) {
echo implode( '', $product_tags ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
}
}
/**
* Get Layout for a view.
*
* @param string $view View.
*
* @return string
*/
function themeoo_get_content_layout( $view = '' ) {
if ( '' === $view ) {
$view = themeoo_get_current_screen();
}
$layout = wp_cache_get( 'layout_' . $view . '_style' );
if ( false === $layout ) {
$layout = themeoo_get_mod( 'layout_' . $view . '_style' );
wp_cache_set( 'layout_' . $view . '_style', $layout );
}
return apply_filters( 'themeoo_content_layout', $layout, $view );
}
/**
* Get post format content class for layout.
*
* @param string $layout
* @param string $class
*
* @return void
*/
function themeoo_get_post_format_classes( $layout = 'normal', $class = '' ) {
$map = [ 'grid', 'normal', 'medium' ];
if ( ! in_array( $layout, $map, true ) ) {
$layout = 'normal';
}
$format = get_post_format();
$classes = [
'blog-' . $layout,
'post-' . $format,
'entry-' . $format . '-post-format',
$format,
];
if ( 'medium' === $layout ) {
$classes[] = 'medium-left';
}
if ( 'gallery' === $format ) {
$classes[] = 'carousel';
$classes[] = 'slide';
$classes[] = 'blog-gallery-slider';
}
// Animations
$classes[] = 'effect';
$classes[] = 'slide-top';
if ( ! empty( $class ) ) {
if ( is_string( $class ) ) {
$class = preg_split( '#\s+#', $class );
}
if ( is_array( $class ) ) {
$classes = array_merge( $classes, $class );
}
}
if ( ! is_array( $class ) ) {
// Ensure that we always coerce class to being an array.
$class = array();
}
/**
* Filters the list of CSS post-format class names for the current post in the loop.
*
* @param string[] $classes An array of body class names.
* @param string[] $class An array of additional class names added to the body.
*/
$classes = apply_filters( 'themeoo_post_format_class', $classes, $class );
$classes = array_map( 'esc_attr', $classes );
echo 'class="' . esc_attr( implode( ' ', array_unique( $classes ) ) ) . '"';
}
/**
* Render oEmbed content.
*
* @param string $src Link to render.
* @param bool $echo display or return content.
* Default is true (display)
*
* @return void|string|false|true return embed html or false, true if displayed.
*
* @see WP_Embed::shortcode()
* WP Embed uses current (global) post's id (meta) to cache the oEmbed api responses.
*/
function themeoo_render_embedded( $src, $echo = true ) {
global $wp_embed;
if ( ! strpos( $src, '://' ) ) {
$src = ( is_ssl() ? 'http' : 'https' ) . '://' . $src;
}
$src = esc_url_raw( $src );
if ( ! $src ) {
return;
}
$embedded = $wp_embed->run_shortcode( '[embed]' . $src . '[/embed]' );
$embedded = apply_filters( 'themeoo_render_embedded', $embedded, $src );
if ( ! $echo ) {
return $embedded;
}
if ( $embedded ) {
echo $embedded; // phpcs:ignore WordPress.Security.EscapeOutput
return true;
}
return false;
}
/**
* Gets the first instance of a block in the content, and then break away.
*
* Scrapped from Twenty Twenty-One 1.0
*
* @param string $block_name The full block type name, or a partial match.
* Example: `core/image`, `core-embed/*`.
* @param string|null $content The content to search in. Use null for get_the_content().
* @param int $instances How many instances of the block will be printed (max). Defaults to 1.
*
* @return bool Returns true if a block was located & printed, otherwise false.
*/
function themeoo_get_first_instance_of_block( $block_name, $content = null, $instances = 1 ) {
if ( ! $content ) {
$content = get_the_content();
}
// Parse blocks in the content.
$blocks = parse_blocks( $content );
$instances_count = 0;
$blocks_content = '';
// Loop blocks.
foreach ( $blocks as $block ) {
// Sanity check.
if ( ! isset( $block['blockName'] ) ) {
continue;
}
// Check if this the block matches the $block_name.
// If the block ends with *, try to match the first portion.
/** @noinspection PhpLanguageLevelInspection */
if ( '*' === $block_name[-1] ) {
$is_matching_block = 0 === strpos( $block['blockName'], rtrim( $block_name, '*' ) );
} else {
$is_matching_block = $block_name === $block['blockName'];
}
if ( $is_matching_block ) {
// Add the block HTML.
$blocks_content .= render_block( $block );
// Increment count.
$instances_count++;
// Break the loop if the $instances count was reached.
if ( $instances_count >= $instances ) {
break;
}
}
}
if ( $blocks_content ) {
return apply_filters( 'the_content', $blocks_content ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound,WPThemeReview.CoreFunctionality.PrefixAllGlobals.NonPrefixedHooknameFound
}
return false;
}
/**
* Print the first instance of a block in the content, and then break away.
*
* Scrapped from Twenty Twenty-One 1.0
*
* @param string $block_name The full block type name, or a partial match.
* Example: `core/image`, `core-embed/*`.
* @param string|null $content The content to search in. Use null for get_the_content().
* @param int $instances How many instances of the block will be printed (max). Defaults to 1.
*
* @return void
*/
function themeoo_print_first_instance_of_block( $block_name, $content = null, $instances = 1 ) {
echo themeoo_get_first_instance_of_block( $block_name, $content, $instances ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}