File: /home/vanessatli/www/wp-content/themes/hestia/inc/views/blog/class-hestia-header-layout-manager.php
<?php
/**
* Hestia Header Layout Manager.
*
* @package Hestia
*/
/**
* Class Hestia_Header_Layout_Manager
*/
class Hestia_Header_Layout_Manager extends Hestia_Abstract_Main {
/**
* Init layout manager.
*/
public function init() {
add_filter( 'get_the_archive_title', array( $this, 'filter_archive_title' ) );
add_filter( 'hestia_header_layout', array( $this, 'get_header_layout' ) );
// Single Post.
add_action( 'hestia_before_single_post_wrapper', array( $this, 'post_page_header' ) );
add_action( 'hestia_before_single_post_content', array( $this, 'post_page_before_content' ) );
// Page.
add_action( 'hestia_before_single_page_wrapper', array( $this, 'post_page_header' ) );
add_action( 'hestia_before_page_content', array( $this, 'post_page_before_content' ) );
// Index.
add_action( 'hestia_before_index_wrapper', array( $this, 'post_page_header' ) );
add_action( 'hestia_before_index_posts_loop', array( $this, 'maybe_render_header' ), 0 );
add_action( 'hestia_before_index_content', array( $this, 'maybe_render_header' ), 0 );
// Search.
add_action( 'hestia_before_search_wrapper', array( $this, 'post_page_header' ) );
add_action( 'hestia_before_search_content', array( $this, 'post_page_before_content' ) );
// Attachment.
add_action( 'hestia_before_attachment_wrapper', array( $this, 'generic_header' ) );
// Archive.
add_action( 'hestia_before_archive_content', array( $this, 'generic_header' ) );
add_filter( 'body_class', array( $this, 'header_layout_body_class' ) );
add_action( 'hestia_before_single_post_wrapper', array( $this, 'do_page_header' ), 1 );
add_action( 'hestia_before_single_page_wrapper', array( $this, 'do_page_header' ), 1 );
add_action( 'hestia_before_index_wrapper', array( $this, 'do_page_header' ), 1 );
add_action( 'hestia_before_search_wrapper', array( $this, 'do_page_header' ), 1 );
add_action( 'hestia_before_attachment_wrapper', array( $this, 'do_page_header' ), 1 );
add_action( 'hestia_before_archive_content', array( $this, 'do_page_header' ), 1 );
add_action( 'hestia_before_woocommerce_wrapper', array( $this, 'do_page_header' ), 1 );
}
/**
* Do page header hook.
*/
public function do_page_header() {
$hook_name = current_filter();
ob_start();
do_action( 'hestia_do_page_header' );
$markup = ob_get_clean();
if ( ! empty( $markup ) ) {
remove_all_actions( $hook_name );
echo $markup;
}
}
/**
* Remove "Category:", "Tag:", "Author:" from the archive title.
*
* @param string $title Archive title.
*
* @return string
*/
public function filter_archive_title( $title ) {
if ( is_category() ) {
$title = single_cat_title( '', false );
} elseif ( is_tag() ) {
$title = single_tag_title( '', false );
} elseif ( is_author() ) {
$title = '<span class="vcard">' . get_the_author() . '</span>';
} elseif ( is_year() ) {
$title = get_the_date( 'Y' );
} elseif ( is_month() ) {
$title = get_the_date( 'F Y' );
} elseif ( is_day() ) {
$title = get_the_date( 'F j, Y' );
} elseif ( is_post_type_archive() ) {
$title = post_type_archive_title( '', false );
} elseif ( is_tax() ) {
$title = single_term_title( '', false );
}
return $title;
}
/**
* Get page specific layout or the customizer setting.
*
* @param string $layout Header layout.
*
* @return string
*/
public function get_header_layout( $layout ) {
$page_id = hestia_get_current_page_id();
$frontpage_id = get_option( 'page_on_front' );
$page_template = get_page_template_slug( $page_id );
$disable_frontpage_sections = get_theme_mod( 'disable_frontpage_sections', false );
/**
* Is Hestia frontpage layout.
*/
if ( (int) $frontpage_id === (int) $page_id && empty( $page_template ) && $disable_frontpage_sections !== true ) {
$layout = 'default';
}
/**
* If it's blog, default will be 'default'
*/
if ( ( is_home() && is_front_page() ) || is_archive() ) {
$layout = 'default';
}
if ( get_post_type() === 'jetpack-portfolio' ) {
$layout = 'default';
}
/**
* By default, get value from customizer. If it's cart or checkout, the default will be no-content.
*/
if ( class_exists( 'WooCommerce', false ) ) {
if ( is_cart() || is_checkout() ) {
$layout = 'no-content';
}
if ( is_shop() ) {
$layout = 'default';
}
if ( is_product() ) {
$layout = get_theme_mod( 'hestia_product_layout', 'no-content' );
}
}
/**
* Try to get individual layout.
*/
$individual_layout = $this->should_use_individual_layout() ? get_post_meta( $page_id, 'hestia_header_layout', true ) : '';
return ! empty( $individual_layout ) ? $individual_layout : $layout;
}
/**
* Check if we should use the individual layout.
*
* @return bool
*/
private function should_use_individual_layout() {
if ( is_singular() ) {
return true;
}
$page_id = hestia_get_current_page_id();
$page_for_posts = get_option( 'page_for_posts' );
if ( $page_for_posts === $page_id ) {
return true;
}
if ( class_exists( 'WooCommerce', false ) ) {
$shop = get_option( 'woocommerce_shop_page_id' );
if ( $shop === $page_id ) {
return true;
}
}
return false;
}
/**
* The single post header.
*/
public function post_page_header() {
$layout = apply_filters( 'hestia_header_layout', get_theme_mod( 'hestia_header_layout', 'default' ) );
if ( 'classic-blog' === $layout ) {
add_filter( 'hestia_boxed_layout', '__return_empty_string' );
return;
}
$this->display_header( $layout, 'post' );
}
/**
* Single post before content.
* This function display the title in page if layout is not default.
*/
public function post_page_before_content() {
$layout = apply_filters( 'hestia_header_layout', get_theme_mod( 'hestia_header_layout', 'default' ) );
if ( 'default' === $layout ) {
return;
}
echo $this->render_header( $layout );
}
/**
* Display page header on single page and on full width page template.
*
* @param string $layout header layout.
* @param string $type post / page / other.
*/
private function display_header( $layout, $type ) {
echo '<div id="primary" class="' . esc_attr( $this->boxed_page_layout_class() ) . ' page-header header-small" data-parallax="active" >';
switch ( $type ) {
case 'post':
case 'page':
if ( 'no-content' !== $layout ) {
echo $this->render_header( $layout );
}
break;
case 'generic':
echo $this->render_header( $layout );
break;
}
$this->render_header_background();
echo '</div>';
}
/**
* Decide if header should be before featured post or before content.
*/
public function maybe_render_header() {
$hook = current_action();
if ( 'hestia_before_index_posts_loop' === $hook && false !== hestia_featured_posts_enabled() ) {
$this->post_page_before_content();
}
if ( 'hestia_before_index_content' === $hook && false === hestia_featured_posts_enabled() ) {
$this->post_page_before_content();
}
}
/**
* Get classic blog header class.
*
* @return string
*/
private function get_classic_header_class() {
$default = hestia_get_blog_layout_default();
$sidebar_layout = apply_filters( 'hestia_sidebar_layout', get_theme_mod( 'hestia_blog_sidebar_layout', $default ) );
if ( class_exists( 'WooCommerce', false ) && is_shop() ) {
return 'col-md-12';
}
if ( get_post_type() === 'jetpack-portfolio' ) {
return 'col-md-12';
}
if ( is_404() ) {
return 'col-md-10 col-md-offset-2';
}
if ( is_page() ) {
return 'col-md-12';
}
if ( is_active_sidebar( 'sidebar-1' ) ) {
return 'col-md-12';
}
if ( 'full-width' !== $sidebar_layout && is_customize_preview() && ! is_active_sidebar( 'sidebar-1' ) ) {
return 'col-md-12';
}
if ( ( 'full-width' === $sidebar_layout || ! is_active_sidebar( 'sidebar-1' ) ) && false === hestia_featured_posts_enabled() ) {
return 'col-md-12';
}
return 'col-md-10 col-md-offset-1';
}
/**
* Display header content based on layout.
*
* @param string $layout header layout.
*
* @return string
*/
private function render_header( $layout ) {
$current_page = get_queried_object();
$pid = $current_page instanceof WP_Post ? $current_page->ID : get_the_ID();
$specific_hide_title = get_post_meta( $pid, 'hestia_meta_disable_title', true );
// Hide the post title if the individual page option is enabled.
if ( class_exists( 'Hestia_Addon_Manager' ) && 'on' === $specific_hide_title ) {
return;
}
if ( is_attachment() ) {
$layout = 'default';
}
$header_output = '';
if ( 'default' !== $layout ) {
$header_output .= ' <div class="row"><div class="' . $this->get_classic_header_class() . '">';
}
$header_output .= $this->header_content( $layout );
$header_output .= $this->maybe_render_post_meta( $layout );
if ( 'classic-blog' === $layout ) {
$header_output .= $this->add_image_in_content();
}
if ( 'default' !== $layout ) {
$header_output .= '</div></div>';
}
if ( 'default' === $layout ) {
$header_output = '<div class="container"><div class="row"><div class="col-md-10 col-md-offset-1 text-center">' . $header_output . '</div></div></div>';
}
return $header_output;
}
/**
* Add image in content for classic-blog layout.
*
* @return string
*/
private function add_image_in_content() {
if ( class_exists( 'WooCommerce', false ) && ( is_product() || is_cart() || is_checkout() ) ) {
return '';
}
$image_url = $this->get_page_background();
if ( empty( $image_url ) ) {
return '';
}
$image_id = attachment_url_to_postid( $image_url );
$image1_alt = '';
if ( $image_id ) {
$image1_alt = get_post_meta( $image_id, '_wp_attachment_image_alt', true );
}
$image_markup = '<img class="wp-post-image image-in-page" src="' . esc_url( $image_url ) . '" alt="' . esc_attr( $image1_alt ) . '">';
if ( class_exists( 'WooCommerce', false ) && is_shop() ) {
$image_markup = '<div class="col-md-12 image-in-page-wrapper">' . $image_markup . '</div>';
}
return $image_markup;
}
/**
* Header content display.
*
* @param string $header_layout the header layout.
*/
private function header_content( $header_layout ) {
$title_class = 'hestia-title';
if ( 'default' !== $header_layout ) {
$title_class .= ' title-in-content';
}
if ( is_404() ) {
$header_content_output = '<h1 class="hestia-title">' . esc_html__( 'Oops! That page can’t be found.', 'hestia' ) . '</h1>';
return $header_content_output;
}
if ( is_archive() ) {
$title = get_the_archive_title();
$header_content_output = '';
if ( ! empty( $title ) ) {
$header_content_output .= '<h1 class="hestia-title">' . $title . '</h1>';
}
$description = get_the_archive_description();
if ( $description ) {
$header_content_output .= '<h5 class="description">' . $description . '</h5>';
}
return $header_content_output;
}
if ( is_search() ) {
$header_content_output = '<h1 class="' . esc_attr( $title_class ) . '">';
/* translators: search result */
$header_content_output .= sprintf( esc_html__( 'Search Results for: %s', 'hestia' ), get_search_query() );
$header_content_output .= '</h1>';
return $header_content_output;
}
$disabled_frontpage = get_theme_mod( 'disable_frontpage_sections', false );
if ( is_front_page() && get_option( 'show_on_front' ) === 'page' && true === (bool) $disabled_frontpage ) {
$header_content_output = '<h1 class="' . esc_attr( $title_class ) . '">';
$header_content_output .= single_post_title( '', false );
$header_content_output .= '</h1>';
return $header_content_output;
}
if ( is_front_page() && get_option( 'show_on_front' ) === 'posts' ) {
$header_content_output = '<h1 class="' . esc_attr( $title_class ) . '">';
$header_content_output .= get_bloginfo( 'description' );
$header_content_output .= '</h1>';
return $header_content_output;
}
if ( is_home() ) {
$header_content_output = '<h1 class="' . esc_attr( $title_class ) . '">' . single_post_title( '', false ) . '</h1>';
return $header_content_output;
}
$entry_class = '';
if ( ! is_page() ) {
$entry_class = 'entry-title';
}
$header_content_output = '<h1 class="' . esc_attr( $title_class ) . ' ' . esc_attr( $entry_class ) . '">' . wp_kses_post( get_the_title() ) . '</h1>';
return $header_content_output;
}
/**
* Check if post meta should be displayed.
*
* @param string $header_layout the header layout.
*/
private function maybe_render_post_meta( $header_layout ) {
if ( ! is_single() ) {
return '';
}
if ( class_exists( 'WooCommerce', false ) ) {
if ( is_product() ) {
return '';
}
}
global $post;
$post_meta_output = '';
$author_id = $post->post_author;
$author_name = get_the_author_meta( 'display_name', $author_id );
$author_posts_url = get_author_posts_url( get_the_author_meta( 'ID', $author_id ) );
if ( 'default' === $header_layout ) {
$post_meta_output .= '<h4 class="author">';
} else {
$post_meta_output .= '<p class="author meta-in-content">';
}
$post_meta_output .= apply_filters(
'hestia_single_post_meta',
sprintf(
/* translators: %1$s is Author name wrapped, %2$s is Date*/
esc_html__( 'Published by %1$s on %2$s', 'hestia' ),
/* translators: %1$s is Author name, %2$s is Author link*/
sprintf(
'<a href="%2$s" class="vcard author"><strong class="fn">%1$s</strong></a>',
esc_html( $author_name ),
esc_url( $author_posts_url )
),
$this->get_time_tags()
)
);
if ( 'default' === $header_layout ) {
$post_meta_output .= '</h4>';
} else {
$post_meta_output .= '</p>';
}
return $post_meta_output;
}
/**
* Get <time> tags.
*
* @return string
*/
private function get_time_tags() {
$time = '';
$time .= '<time class="entry-date published" datetime="' . esc_attr( get_the_date( 'c' ) ) . '" content="' . esc_attr( get_the_date( 'Y-m-d' ) ) . '">';
$time .= esc_html( get_the_time( get_option( 'date_format' ) ) );
$time .= '</time>';
if ( get_the_time( 'U' ) === get_the_modified_time( 'U' ) ) {
return $time;
}
$time .= '<time class="updated hestia-hidden" datetime="' . esc_attr( get_the_modified_date( 'c' ) ) . '">';
$time .= esc_html( get_the_time( get_option( 'date_format' ) ) );
$time .= '</time>';
return $time;
}
/**
* Add the class to account for boxed page layout.
*
* @return string
*/
private function boxed_page_layout_class() {
$layout = get_theme_mod( 'hestia_general_layout', apply_filters( 'hestia_boxed_layout_default', 1 ) );
if ( isset( $layout ) && true === (bool) $layout ) {
return 'boxed-layout-header';
}
return '';
}
/**
* Render the header background div.
*/
private function render_header_background() {
$background_image = apply_filters( 'hestia_header_image_filter', $this->get_page_background() );
$customizer_background_image = get_background_image();
$header_filter_div = '<div class="header-filter';
/* Header Image */
if ( ! empty( $background_image ) ) {
$header_filter_div .= '" style="background-image: url(' . esc_url( $background_image ) . ');"';
/* Gradient Color */
} elseif ( empty( $customizer_background_image ) ) {
$header_filter_div .= ' header-filter-gradient"';
/* Background Image */
} else {
$header_filter_div .= '"';
}
$header_filter_div .= '></div>';
echo apply_filters( 'hestia_header_wrapper_background_filter', $header_filter_div );
}
/**
* Get header background image for single page.
*
* @return false|string
*/
private function get_post_page_background() {
if ( class_exists( 'WooCommerce', false ) && is_product() ) {
return false;
}
if ( is_archive() ) {
return false;
}
$pid = hestia_get_current_page_id();
if ( empty( $pid ) ) {
return false;
}
// Get featured image.
$thumb_tmp = get_the_post_thumbnail_url( $pid );
if ( is_home() && 'page' === get_option( '`show_on_front`' ) ) {
$page_for_posts_id = get_option( 'page_for_posts' );
if ( ! empty( $page_for_posts_id ) ) {
$thumb_tmp = get_the_post_thumbnail_url( $page_for_posts_id );
}
}
return $thumb_tmp;
}
/**
* Handle Pages and Posts Header image.
* Single Product: Product Category Image > Header Image > Gradient
* Product Category: Product Category Image > Header Image > Gradient
* Shop Page: Shop Page Featured Image > Header Image > Gradient
* Blog Page: Page Featured Image > Header Image > Gradient
* Single Post: Featured Image > Gradient
*/
private function get_page_background() {
// Default header image.
$thumbnail = get_header_image();
$use_header_image_sitewide = get_theme_mod( 'hestia_header_image_sitewide', false );
// If the option to use Header Image Sitewide is enabled, return header image and exit function.
if ( true === (bool) $use_header_image_sitewide ) {
return esc_url( $thumbnail );
}
$thumbnail = $this->get_post_page_background();
if ( ! empty( $thumbnail ) ) {
return esc_url( $thumbnail );
}
return esc_url( get_header_image() );
}
/**
* Generic header used for index | search | attachment | WooCommerce.
*/
public function generic_header() {
$this->display_header( 'default', 'generic' );
}
/**
* Add header body classes.
*
* @param array $classes body classes.
*
* @return array
*/
public function header_layout_body_class( $classes ) {
$layout = apply_filters( 'hestia_header_layout', get_theme_mod( 'hestia_header_layout', 'default' ) );
$classes[] = 'header-layout-' . $layout;
return $classes;
}
}