PluginProbe ʕ •ᴥ•ʔ
Essential Classy Addons for Elementor – 150+ Widgets, Templates & Performance Tools / 3.0.52
Essential Classy Addons for Elementor – 150+ Widgets, Templates & Performance Tools v3.0.52
3.0.59 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 3.0 3.0.1 3.0.10 3.0.11 3.0.12 3.0.13 3.0.14 3.0.15 3.0.16 3.0.18 3.0.2 3.0.20 3.0.21 3.0.22 3.0.23 3.0.24 3.0.25 3.0.26 3.0.27 3.0.28 3.0.29 3.0.3 3.0.30 3.0.31 3.0.32 3.0.33 3.0.34 3.0.35 3.0.36 3.0.37 3.0.38 3.0.39 3.0.4 3.0.40 3.0.41 3.0.42 3.0.43 3.0.44 3.0.45 3.0.46 3.0.47 3.0.48 3.0.49 3.0.5 3.0.50 3.0.51 3.0.52 3.0.53 3.0.54 3.0.55 3.0.56 3.0.57 3.0.58 3.0.6 3.0.7 3.0.8 3.0.9
essential-classy-addons-for-elementor / classes / theme-builder.php
essential-classy-addons-for-elementor / classes Last commit date
builders 5 months ago documents 5 months ago builder-content.php 5 months ago class-helper.php 5 months ago class-loader.php 5 months ago class-panel-options.php 5 months ago conditions-file.php 5 months ago conditions-rules.php 5 months ago elementor-document.php 5 months ago theme-builder.php 5 months ago widgets-passing-lists.php 5 months ago
theme-builder.php
494 lines
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 exit; // Exit if accessed directly.
4 }
5
6 class Ecafe_Theme_Builder {
7
8 public static $instance = null;
9 protected $singular_template;
10
11 const Ecafe_Type = ECAFE_POST;
12 const Ecafe_Shortcode = 'ecafe-builder';
13
14 public $taxonomies_list = [];
15 public static function instance() {
16 if ( ! isset( self::$instance ) ) {
17 self::$instance = new self;
18 }
19 return self::$instance;
20 }
21
22 /**
23 * Constructor
24 */
25 public function __construct() {
26 add_action('wp', array($this, 'ec_load_templates'));
27 add_action('init', [$this, 'ec_template_builder_post_type'], 0);
28 add_action('admin_menu', [$this, 'ec_change_menu_post_type'], 9);
29
30 add_action('manage_' . self::Ecafe_Type . '_posts_columns', [__CLASS__, 'ec_admin_columns_headers']);
31 add_action('manage_' . self::Ecafe_Type . '_posts_custom_column', [$this, 'ec_admin_columns_text'], 10, 2);
32
33 add_action('wp_ajax_ecafe_get_prev_list', [$this, 'ec_get_prev_list_callback'] );
34 add_action('add_meta_boxes', [$this, 'ec_builder_condition_meta'] );
35 add_action('save_post', [$this, 'ec_builder_condition_save_meta'] );
36
37 add_filter('template_include', [$this, 'ecafe_single_template_overright'], 1000);
38 add_action('ecafe_content_render', [$this, 'ec_singular_archives_content_render'], 1000);
39
40 if ( is_admin() ) {
41 add_action( 'manage_' . self::Ecafe_Type . '_posts_columns', [ $this, 'ec_admin_columns_shortcode' ],15 );
42 add_action( 'manage_' . self::Ecafe_Type . '_posts_custom_column', [ $this, 'ec_admin_columns_shortcode_content' ], 15, 2 );
43 }
44
45 add_shortcode( self::Ecafe_Shortcode, [ $this, 'ec_create_shortcode' ] );
46 }
47
48 public function ec_template_builder_post_type(){
49 $labels = array(
50 'name' => _x('Theme Builder', 'Post Type General Name', 'essential-classy-addons-for-elementor'),
51 'singular_name' => _x('Theme Builder', 'Post Type Singular Name', 'essential-classy-addons-for-elementor'),
52 'menu_name' => _x('Theme Builder', 'Admin Menu text', 'essential-classy-addons-for-elementor'),
53 'name_admin_bar' => _x('Theme Builder', 'Add New on Toolbar', 'essential-classy-addons-for-elementor'),
54 'archives' => __('Theme Builder Archives', 'essential-classy-addons-for-elementor'),
55 'attributes' => __('Theme Builder Attributes', 'essential-classy-addons-for-elementor'),
56 'parent_item_colon' => __('Parent Theme Builder:', 'essential-classy-addons-for-elementor'),
57 'all_items' => __('All Theme Builder', 'essential-classy-addons-for-elementor'),
58 'add_new_item' => __('Add New Theme Builder', 'essential-classy-addons-for-elementor'),
59 'add_new' => __('Add New', 'essential-classy-addons-for-elementor'),
60 'new_item' => __('New Theme Builder', 'essential-classy-addons-for-elementor'),
61 'edit_item' => __('Edit Theme Builder', 'essential-classy-addons-for-elementor'),
62 'update_item' => __('Update Theme Builder', 'essential-classy-addons-for-elementor'),
63 'view_item' => __('View Theme Builder', 'essential-classy-addons-for-elementor'),
64 'view_items' => __('View Theme Builder', 'essential-classy-addons-for-elementor'),
65 'search_items' => __('Search Theme Builder', 'essential-classy-addons-for-elementor'),
66 'not_found' => __('Not found', 'essential-classy-addons-for-elementor'),
67 'not_found_in_trash' => __('Not found in Trash', 'essential-classy-addons-for-elementor'),
68 'featured_image' => __('Featured Image', 'essential-classy-addons-for-elementor'),
69 'set_featured_image' => __('Set featured image', 'essential-classy-addons-for-elementor'),
70 'remove_featured_image' => __('Remove featured image', 'essential-classy-addons-for-elementor'),
71 'use_featured_image' => __('Use as featured image', 'essential-classy-addons-for-elementor'),
72 'insert_into_item' => __('Insert into Theme Builder', 'essential-classy-addons-for-elementor'),
73 'uploaded_to_this_item' => __('Uploaded to this Theme Builder', 'essential-classy-addons-for-elementor'),
74 'items_list' => __('Theme Builder list', 'essential-classy-addons-for-elementor'),
75 'items_list_navigation' => __('Theme Builder list navigation', 'essential-classy-addons-for-elementor'),
76 'filter_items_list' => __('Filter Theme Builder list', 'essential-classy-addons-for-elementor'),
77 );
78 $args = array(
79 'label' => __('Theme Builder', 'essential-classy-addons-for-elementor'),
80 'description' => __('Description', 'essential-classy-addons-for-elementor'),
81 'labels' => $labels,
82 'supports' => array('title', 'editor', 'revisions','elementor'),
83 'taxonomies' => array(),
84 'public' => true,
85 'show_ui' => true,
86 'show_in_menu' => false,
87 'show_in_admin_bar' => false,
88 'show_in_nav_menus' => false,
89 'can_export' => true,
90 'has_archive' => false,
91 'hierarchical' => false,
92 'exclude_from_search' => true,
93 'capability_type' => 'post',
94 'rewrite' => false,
95 'query_var' => false,
96 'map_meta_cap' => true,
97 'show_in_rest' => true,
98 );
99 register_post_type( self::Ecafe_Type, $args );
100
101 }
102
103 public function ec_change_menu_post_type() {
104 add_submenu_page(
105 'ecafe_welcome',
106 __( 'Theme Builder', 'essential-classy-addons-for-elementor' ),
107 __( 'Theme Builder', 'essential-classy-addons-for-elementor' ),
108 'manage_options',
109 'edit.php?post_type='.sanitize_text_field(self::Ecafe_Type),
110 false
111 );
112 }
113
114 public static function ec_admin_columns_headers($posts_columns) {
115 $offset = 2;
116
117 $posts_columns = array_slice($posts_columns, 0, $offset, true) + [
118 'type' => __('Type', 'essential-classy-addons-for-elementor'),
119 ] + array_slice($posts_columns, $offset, null, true);
120
121 return $posts_columns;
122 }
123
124 public function ec_admin_columns_text( $column_name, $post_id ) {
125
126 if ('type' === $column_name) {
127 $type = get_post_meta($post_id, 'ecafe_build_template_type', true);
128 if(!empty($type)){
129 echo esc_html(ucfirst($type));
130 }
131 }
132 }
133
134 public function ec_builder_condition_meta(){
135 add_meta_box(
136 'ecafe-template-settings',
137 __('Template Settings','essential-classy-addons-for-elementor'),
138 array($this, 'ec_builder_condition_fields'),
139 self::Ecafe_Type,
140 'normal',
141 'default'
142 );
143 }
144
145 public function ec_get_public_post_types() {
146 $post_type_args = [
147 'show_in_nav_menus' => true,
148 ];
149
150 $post_type_args = wp_parse_args($post_type_args);
151
152 $ecpost_types = get_post_types($post_type_args, 'objects');
153
154 $post_types = [];
155
156 foreach ($ecpost_types as $post_type => $object) {
157 if($post_type!='e-landing-page'){
158 $post_types[$post_type] = $object->label;
159 }
160 }
161
162 return $post_types;
163 }
164
165 public function ec_get_posts_list( $post_type = 'post'){
166 $arg = [
167 'posts_per_page' => -1,
168 'post_status' => 'publish',
169 'post_type' => $post_type
170 ];
171
172 $posts = get_posts($arg);
173 $post_array = array();
174 if(!empty($posts)){
175 foreach ($posts as $post) {
176 $post_array[$post->ID] = $post->post_title;
177 }
178 }
179
180 return $post_array;
181 }
182
183 function ec_get_prev_list_callback() {
184 if (!isset($_POST['ecafe_nonce'])) {
185 return;
186 }
187 $ecafe_nonce = isset( $_POST['ecafe_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['ecafe_nonce'] ) ) : '';
188
189 // Verify nonce
190 if (!wp_verify_nonce($ecafe_nonce, 'ecafe-temp-nonce')) {
191 return;
192 }
193
194 // Check user capability
195 if (!current_user_can('manage_options')) {
196 return;
197 }
198
199 // Check permissions
200 if (!current_user_can('edit_posts')) {
201 return;
202 }
203
204 $data = [];
205 $template_type = (isset($_POST['template_type']) && !empty($_POST['template_type'])) ? sanitize_text_field(wp_unslash($_POST['template_type'])) : 'singular';
206
207 if($template_type == 'singular' ){
208 $post_type = (isset($_POST['template_data']) && !empty($_POST['template_data'])) ? sanitize_text_field(wp_unslash($_POST['template_data'])) : 'post';
209 $data = $this->ec_get_posts_list($post_type);
210 }else if($template_type == 'archives'){
211 $taxonomy = (isset($_POST['template_data']) && !empty($_POST['template_data'])) ? sanitize_text_field(wp_unslash($_POST['template_data'])) : 'category';
212 $taxonomy = explode(',', $taxonomy);
213 $data = $this->ec_get_taxonomy_list($taxonomy);
214 }
215
216 $output = '';
217 if(!empty($data)){
218 foreach($data as $key => $val){
219 $output .='<option value="'.esc_attr($key).'">'.esc_html($val).'</option>';
220 }
221 }
222 wp_send_json_success($output);
223 }
224
225 public function ec_get_public_taxonomy_list(){
226 $post_types = $this->ec_get_public_post_types();
227 $taxonomy_list = [];
228 foreach ( $post_types as $post_type => $post_label ) {
229
230 if ( ! get_post_type_archive_link( $post_type ) ) {
231 continue;
232 }
233
234 $taxonomies = get_object_taxonomies( $post_type, 'objects' );
235 $taxonomies_list = wp_filter_object_list( $taxonomies, [
236 'public' => true,
237 'show_in_nav_menus' => true,
238 ] );
239 foreach ( $taxonomies_list as $slug => $object ) {
240 $taxonomy_list[$object->name] = $object->label;
241 }
242 }
243
244 return $taxonomy_list;
245 }
246
247 public function ec_get_taxonomy_list($taxonomy){
248 $terms = get_terms([
249 'taxonomy' => $taxonomy,
250 'hide_empty' => false,
251 ]);
252
253 $term_list = [];
254 if( !empty($terms)){
255 foreach ($terms as $term) {
256 $term_list[$term->term_id] = $term->name;
257 }
258 }
259 return $term_list;
260 }
261
262 public function ec_builder_condition_fields($post) {
263 // Retrieve existing value from the database
264 $template_type = get_post_meta($post->ID, 'ecafe_build_template_type', true);
265 $template_display = get_post_meta($post->ID, 'ecafe_build_template_display', true);
266 $display_singular = get_post_meta($post->ID, 'ecafe_build_display_singular', true);
267 $display_archives = get_post_meta($post->ID, 'ecafe_build_display_archives', true);
268
269 $display_prev = get_post_meta($post->ID, 'ecafe_build_display_prev', true);
270 $options = array(
271 '' => __('None', 'essential-classy-addons-for-elementor'),
272 'header' => __('Header', 'essential-classy-addons-for-elementor'),
273 'footer' => __('Footer', 'essential-classy-addons-for-elementor'),
274 'singular' => __('Singular', 'essential-classy-addons-for-elementor'),
275 'archives' => __('Archives', 'essential-classy-addons-for-elementor'),
276 'page404' => __('404 Page', 'essential-classy-addons-for-elementor'),
277 );
278 $get_post_types = $this->ec_get_public_post_types();
279 $get_taxonomies = $this->ec_get_public_taxonomy_list();
280
281 $get_prev = [];
282 if( $template_type == 'singular'){
283 $get_prev = $this->ec_get_posts_list($display_singular);
284 }else if( $template_type == 'archives'){
285 $get_prev = $this->ec_get_taxonomy_list($display_archives);
286 }
287
288 wp_nonce_field('ec_template_builder_nonce', 'ec_template_builder_nonce');
289 ?>
290 <div class="ecafe-build-field-wrap">
291 <div class="ecafe-field-col">
292 <label for="ecafe-build-temp-type"><?php echo esc_html__('Template Type :', 'essential-classy-addons-for-elementor'); ?></label>
293 <select id="ecafe-build-temp-type" name="ecafe_build_template_type">
294 <?php foreach ($options as $value => $label) : ?>
295 <option value="<?php echo esc_attr($value); ?>" <?php selected($template_type, $value); ?>><?php echo esc_html($label); ?></option>
296 <?php endforeach; ?>
297 </select>
298 </div>
299 <div class="ecafe-field-col">
300 <label for="ecafe-build-temp-display"><?php echo esc_html__('Display :', 'essential-classy-addons-for-elementor'); ?></label>
301 <select id="ecafe-build-temp-display" name="ecafe_build_template_display">
302 <option value="entire" <?php selected($template_display, 'entire'); ?>><?php esc_html_e('Entire Website', 'essential-classy-addons-for-elementor'); ?></option>
303 </select>
304 </div>
305
306 <div class="ecafe-field-col">
307 <label for="ecafe-build-display-singular"><?php echo esc_html__('Display :', 'essential-classy-addons-for-elementor'); ?></label>
308 <select id="ecafe-build-display-singular" name="ecafe_build_display_singular">
309 <?php foreach ($get_post_types as $post_type => $label) : ?>
310 <option value="<?php echo esc_attr($post_type); ?>" <?php selected($display_singular, $post_type); ?>><?php echo esc_html__('All ', 'essential-classy-addons-for-elementor').esc_html($label); ?></option>
311 <?php endforeach; ?>
312 </select>
313 </div>
314
315 <div class="ecafe-field-col">
316 <label for="ecafe-build-display-archives"><?php echo esc_html__('Display :', 'essential-classy-addons-for-elementor'); ?></label>
317 <select id="ecafe-build-display-archives" name="ecafe_build_display_archives[]" multiple>
318 <?php foreach ($get_taxonomies as $key => $label) :
319 $selected = in_array($key, (array) $display_archives) ? 'selected' : '';
320 ?>
321 <option value="<?php echo esc_attr($key); ?>" <?php echo esc_attr($selected); ?>><?php echo esc_html__('All ', 'essential-classy-addons-for-elementor').esc_html($label); ?></option>
322 <?php endforeach; ?>
323 </select>
324 </div>
325
326 <div class="ecafe-field-col">
327 <label for="ecafe-build-display-prev"><?php echo esc_html__('Preview :', 'essential-classy-addons-for-elementor'); ?></label>
328 <select id="ecafe-build-display-prev" name="ecafe_build_display_prev">
329 <?php foreach ($get_prev as $post_type => $label) : ?>
330 <option value="<?php echo esc_attr($post_type); ?>" <?php selected($display_prev, $post_type); ?>><?php echo esc_html($label); ?></option>
331 <?php endforeach; ?>
332 </select>
333 </div>
334 </div>
335 <?php
336 }
337
338 public function ec_builder_condition_save_meta($post_id) {
339 // Check if nonce is set
340 if (!isset($_POST['ec_template_builder_nonce'])) {
341 return;
342 }
343 $ecafe_nonce = isset( $_POST['ec_template_builder_nonce'] ) ? sanitize_text_field( wp_unslash($_POST['ec_template_builder_nonce']) ) : '';
344
345 // Verify nonce
346 if (!wp_verify_nonce($ecafe_nonce, 'ec_template_builder_nonce')) {
347 return;
348 }
349 // Check if autosave
350 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
351 return;
352 }
353
354 // Check permissions
355 if (!current_user_can('edit_post', $post_id)) {
356 return;
357 }
358 // Save Theme Builder field data
359 if(isset($_POST['ecafe_build_template_type'])){
360 update_post_meta($post_id, 'ecafe_build_template_type', sanitize_text_field(wp_unslash($_POST['ecafe_build_template_type'])) );
361 }
362 if(isset($_POST['ecafe_build_template_display'])){
363 update_post_meta($post_id, 'ecafe_build_template_display', sanitize_text_field(wp_unslash($_POST['ecafe_build_template_display'])) );
364 }
365 if(isset($_POST['ecafe_build_display_singular'])){
366 update_post_meta($post_id, 'ecafe_build_display_singular', sanitize_text_field(wp_unslash($_POST['ecafe_build_display_singular'])) );
367 }
368 if(isset($_POST['ecafe_build_display_archives']) && !empty($_POST['ecafe_build_display_archives'])){
369 $display_archives = array_map( 'sanitize_text_field', (array) wp_unslash( $_POST['ecafe_build_display_archives'] ) );
370 update_post_meta($post_id, 'ecafe_build_display_archives', $display_archives );
371 }
372 if(isset($_POST['ecafe_build_display_prev']) && !empty($_POST['ecafe_build_display_prev'])){
373 update_post_meta($post_id, 'ecafe_build_display_prev', sanitize_text_field(wp_unslash($_POST['ecafe_build_display_prev'])) );
374 }
375 }
376
377 /* Overright Header/Footer Template */
378 public function ec_load_templates(){
379 $curr_temp = basename(get_page_template_slug());
380
381 if ($curr_temp == 'elementor_canvas') {
382 return;
383 }
384
385 new Ecafe_Theme_Template();
386 }
387
388 /* get Conditional Content*/
389 public function ec_render_builder_data_location( $location ){
390 $temp = Ecafe_Condition_Rules::get_instance()->ec_get_location_type($location);
391 if($location == 'header' || $location = 'footer'){
392 $load_template = $temp;
393 }else{
394 $_key = key($temp);
395 $load_template = $temp[$_key];
396 }
397 return Ec_Template_Builder_Content::get_instance()->ec_get_render_content($load_template);
398 }
399
400 public function ecafe_single_template_overright( $template ){
401 if (is_singular(array_keys($this->ec_get_public_post_types())) || is_404()) {
402
403 $location = 'singular';
404 if(is_404()){
405 $location = 'page404';
406 }
407
408 } elseif (function_exists('is_shop') && \is_shop()) {
409 $location = 'archives';
410 } elseif (is_archive() || is_tax() || is_home() || is_search()) {
411 $location = 'archives';
412 }
413
414 if ( !empty( $location ) ) {
415 $location_documents = Ecafe_Condition_Rules::get_instance()->ec_get_location_type($location);
416
417 if (empty($location_documents)) {
418 return $template;
419 }
420
421
422 if ('singular' === $location || 'archives' === $location || 'page404' === $location ) {
423
424 $first_key = key($location_documents);
425 $theme_document = $location_documents[$first_key];
426
427 $templateType = get_post_meta($theme_document, '_wp_page_template', true);
428
429 $this->singular_template = $theme_document;
430
431 if ($theme_document) {
432 switch ($templateType) {
433 case "elementor_canvas":
434 $template = ECAFE_CLASSES_URL . 'builders/singular-canvas.php';
435 break;
436 case "elementor_header_footer":
437 $template = ECAFE_CLASSES_URL . 'builders/singular-fullwidth.php';
438 break;
439 default:
440 $template = ECAFE_CLASSES_URL . 'builders/singular-fullwidth.php';
441 break;
442 }
443 }
444 }
445 }
446
447 return $template;
448 }
449
450 public function ec_singular_archives_content_render($post) {
451 $templates = $this->singular_template;
452 if (!empty($templates)) {
453 $allowed_tags = wp_kses_allowed_html( 'post' );
454 $allowed_tags['script'] = array(
455 'type' => true,
456 'src' => true,
457 'defer' => true,
458 );
459 $allowed_tags['style'] = array(
460 'type' => true,
461 'media' => true,
462 );
463 echo Ec_Template_Builder_Content::get_instance()->ec_get_render_content($templates);
464 } else {
465 the_content();
466 }
467 }
468
469 public function ec_admin_columns_shortcode( $columns ) {
470 $columns['ecafe-shortcode'] = __( 'Shortcode', 'essential-classy-addons-for-elementor' );
471
472 return $columns;
473 }
474
475 public function ec_admin_columns_shortcode_content( $column, $post_id ) {
476 if ( 'ecafe-shortcode' === $column ) {
477 //translator %s = shortcode, %d = post_id
478 $shortcode = esc_attr( sprintf( '[%s id="%d"]', self::Ecafe_Shortcode, $post_id ) );
479 printf( '<input type="text" class="ecafe-shortcode-input" onfocus="this.select()" value="%s" readonly style="font-size: 12px;"/>', esc_attr($shortcode) );
480 }
481 }
482
483 public function ec_create_shortcode( $option = [] ) {
484 if ( empty( $option['id'] ) ) {
485 return '';
486 }
487
488 ob_start();
489 echo Ec_Template_Builder_Content::get_instance()->ec_get_render_content($option['id']);
490 return ob_get_clean();
491 }
492 }
493
494 Ecafe_Theme_Builder::instance();