assets = new Assets();
$this->actions();
$this->filters();
}
/**
* Builder Class Actions
*
* @since 1.3.0
*/
public function actions()
{
add_action('init', [$this, 'register']);
add_action('manage_' . self::BUILDER_POST_TYPE . '_posts_custom_column', array($this, 'custom_columns'), 10, 2);
add_action('restrict_manage_posts', [$this, 'add_filters']);
add_action('elementor/dynamic_tags/before_render', [$this, 'switch_to_preview_query']);
add_action('elementor/dynamic_tags/after_render', [$this, 'restore_current_query']);
add_action('wp', function () {
add_action('get_header', [$this, 'get_header']);
add_action('elementor/page_templates/canvas/before_content', [$this, 'get_canvas_header']);
add_action('get_footer', [$this, 'get_footer']);
add_action('elementor/page_templates/canvas/after_content', [$this, 'get_canvas_footer']);
});
add_action('template_include', [$this, 'output'], 9999);
add_action('elementor/page_templates/canvas/afeb_print_content', [$this, 'print_content'], 9999);
add_action('current_screen', [$this, 'current_screen']);
}
/**
* Builder Class Filters
*
* @since 1.3.0
*/
public function filters()
{
add_filter('manage_' . self::BUILDER_POST_TYPE . '_posts_columns', [$this, 'add_custom_columns']);
add_filter('parse_query', [$this, 'apply_filters']);
add_filter('option_elementor_cpt_support', [$this, 'set_option_support']);
add_filter('default_option_elementor_cpt_support', [$this, 'set_option_support']);
}
/**
* Register post type
*
* @since 1.3.0
*/
public function register()
{
$supports = apply_filters('afeb/builder/register_post_type/supports', ['title', 'editor', 'author', 'elementor', 'custom-fields']);
$args = [
'can_export' => true,
'description' => 'description',
'exclude_from_search' => true,
'has_archive' => false,
'hierarchical' => false,
'labels' => [
'name' => esc_html__('Template Builder', 'addons-for-elementor-builder'),
'singular_name' => esc_html__('Templates', 'addons-for-elementor-builder'),
'add_new' => esc_html__('Add Template', 'addons-for-elementor-builder'),
'add_new_item' => esc_html__('Add New Template', 'addons-for-elementor-builder'),
'new_item' => esc_html__('New Template', 'addons-for-elementor-builder'),
'edit_item' => esc_html__('Edit Template', 'addons-for-elementor-builder'),
'view_item' => esc_html__('View Template', 'addons-for-elementor-builder'),
'view_items' => esc_html__('View Templates', 'addons-for-elementor-builder'),
'all_items' => esc_html__('All Templates', 'addons-for-elementor-builder'),
'search_items' => esc_html__('Search Templates', 'addons-for-elementor-builder'),
'not_found' => esc_html__('No templates found!', 'addons-for-elementor-builder'),
'not_found_in_trash' => esc_html__('No templates found in Trash!', 'addons-for-elementor-builder'),
'archives' => esc_html__('Template Archives', 'addons-for-elementor-builder'),
'insert_into_item' => esc_html__('Insert into template', 'addons-for-elementor-builder'),
'uploaded_to_this_item' => esc_html__('Uploaded to this template', 'addons-for-elementor-builder'),
'filter_items_list' => esc_html__('Filter templates list', 'addons-for-elementor-builder')
],
'menu_icon' => '',
'public' => true,
'publicly_queryable' => true,
'query_var' => true,
'rewrite' => true,
'show_ui' => true,
'show_in_menu' => false,
'show_in_admin_bar' => false,
'show_in_nav_menus' => false,
'show_in_rest' => true,
'supports' => $supports,
'taxonomies' => []
];
register_post_type(self::BUILDER_POST_TYPE, apply_filters('afeb/builder/register_post_type/args', $args));
}
public function get_header($name, $canvas = false)
{
$matched_conditions = (new DisplayConditions())->find_matched_results(self::BUILDER_POST_TYPE);
// Purification of headers other pages are removed.
foreach ($matched_conditions as $key => $value) {
$document_type = get_post_meta(intval($value['id']), '_afeb_document_type', true);
if ($document_type !== 'header') {
unset($matched_conditions[$key]);
}
}
$sorted_matched_conditions_by_priority = $matched_conditions;
usort($sorted_matched_conditions_by_priority, function ($a, $b) {
return $a['priority'] - $b['priority'];
});
if (isset($sorted_matched_conditions_by_priority[0])) {
$matched_conditions = $sorted_matched_conditions_by_priority[0];
foreach ($sorted_matched_conditions_by_priority as $key => $value) {
if (($value['priority'] == $matched_conditions['priority']) &&
($value['id'] > $matched_conditions['id'])
) {
$matched_conditions = $value;
}
}
}
$headers = get_posts([
'include' => !empty($matched_conditions) ? [$matched_conditions['id']] : [-1],
'meta_key' => '_afeb_document_type',
'meta_value' => 'header',
'post_type' => self::BUILDER_POST_TYPE,
'suppress_filters' => false,
]);
$id = $headers[0]->ID ?? '';
$page_settings = get_post_meta($id, '_elementor_page_settings', true);
if (! is_array($page_settings)) $page_settings = [];
if ($canvas && empty($page_settings['include_in_canvas_page'])) {
return;
}
if (is_int($id) && !empty($page_settings['enable_display_conditons'])) {
require AFEB_ABSPATH . '/html/admin/menus/builder/editor/header/tpl.php';
echo Helper::get_page_as_element($id);
$templates = [];
$name = (string) $name;
if ($name != '') {
$templates[] = "header-{$name}.php";
}
$templates[] = 'header.php';
remove_all_actions('wp_head');
if (!$canvas) {
ob_start();
locate_template($templates, true);
ob_get_clean();
}
}
}
public function get_canvas_header()
{
$this->get_header('', true);
}
public function get_footer($name, $canvas = false)
{
$matched_conditions = (new DisplayConditions())->find_matched_results(self::BUILDER_POST_TYPE);
// Purification of footers other pages are removed.
foreach ($matched_conditions as $key => $value) {
$document_type = get_post_meta(intval($value['id']), '_afeb_document_type', true);
if ($document_type !== 'footer') {
unset($matched_conditions[$key]);
}
}
$sorted_matched_conditions_by_priority = $matched_conditions;
usort($sorted_matched_conditions_by_priority, function ($a, $b) {
return $a['priority'] - $b['priority'];
});
if (isset($sorted_matched_conditions_by_priority[0])) {
$matched_conditions = $sorted_matched_conditions_by_priority[0];
foreach ($sorted_matched_conditions_by_priority as $key => $value) {
if (($value['priority'] == $matched_conditions['priority']) &&
($value['id'] > $matched_conditions['id'])
) {
$matched_conditions = $value;
}
}
}
$footers = get_posts([
'include' => !empty($matched_conditions) ? [$matched_conditions['id']] : [-1],
'meta_key' => '_afeb_document_type',
'meta_value' => 'footer',
'post_type' => self::BUILDER_POST_TYPE,
'suppress_filters' => false,
]);
$id = $footers[0]->ID ?? '';
$page_settings = get_post_meta($id, '_elementor_page_settings', true);
if (!is_array($page_settings)) $page_settings = [];
if ($canvas && empty($page_settings['include_in_canvas_page'])) {
return;
}
if (is_int($id) && !empty($page_settings['enable_display_conditons'])) {
echo Helper::get_page_as_element($id);
require AFEB_ABSPATH . '/html/admin/menus/builder/editor/footer/tpl.php';
$templates = [];
$name = (string) $name;
if ($name != '') {
$templates[] = "footer-{$name}.php";
}
$templates[] = 'footer.php';
if (!$canvas) {
ob_start();
locate_template($templates, true);
ob_get_clean();
}
}
}
public function get_canvas_footer()
{
$this->get_footer('', true);
}
/**
* Builder HTML output
*
* @since 1.3.0
*
* @param string $template
*
* @return string
*/
public function output($template)
{
$is_singular = is_singular(self::BUILDER_POST_TYPE);
$elementor_template_type = Helper::get_elementor_template_type(get_the_ID());
$document_type = get_post_meta(get_the_ID(), '_afeb_document_type', true);
if (
$is_singular &&
$elementor_template_type == self::BUILDER_POST_TYPE
) {
$document = Plugin::instance()->documents->get_doc_or_auto_save(get_the_ID());
$document_settings = $document->get_settings_for_display();
$page_template = $document_settings['template_type'] ?? 'default';
$GLOBALS['afeb_document_type'] = $document_type;
switch ($document_type) {
case 'archive':
case 'single':
if (!trim($page_template) || ($page_template == 'default' || $page_template == 'elementor_header_footer')) {
$template = AFEB_ABSPATH . '/html/admin/menus/builder/editor/header-footer/tpl.php';
} else {
$template = AFEB_ABSPATH . '/html/admin/menus/builder/editor/canvas/tpl.php';
}
break;
case 'dynamic-loop-item':
$this->assets->dynamic_loop_item_style();
$template = AFEB_ABSPATH . '/html/admin/menus/builder/editor/dynamic-loop-item/tpl.php';
break;
case 'footer':
case 'header':
$template = AFEB_ABSPATH . '/html/admin/menus/builder/editor/canvas/tpl.php';
break;
}
} else {
$matched_conditions = (new DisplayConditions())->find_matched_results(self::BUILDER_POST_TYPE);
$matched_conditions = array_map(function ($item) {
return $item['id'];
}, $matched_conditions);
$pages = get_posts([
'orderby' => 'date',
'order' => 'DESC',
'include' => !empty($matched_conditions) ? $matched_conditions : [-1],
'meta_key' => '_afeb_document_type',
'meta_value' => ['archive', 'single'],
'post_type' => self::BUILDER_POST_TYPE,
'suppress_filters' => false,
]);
$id = $pages[0]->ID ?? '';
$page_settings = get_post_meta($id, '_elementor_page_settings', true);
if (is_int($id) && !empty($page_settings['enable_display_conditons'])) {
$this->post_id = $id;
$document_settings = get_post_meta($id, '_elementor_page_settings');
$page_template = $document_settings[0]['template_type'] ?? 'default';
if (!trim($page_template) || ($page_template == 'default' || $page_template == 'elementor_header_footer')) {
$template = AFEB_ABSPATH . '/html/admin/menus/builder/editor/header-footer/tpl.php';
} else {
$template = AFEB_ABSPATH . '/html/admin/menus/builder/editor/canvas/tpl.php';
}
}
}
return $template;
}
public function print_content()
{
$id = $this->post_id;
echo Helper::get_page_as_element($id);
}
/**
* Execute the relevant code on the current page
*
* @since 1.3.0
*
* @param object $screen
*/
public function current_screen($screen)
{
if (isset($screen->id)) {
if ($screen->id == 'edit-' . self::BUILDER_POST_TYPE) {
add_action('admin_footer', [$this, 'new_builder_dialog']);
add_action('admin_enqueue_scripts', function () {
$this->assets->normalize_style();
$this->assets->fontawesome_style();
$this->assets->jq_dialog_style();
wp_enqueue_script('jquery-effects-scale');
$this->assets->component_script();
});
add_filter('admin_body_class', [$this, 'change_body_class']);
add_filter('post_row_actions', [$this, 'post_row_actions'], 999, 2);
}
}
}
public function switch_to_preview_query()
{
if (get_post_type(get_the_ID()) == self::BUILDER_POST_TYPE) {
$document = Plugin::instance()->documents->get_doc_or_auto_save(get_the_ID());
Plugin::instance()->db->switch_to_query($document->get_document_query_args());
}
}
public function restore_current_query()
{
Plugin::instance()->db->restore_current_query();
}
/**
* Get template type label
*
* @since 1.3.0
*
* @param string $type
*
* @return string
*/
public function get_template_type_label($type = '')
{
switch ($type) {
case 'archive':
$type = esc_html__('Archive', 'addons-for-elementor-builder');
break;
case 'dynamic-loop-item':
$type = esc_html__('Dynamic Loop Item', 'addons-for-elementor-builder');
break;
case 'footer':
$type = esc_html__('Footer', 'addons-for-elementor-builder');
break;
case 'header':
$type = esc_html__('Header', 'addons-for-elementor-builder');
break;
case 'single':
$type = esc_html__('Single', 'addons-for-elementor-builder');
break;
default:
$type = esc_html__('Unknown', 'addons-for-elementor-builder');
break;
}
return $type;
}
/**
* Add custom columns
*
* @since 1.3.0
*
* @param array $columns
*
* @return array
*/
public function add_custom_columns($columns)
{
$title = $columns['title'];
$author = $columns['author'];
$date = $columns['date'];
unset($columns['title']);
unset($columns['author']);
unset($columns['date']);
$columns['title'] = $title;
$columns = array_merge($columns, [
'type' => esc_html__('Type', 'addons-for-elementor-builder'),
]);
$columns['author'] = $author;
$columns['date'] = $date;
return $columns;
}
/**
* Add custom columns
*
* @since 1.3.0
*
* @param array $columns
* @param int $post_id
*/
public function custom_columns($columns, $post_id)
{
if ($columns == 'type') {
$type = get_post_meta($post_id, '_afeb_document_type', true);
printf('%s', $this->get_template_type_label($type));
}
}
/**
* Add filter options in manage builder page
*
* @since 1.3.0
*
* @param string $post_type
*/
public function add_filters($post_type)
{
if ($post_type !== self::BUILDER_POST_TYPE) return;
$post_status = !empty($_GET['post_status']) ? esc_sql(sanitize_text_field(wp_unslash($_GET['post_status']))) : '';
$post_status_sql = (!trim($post_status) || $post_status == 'all') ?
"`#__posts` . `post_status` != 'trash'" :
"`#__posts` . `post_status` = '{$post_status}'";
$query = "SELECT `#__posts`.`ID`,`#__postmeta`.`meta_value` FROM `#__posts` " .
"LEFT JOIN `#__postmeta` ON `#__posts`.`ID` = `#__postmeta`.`post_id` And `#__postmeta`.`meta_key` = '_afeb_document_type' " .
"AND `#__postmeta`.`meta_value` != '' WHERE {$post_status_sql} AND `#__posts`.`post_type` = 'afeb-builder' " .
"GROUP BY `#__postmeta`.`meta_value`";
$db_options = (new Db())->slct($query, 'ASSOCLIST');
$options = [];
foreach ($db_options as $db_option)
$options[$db_option['meta_value']] = $this->get_template_type_label($db_option['meta_value']);
if (count($options) > 1) {
$options = array_merge(['' => esc_html__('All types', 'addons-for-elementor-builder')], $options);
$selected = !empty($_GET['afeb_template_type_filter']) ?
sanitize_text_field(wp_unslash($_GET['afeb_template_type_filter'])) : '';
Form::select_e([
'id' => 'afeb_template_type_filter',
'name' => 'afeb_template_type_filter'
], ['values' => $options, 'selected' => $selected]);
}
}
public function apply_filters($query)
{
global $pagenow, $typenow;
if ($typenow == self::BUILDER_POST_TYPE && $pagenow == 'edit.php') {
if (!empty($_GET['afeb_template_type_filter'])) {
$query->query_vars['meta_query'] = [
[
'key' => '_afeb_document_type',
'value' => sanitize_text_field(wp_unslash($_GET['afeb_template_type_filter'])),
'compare' => '=',
],
];
}
}
}
/**
* Add elementor support
*
* @since 1.3.0
*
* @param string $value
*
* @return array
*/
public function set_option_support($value)
{
return !empty($value) ? array_merge($value, [self::BUILDER_POST_TYPE]) : [];
}
/**
* Change current page body class
*
* @since 1.3.0
*
* @param string $classes
*
* @return string
*/
public function change_body_class($classes)
{
return $classes . ' afeb-body afeb-builder-posts-body';
}
/**
* Filters the array of row action links
*
* @since 1.3.0
*
* @param string[] $actions
* @param WP_Post $post
*
* @return array
*/
public function post_row_actions($actions, $post)
{
$output = [];
if (!empty($actions['inline hide-if-no-js']))
$output['inline hide-if-no-js'] = $actions['inline hide-if-no-js'];
if (!empty($actions['trash']))
$output['trash'] = $actions['trash'];
if (did_action('elementor/loaded')) {
$id = intval($post->ID);
$link = esc_url(admin_url('post.php') . "?post={$id}&action=elementor");
$output['edit'] = sprintf('%s', $link, esc_html__('Edit with Elementor', 'addons-for-elementor-builder'));
}
return $output;
}
/**
* Add a builder creation dialog to the page
*
* @since 1.3.0
*/
public function new_builder_dialog()
{
$this->get_template_part($this->get_path() . '/html/admin/menus/builder/dialogs/new-template/');
}
}