<?php
namespace Aepro;
use Elementor;
use Elementor\Plugin;
use Elementor\Post_CSS_File;
use WP_Query;
use Elementor\Core\Settings\Manager as SettingsManager;
use Elementor\Core\Responsive\Responsive;
class Frontend{
private static $_instance = null;
private $_hook_templates = array();
private $_page_type = null;
private $_page_info = array();
public static $_ae_post_block = 0;
public static $_in_repeater_block = false;
public static function instance() {
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
private function __construct() {
add_shortcode('INSERT_ELEMENTOR',[ $this, 'render_shortcode' ]);
add_shortcode('AE_SEARCH_KEY', [ $this, 'ae_search_key' ]);
add_shortcode('AE_SEARCH_COUNT', [ $this, 'ae_search_count' ]);
add_action('init',[$this, 'init']);
add_filter('aepro_single_data', [ $this, 'apply_ae_single_post_template'],10,1);
add_action('aepro_archive_data', [ $this, 'apply_ae_archive_template'],10,1);
add_action('aepro_404', [$this, 'apply_404_template']);
add_action('ae_pro_search', [$this, 'apply_search_template']);
// remove theme hooks and action for single page/post
add_action('template_redirect', [ $this, 'ae_template_hook']);
add_action('template_redirect', [ $this, 'set_page_type']);
add_action('template_redirect', [ $this, 'bind_template_for_hooks']);
add_filter('ae_template_filter', [ $this, 'term_based_post_template']);
add_filter('acf/pre_load_post_id', [ $this, 'acf_post_block_loop']);
}
public function acf_post_block_loop($post_id){
if(Frontend::$_ae_post_block != 0){
$post_id = Frontend::$_ae_post_block;
}
return $post_id;
}
public function ae_search_key(){
if(is_search()){
return esc_html( get_search_query( false ) );
}else{
return 'Search Key';
}
}
public function ae_search_count(){
if(is_search()){
global $wp_query;
return $wp_query->found_posts;
}else{
return '0';
}
}
public function set_page_type(){
if ( is_front_page() && is_home() ) {
// Default Home
$this->_page_type = 'home';
} elseif ( is_front_page() ) {
// Static Home
$this->_page_type = 'home';
} elseif ( is_home() ) {
//Blog Page
$this->_page_type = 'blog';
} else {
if(is_singular()){
$this->_page_type = 'single';
return;
}
if(is_archive() || is_category() || is_tag()){
$this->_page_type = 'archive';
$this->_page_info = get_queried_object();
return;
}
if(is_search()){
$this->_page_type = 'search';
return;
}
if(is_404()){
$this->_page_type = '404';
return;
}
if(is_author()){
$this->_page_type = 'author';
}
}
}
public function init(){
//$this->bind_template_for_hooks();
}
public function render_shortcode($atts){
if(!isset($atts['id']) || empty($atts['id'])){
return '';
}
$template_id = $atts['id'];
return $this->render_insert_elementor($template_id);
}
public function run_elementor_builder($template_id){
if(!isset($template_id) || empty($template_id)){
return '';
}
$post_id = $template_id;
ob_start();
if(Plugin::$instance->db->is_built_with_elementor( $post_id )) {
?>
<div class="ae_data elementor elementor-<?php echo $post_id; ?>" data-aetid="<?php echo $post_id; ?>">
<?php echo Elementor\Plugin::instance()->frontend->get_builder_content_for_display( $post_id ); ?>
</div>
<?php
}else{
echo __('Not a valid elementor page','ae-pro');
}
$response = ob_get_contents();
ob_end_clean();
return $response;
}
public function render_insert_elementor($template_id,$with_css = false){
if(!isset($template_id) || empty($template_id)){
return '';
}
$post_id = $template_id;
// check if page is elementor page
$edit_mode = get_post_meta($post_id,'_elementor_edit_mode','');
$post_id = apply_filters( 'wpml_object_id', $post_id, 'ae_global_templates' );
ob_start();
if(Plugin::$instance->db->is_built_with_elementor( $post_id )) {
?>
<div class="ae_data elementor elementor-<?php echo $post_id; ?>" data-aetid="<?php echo $post_id; ?>">
<?php
echo Elementor\Plugin::instance()->frontend->get_builder_content( $post_id,$with_css );
add_action('wp_footer', function(){
if(is_archive()){
$elementor_frontend_config['settings'] = $this->get_init_settings();
wp_localize_script( 'elementor-frontend', 'elementorFrontendConfig', $elementor_frontend_config['settings'] );
//echo '<pre>'; print_r($elementor_frontend_config); die();
}
});
?>
</div>
<?php
}else{
echo __('Not a valid elementor page','ae-pro');
}
$response = ob_get_contents();
ob_end_clean();
return do_shortcode($response);
}
private function print_ae_data($sections){
foreach ( $sections as $section_data ) {
$section = new Elementor\Element_Section( $section_data );
$section->print_element();
}
}
public function bind_template_for_hooks(){
$curr_post = $GLOBALS['post'];
if(is_admin()){ return; }
$hook_positions = Aepro::instance()->get_hook_positions();
$hook_positions = apply_filters('ae_pro_filter_hook_positions',$hook_positions);
$meta_query = array('relation' => 'OR');
foreach($hook_positions as $key => $hook_position){
if(empty($hook_position)){
continue;
}
$meta_query[] = array(
'key' => 'ae_usage',
'value' => $key,
'compare' => '='
);
}
$args = array(
'post_type' => 'ae_global_templates',
'posts_per_page' => -1,
'meta_key' => 'ae_render_mode',
'meta_value' => 'normal'
//'meta_query' => $meta_query
);
$templates = new WP_Query($args);
if($templates->found_posts){
while($templates->have_posts()){
$templates->the_post();
$tid = get_the_ID();
if(!$this->validate_hook($tid,$curr_post)){
continue;
}
$hook_position = get_post_meta($tid,'ae_usage',true);
if($hook_position == 'custom'){
$hook_position = get_post_meta($tid,'ae_custom_usage_area',true);
}
if(!empty($hook_position)){
$this->_hook_templates[$hook_position] = $tid;
add_action($hook_position,function(){
$current_filter = current_filter();
echo $this->render_insert_elementor($this->_hook_templates[$current_filter]);
},10,1);
}
}
wp_reset_postdata();
}
}
/**
* Checks whether hook is valid for these page as per
* rules settings in AE Template
* @param $tid
* @param null $curr_post
* @return bool
*/
protected function validate_hook($tid,$curr_post = null){
$ae_apply_global = get_post_meta($tid,'ae_apply_global',true);
if($ae_apply_global === 'true'){
// applied globally without any restriction
return true;
}
$ae_hook_apply_on = get_post_meta($tid,'ae_hook_apply_on');
switch($this->_page_type){
case 'single' : // check if AE Template is allowed on current page type,
if(!isset($ae_hook_apply_on[0]) || !in_array($this->_page_type,$ae_hook_apply_on[0])){
return false;
}
// check if post type allowed
$ae_hook_post_types = get_post_meta($tid,'ae_hook_post_types');
if(!isset($ae_hook_post_types[0]) || !in_array($curr_post->post_type,$ae_hook_post_types[0])){
return false;
}
$ae_hook_posts_selected = get_post_meta($tid,'ae_hook_posts_selected',true);
$ae_hook_posts_excluded = get_post_meta($tid,'ae_hook_posts_excluded',true);
if(!empty($ae_hook_posts_selected)){
$ae_hps = explode(',',$ae_hook_posts_selected);
if(!in_array($curr_post->ID,$ae_hps)){
return false;
}
}elseif(!empty($ae_hook_posts_excluded)){
$ae_hpe = explode(',',$ae_hook_posts_excluded);
if(in_array($curr_post->ID,$ae_hpe)){
return false;
}
}
break;
case 'archive' : // check if AE Template is allowed on current page type,
if(!isset($ae_hook_apply_on[0]) || !in_array($this->_page_type,$ae_hook_apply_on[0])){
return false;
}
// check if taxonomy is allowed
$ae_hook_taxonomies = get_post_meta($tid,'ae_hook_taxonomies');
if(!isset($ae_hook_taxonomies[0]) || !in_array($this->_page_info->taxonomy,$ae_hook_taxonomies[0])){
return false;
}
$ae_hook_terms_selected = get_post_meta($tid,'ae_hook_terms_selected',true);
$ae_hook_terms_excluded = get_post_meta($tid,'ae_hook_terms_excluded',true);
if(!empty($ae_hook_terms_selected)){
$ae_hts = explode(',',$ae_hook_terms_selected);
if(!in_array($this->_page_info->term_id,$ae_hts)){
return false;
}
}
if(!empty($ae_hook_terms_excluded)){
$ae_hte = explode(',',$ae_hook_terms_excluded);
if(in_array($this->_page_info->term_id,$ae_hte)){
return false;
}
}
break;
default : if(!isset($ae_hook_apply_on[0]) || !in_array($this->_page_type,$ae_hook_apply_on[0])){
return false;
}
}
return true;
}
public function apply_ae_single_post_template($content){
global $post;
if ( post_password_required( $post->ID ) ) {
echo get_the_password_form( $post->ID );
return $content;
}
$helper = new Helper();
if(!is_single() && !is_page()){
return $content;
}
$post_id = $GLOBALS['post']->ID;
if(class_exists('WooCommerce') && $GLOBALS['post']->post_type == 'product'){
$content = '<div class="product">';
$content .= $this->apply_ae_wc_single_template();
$content .= '</div>';
echo $content;
return $content;
}
// check ae_post_template
$ae_post_template = $helper->get_ae_active_post_template($post_id,$GLOBALS['post']->post_type);
if(isset($ae_post_template) && is_numeric($ae_post_template)){
$template_content = $this->render_insert_elementor($ae_post_template);
echo $template_content;
}
return $content;
}
public function apply_ae_archive_template($content){
$helper = new Helper();
$ae_archive_template = $helper->get_ae_active_archive_template();
if($ae_archive_template){
$template_content = $this->render_insert_elementor($ae_archive_template);
echo $template_content;
}
return $content;
}
/**
* Remove hooks for post single page
*/
public function ae_template_hook(){
$helper = new Helper();
$is_blog = $helper->is_blog();
$theme_obj = Aepro::$_theme;
if(is_single() || is_page()){
$post = get_post();
$tid_post = $helper->get_ae_active_post_template($post->ID,$post->post_type);
$post_is_canvas_enabled = $helper->is_canvas_enabled($tid_post);
$is_hf_enabled = $helper->is_heder_footer_enabled($tid_post);
if(!$tid_post){
return false;
}
if(class_exists('WooCommerce') && $post->post_type == 'product'){
remove_action( 'woocommerce_before_main_content','hestia_woocommerce_before_main_content');
add_filter('body_class',function($classes){
$classes[] = 'aep-product';
return $classes;
});
//return false;
}
// Todo:: Move remove actions to separate file. Run only after theme detect.
if($post_is_canvas_enabled){
$theme_obj->setUseCanvas(true);
}
if($is_hf_enabled){
$theme_obj->setUseHeaderFooter(true);
}
$theme_obj->manage_actions();
// handle canvas template
add_filter('template_include', [$this, 'handle_canvas_template']);
}elseif(is_search()){
$tid_search = $helper->has_search_template();
if($tid_search){
if($helper->is_canvas_enabled($tid_search)){
$theme_obj->setUseCanvas(true);
}
if($helper->is_heder_footer_enabled($tid_search)){
$theme_obj->setUseHeaderFooter(true);
}
$theme_obj->manage_actions();
}
}elseif(is_archive()){
$tid = $helper->get_ae_active_archive_template();
if(!$tid && !$is_blog){
return false;
}
// check if canvas enabled
if($helper->is_full_override($tid)){
$theme_obj->setOverride('full');
}
if($helper->is_canvas_enabled($tid)){
$theme_obj->setUseCanvas(true);
}
if($helper->is_heder_footer_enabled($tid)){
$theme_obj->setUseHeaderFooter(true);
}
$theme_obj->manage_actions();
}elseif($is_blog){
$template_id = $helper->get_ae_active_archive_template();
if(!$template_id){
return false;
}
// is blog - force load archive template
$theme_obj = Aepro::$_theme;
$theme_obj->setPageType('blog');
if($helper->is_full_override($template_id)){
$theme_obj->setOverride('full');
if($helper->is_canvas_enabled($template_id)){
$theme_obj->setUseCanvas(true);
}
if($helper->is_heder_footer_enabled($template_id)){
$theme_obj->setUseHeaderFooter(true);
}
}
$theme_obj->manage_actions();
}elseif(is_404()){
$tid_404 = $helper->has_404_template();
if($tid_404){
if($helper->is_canvas_enabled($tid_404)){
$theme_obj->setUseCanvas(true);
}
if($helper->is_heder_footer_enabled($tid_404)){
$theme_obj->setUseHeaderFooter(true);
}
$theme_obj->manage_actions();
}
}
// load_template i
do_action('ae_remove_theme_single_page_actions');
return true;
}
function handle_canvas_template($template_include){
if(is_single() && strpos($template_include,'canvas.php')){
$template_include = AE_PRO_PATH . 'includes/themes/canvas.php';
}
return $template_include;
}
public function apply_ae_wc_single_template(){
global $product;
$helper = new Helper();
$ae_product_template = $helper->get_ae_active_post_template($product->get_id(),'product');
if($ae_product_template != '' && is_numeric($ae_product_template)){
$template_content = $this->render_insert_elementor($ae_product_template);
$wc_sd = new \WC_Structured_Data();
$wc_sd->generate_product_data();
return $template_content;
}
}
public function apply_ae_wc_archive_template(){
$helper = new Helper();
$ae_product_template = $helper->get_woo_archive_template();
if($ae_product_template != '' && is_numeric($ae_product_template)){
$template_content = $this->render_insert_elementor($ae_product_template);
echo $template_content;
}
}
function apply_404_template(){
$helper = new Helper();
$tid = $helper->has_404_template();
if($tid){
echo $this->render_insert_elementor($tid);
}
}
function apply_search_template(){
$helper = new Helper();
$tid = $helper->has_search_template();
if($tid){
echo $this->render_insert_elementor($tid);
}
}
function term_based_post_template($template_id){
global $post;
if(is_singular()) { // to make sure this code runs only for single posts
//$post_template = get_metadata(get_post_type(), $post->ID,'ae_post_template', true);
$post_template = get_post_meta($post->ID, 'ae_post_template', true);
if($post_template == 'none'){
return false;
}
if(is_numeric($post_template)){
return $template_id;
}
$tax_ob = get_object_taxonomies($post);
if(!count($tax_ob)){
return $template_id;
}
$args = array(
'order' => 'ASC',
'hide_empty' => false,
'fields' => 'ids',
'meta_query' => array(
array(
'key' => 'ae_term_post_template',
'compare' => '!=',
'value' => ''
)
)
);
$tax_list = array();
foreach ($tax_ob as $t_ob) {
$terms = wp_get_post_terms($post->ID, $t_ob, $args);
if(count($terms)) {
foreach ($terms as $term) {
$term_post_template = get_term_meta( $term,'ae_term_post_template', true);
if(is_numeric($term_post_template)){
$tax_list[] = $term_post_template;
}
if($term_post_template == 'none') {
return false;
}
}
}
}
if(!count($tax_list)){
return $template_id;
}
rsort($tax_list);
$template_id_arr = apply_filters('ae_term_post_template', $tax_list);
$template_id = $template_id_arr[0];
}
return $template_id;
}
/**
* @return array
*
* Copied for Elementor Frontend as that was protected
*/
protected function get_init_settings() {
$is_preview_mode = Plugin::$instance->preview->is_preview_mode( Plugin::$instance->preview->get_post_id() );
$settings = [
'environmentMode' => [
'edit' => $is_preview_mode,
'wpPreview' => is_preview(),
],
'is_rtl' => is_rtl(),
'breakpoints' => Responsive::get_breakpoints(),
'version' => ELEMENTOR_VERSION,
'urls' => [
'assets' => ELEMENTOR_ASSETS_URL,
],
];
$settings['settings'] = SettingsManager::get_settings_frontend_config();
if ( is_singular() ) {
$post = get_post();
$settings['post'] = [
'id' => $post->ID,
'title' => $post->post_title,
'excerpt' => $post->post_excerpt,
];
} else {
$settings['post'] = [
'id' => 0,
'title' => wp_get_document_title(),
'excerpt' => '',
];
}
if ( $is_preview_mode ) {
$elements_manager = Plugin::$instance->elements_manager;
$elements_frontend_keys = [
'section' => $elements_manager->get_element_types( 'section' )->get_frontend_settings_keys(),
'column' => $elements_manager->get_element_types( 'column' )->get_frontend_settings_keys(),
];
$elements_frontend_keys += Plugin::$instance->widgets_manager->get_widgets_frontend_settings_keys();
$settings['elements'] = [
'data' => (object) [],
'editSettings' => (object) [],
'keys' => $elements_frontend_keys,
];
}
if ( is_user_logged_in() ) {
$user = wp_get_current_user();
if ( ! empty( $user->roles ) ) {
$settings['user'] = [
'roles' => $user->roles,
];
}
}
return $settings;
}
}
Frontend::instance();