setup_hook();
}
/**
* Setup Hooks
*/
private function setup_hook() {
add_action( 'wp', array( $this, 'header_footer_template' ) );
if ( class_exists( '\Elementor\Plugin' ) ) {
add_filter( 'template_include', array( $this, 'custom_template' ), 11 );
}
add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_styles' ) );
}
/**
* Get class template instance
*
* @return Template
*/
public static function instance() {
if ( null === static::$instance ) {
static::$instance = new static();
}
return static::$instance;
}
/**
* Enqueue Styles
*/
public function enqueue_styles() {
if ( class_exists( '\Elementor\Plugin' ) && ! empty( \Elementor\Plugin::$instance->frontend ) ) {
\Elementor\Plugin::$instance->frontend->enqueue_styles();
}
}
/**
* Get custom template
*
* @param string $template Template location.
*
* @return string
*/
public function custom_template( $template ) {
global $post;
if ( null !== $post && is_single() && ( 'jkit-header' === $post->post_type || 'jkit-footer' === $post->post_type ) ) {
if ( file_exists( JEG_ELEMENTOR_KIT_DIR . 'templates/single-template.php' ) ) {
return JEG_ELEMENTOR_KIT_DIR . 'templates/single-template.php';
}
}
if ( is_404() ) {
$notfound_template = get_option( 'jkit_notfound_template' );
if ( $notfound_template && 'publish' === get_post_status( $notfound_template ) ) {
return JEG_ELEMENTOR_KIT_DIR . 'templates/404-template.php';
}
}
return $template;
}
/**
* Setup hook for custom header and footer template
*/
public function header_footer_template() {
if ( ! defined( 'ELEMENTOR_VERSION' ) ) {
return;
}
if ( $this->get_header_template() ) {
add_action( 'get_header', array( $this, 'override_theme_header_template' ), 99 );
add_action( 'jkit_header', array( $this, 'render_header' ) );
}
if ( $this->get_footer_template() ) {
add_action( 'get_footer', array( $this, 'override_theme_footer_template' ), 99 );
add_action( 'jkit_footer', array( $this, 'render_footer' ) );
}
}
/**
* Get all footer template
*
* @return array
*/
public function get_footer_template() {
if ( ! $this->footer_template ) {
$this->footer_template = jkit_get_element( 'publish', Dashboard::$jkit_footer );
}
return $this->footer_template;
}
/**
* Get all header template
*
* @return array
*/
public function get_header_template() {
if ( ! $this->header_template ) {
$this->header_template = jkit_get_element( 'publish', Dashboard::$jkit_header );
}
return $this->header_template;
}
/**
* Override footer template from theme
*/
public function override_theme_footer_template() {
load_template( JEG_ELEMENTOR_KIT_DIR . 'templates/footer-template.php' );
$templates = array();
$templates[] = 'footer.php';
remove_all_actions( 'wp_footer' );
ob_start();
locate_template( $templates, true );
ob_get_clean();
}
/**
* Override header template from theme
*/
public function override_theme_header_template() {
load_template( JEG_ELEMENTOR_KIT_DIR . 'templates/header-template.php' );
$templates = array();
$templates[] = 'header.php';
remove_all_actions( 'wp_head' );
ob_start();
locate_template( $templates, true );
ob_get_clean();
}
/**
* Render custom footer template
*/
public function render_footer() {
$post_id = get_the_ID();
$footers = $this->get_footer_template();
$footer_id = null;
foreach ( $footers as $footer ) {
$flag = $this->check_conditions( $post_id, $footer['id'] );
if ( $flag ) {
$footer_id = $footer['id'];
break;
}
}
if ( $footer_id ) {
?>
get_header_template();
$header_id = null;
foreach ( $headers as $header ) {
$flag = $this->check_conditions( $post_id, $header['id'] );
if ( $flag ) {
$header_id = $header['id'];
break;
}
}
if ( $header_id ) {
?>
frontend->get_builder_content_for_display( $footer_id, true );
}
/**
* Get content of custom header template
*/
public function get_header_content( $header_id ) {
/** Handled by Elementor self */
echo \Elementor\Plugin::instance()->frontend->get_builder_content_for_display( $header_id, true );
}
/**
* Check general condition
*/
public function check_conditions( $post_id, $header_id ) {
$flag = true;
$conditions = get_post_meta( $header_id, Dashboard::$jkit_condition, true );
$conditions = maybe_unserialize( $conditions );
if ( $conditions ) {
foreach ( $conditions as $condition ) {
switch ( $condition['location'] ) {
case 'singular':
case 'post_single':
$flag = $flag && $this->condition_singular( $post_id, $condition );
break;
case 'category':
case 'post_tag':
$flag = $flag && $this->condition_post_terms( $post_id, $condition, $condition['location'] );
break;
case 'archives':
$flag = $flag && $this->condition_archive( $condition );
break;
case 'shop_page':
$flag = $flag && $this->condition_shop_page( $condition );
break;
case 'product_cat':
case 'product_tag':
$flag = $flag && $this->condition_product_terms( $post_id, $condition, $condition['location'] );
break;
case 'product_single':
$flag = $flag && $this->condition_product( $post_id, $condition );
break;
}
}
if ( jkit_is_multilanguage() && ! empty( $condition['language'] ) ) {
$flag = $flag && $condition['language'] === jkit_get_current_language();
}
} else {
$flag = false;
}
return apply_filters( 'jkit_check_template_conditions', $flag, $post_id, $header_id, $conditions );
}
/**
* Check shop page condition
*/
public function condition_shop_page( $condition ) {
$flag = ( function_exists( 'is_shop' ) && is_shop() );
if ( 'include' === $condition['enclose'] ) {
if ( ! $flag ) {
return false;
}
} elseif ( $flag ) {
return false;
}
return true;
}
/**
* Check single product condition
*/
public function condition_product( $post_id, $condition ) {
$flag = in_array( $post_id, explode( ',', $condition['product'] ) );
if ( 'include' === $condition['enclose'] ) {
if ( ! $flag ) {
return false;
}
} elseif ( $flag ) {
return false;
}
return true;
}
/**
* Check post taxonomy condition
*/
public function condition_post_terms( $post_id, $condition, $taxonomy ) {
$post_terms_ids = array();
$post_terms_now = get_the_terms( $post_id, $taxonomy );
$post_terms_filter = explode( ',', $condition[ $taxonomy ] );
if ( $post_terms_now && is_array( $post_terms_now ) ) {
foreach ( $post_terms_now as $item ) {
$post_terms_ids[] = $item->term_id;
}
}
$flag = array_intersect( $post_terms_ids, $post_terms_filter );
if ( 'include' === $condition['enclose'] ) {
if ( empty( $flag ) ) {
return false;
}
} elseif ( $flag ) {
return false;
}
return true;
}
/**
* Check product taxonomy condition
*/
public function condition_product_terms( $post_id, $condition, $taxonomy ) {
if ( $condition[ $taxonomy ] ) {
$product_terms_now = wc_get_product_term_ids( $post_id, $taxonomy );
$product_terms_filter = explode( ',', $condition[ $taxonomy ] );
$flag = array_intersect( $product_terms_now, $product_terms_filter );
if ( 'include' === $condition['enclose'] ) {
if ( empty( $flag ) ) {
return false;
}
} elseif ( $flag ) {
return false;
}
}
return true;
}
/**
* Check singular condition
*/
public function condition_singular( $post_id, $condition ) {
switch ( $condition['singular'] ) {
case 'notfound':
$flag = is_404();
break;
case 'front':
$flag = is_front_page();
break;
case 'singular':
default:
$flag = is_singular() && $this->condition_singular_detail( $post_id, $condition );
}
if ( 'include' === $condition['enclose'] ) {
return $flag;
} else {
return ! $flag;
}
}
/**
* Check archive condition
*/
public function condition_archive( $condition ) {
$flag = true;
switch ( $condition['archives'] ) {
case 'date':
$flag = is_date();
break;
case 'search':
$flag = is_search();
break;
case 'author':
$object = get_queried_object();
$flag = is_author();
if ( ! empty( $condition['archives_author'] ) ) {
$authors = explode( ',', $condition['archives_author'] );
$author_id = $object->ID;
if ( in_array( (string) $author_id, $authors, true ) ) {
$flag = $flag && true;
} else {
$flag = $flag && false;
}
}
break;
case 'taxonomy':
$object = get_queried_object();
$flag = is_archive();
if ( ! empty( $condition['archive_taxonomy'] ) && $object ) {
$terms = explode( ',', $condition['archive_taxonomy'] );
$term_id = $object->term_id;
if ( in_array( (string) $term_id, $terms, true ) ) {
$flag = $flag && true;
} else {
$flag = $flag && false;
}
}
break;
}
$taxonomies = jkit_get_taxonomies( false );
$object = get_queried_object();
if ( in_array( $condition['archives'], $taxonomies ) && $object ) {
if ( isset( $object->taxonomy ) && $object->taxonomy === $condition['archives'] ) {
if ( $condition['archive_taxonomy'] && ! in_array( $object->term_id, explode( ',', $condition['archive_taxonomy'] ) ) ) {
$flag = false;
}
} else {
$flag = false;
}
}
if ( 'include' === $condition['enclose'] ) {
return $flag;
} else {
return ! $flag;
}
}
/**
* Check detail singular condition
*/
public function condition_singular_detail( $post_id, $condition ) {
$flag = true;
// Check Post Type Condition
if ( '' === $condition['posttype'] ) {
$flag = $flag && true;
} else {
$post_type_flag = get_post_type( $post_id ) === $condition['posttype'];
$flag = $flag && $post_type_flag;
}
// Check post ID
if ( ! empty( $condition['singular_post'] ) ) {
$posts = explode( ',', $condition['singular_post'] );
if ( in_array( (string) $post_id, $posts, true ) ) {
$flag = $flag && true;
} else {
$flag = $flag && false;
}
}
// Check taxonomy
if ( ! empty( $condition['singular_taxonomy'] ) ) {
$taxonomies = get_taxonomies( '', 'names' );
$terms = wp_get_post_terms( $post_id, $taxonomies, array( 'fields' => 'ids' ) );
$term_flag = false;
if ( $terms ) {
$taxonomies = explode( ',', $condition['singular_taxonomy'] );
foreach ( $taxonomies as $term ) {
$term = (int) $term;
$term_flag = $term_flag || in_array( $term, $terms, true );
}
}
$flag = $flag && $term_flag;
}
// Check Author
if ( ! empty( $condition['singular_author'] ) ) {
$authors = explode( ',', $condition['singular_author'] );
$author_id = get_post_field( 'post_author', $post_id );
if ( in_array( $author_id, $authors, true ) ) {
$flag = $flag && true;
} else {
$flag = $flag && false;
}
}
return $flag;
}
}