PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 3.4.0
ShopBuilder – WooCommerce Builder For Elementor v3.4.0
3.4.2 3.4.1 3.4.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 All 63 releases
shopbuilder / app / Controllers / Builder / BuilderCpt.php

BuilderCpt.php in ShopBuilder – WooCommerce Builder For Elementor 3.4.0, at app/Controllers/Builder/BuilderCpt.php

661 lines 22.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Builder Custom post type
4 *
5 * @package RadiusTheme\SB
6 */
7
8 namespace RadiusTheme\SB\Controllers\Builder;
9
10 defined( 'ABSPATH' ) || exit();
11
12 use RadiusTheme\SB\Models\TemplateSettings;
13 use WP_Query;
14 use RadiusTheme\SB\Helpers\Fns;
15 use RadiusTheme\SB\Helpers\BuilderFns;
16 use RadiusTheme\SB\Traits\SingletonTrait;
17
18 /**
19 * Builder Custom post type
20 */
21 class BuilderCpt {
22 /**
23 * Singleton
24 */
25 use SingletonTrait;
26
27 /**
28 * Final constructor.
29 */
30 private function __construct() {
31 add_action( 'init', [ $this, 'template_builder_post_type' ] );
32 add_filter( 'post_row_actions', [ $this, 'filter_post_row_actions' ], 11, 1 );
33 // Admin column.
34 add_filter( 'manage_edit-' . BuilderFns::$post_type_tb . '_columns', [ $this, 'add_new_columns' ] );
35 add_action( 'manage_' . BuilderFns::$post_type_tb . '_posts_custom_column', [ $this, 'custom_columns' ], 10, 2 );
36 add_filter( 'manage_edit-' . BuilderFns::$post_type_tb . '_sortable_columns', [ $this, 'register_sortable_columns' ] );
37 add_action( 'pre_get_posts', [ $this, 'sortable_columns_query' ] );
38 // Priority 99999 ensures ShopBuilder wins over Elementor Pro Theme Builder,
39 // which also filters `template_include` at 99.
40 add_filter( 'template_include', [ $this, 'builder_template' ], 99999 );
41 add_filter( 'template_redirect', [ $this, 'restrict_preview_access' ], 99 );
42
43 add_filter( 'parse_query', [ $this, 'query_filter' ] );
44 // Add filter for search.
45 add_action( 'restrict_manage_posts', [ $this, 'add_filter' ] );
46 // Post Content Remove For Elementor Builder.
47 add_action( 'save_post_' . BuilderFns::$post_type_tb, [ $this, 'on_save_post' ], 10, 2 );
48 }
49
50 /**
51 * Hook into post save to clear post content for specific post type and editor.
52 *
53 * This method checks if the post is being updated (not newly created),
54 * and if the post type matches the target type defined in BuilderFns::$post_type_tb.
55 * If the post is edited with Elementor, it clears the post_content directly
56 * from the database and clears the post cache.
57 *
58 * @param int $post_ID ID of the post being saved.
59 * @param WP_Post $post Post object.
60 *
61 * @return void
62 */
63 public function on_save_post( $post_ID, $post ) {
64 // Only proceed on update and specific post type.
65 if ( BuilderFns::$post_type_tb !== $post->post_type ) {
66 return;
67 }
68 if ( 'elementor' !== Fns::page_edit_with( $post_ID ) ) {
69 return;
70 }
71 global $wpdb;
72 // Directly update the post_content to empty.
73 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
74 $wpdb->update(
75 $wpdb->posts,
76 [ 'post_content' => '' ],
77 [ 'ID' => $post_ID ]
78 );
79 // Clear cache so changes reflect properly.
80 clean_post_cache( $post_ID );
81 }
82
83 /**
84 * Public function add_filter.
85 * Added search filter for type of template
86 *
87 * @since 1.0.0
88 */
89 public function add_filter() {
90
91 global $typenow;
92
93 if ( BuilderFns::$post_type_tb != $typenow ) {
94 return;
95 }
96 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
97 $selected = isset( $_GET['type'] ) ? sanitize_key( $_GET['type'] ) : '';
98 $builder_page_types = BuilderFns::builder_page_types();
99 ?>
100 <select name="template_type" id="type">
101 <option value="all" <?php selected( 'all', $selected ); ?>><?php esc_html_e( 'Template Type ', 'shopbuilder' ); ?></option>
102 <?php foreach ( $builder_page_types as $key => $value ) { ?>
103 <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $key, $selected ); ?>><?php echo esc_html( $value ); ?></option>
104 <?php } ?>
105 </select>
106 <?php
107 }
108
109 /**
110 * Post type function
111 *
112 * @return void
113 */
114 public function template_builder_post_type() {
115 /**
116 * Template Builder Post type
117 */
118 $tb_labels = [
119 'name' => esc_html_x( 'WooCommerce Page Builder', 'Post Type General Name', 'shopbuilder' ),
120 'singular_name' => esc_html_x( 'Templates Builder', 'Post Type Singular Name', 'shopbuilder' ),
121 'menu_name' => esc_html__( 'Templates Builder', 'shopbuilder' ),
122 'name_admin_bar' => esc_html__( 'Templates Builder', 'shopbuilder' ),
123 'archives' => esc_html__( 'WC Page Archives', 'shopbuilder' ),
124 'attributes' => esc_html__( 'Page Attributes', 'shopbuilder' ),
125 'parent_item_colon' => esc_html__( 'Parent Item:', 'shopbuilder' ),
126 'all_items' => esc_html__( 'Templates Builder', 'shopbuilder' ),
127 'add_new_item' => esc_html__( 'Add New Page', 'shopbuilder' ),
128 'add_new' => esc_html__( 'Add New', 'shopbuilder' ),
129 'new_item' => esc_html__( 'New Page', 'shopbuilder' ),
130 'edit_item' => esc_html__( 'Edit Page', 'shopbuilder' ),
131 'update_item' => esc_html__( 'Update Page', 'shopbuilder' ),
132 'view_item' => esc_html__( 'View Page', 'shopbuilder' ),
133 'view_items' => esc_html__( 'View Pages', 'shopbuilder' ),
134 'search_items' => esc_html__( 'Search Pages', 'shopbuilder' ),
135 'not_found' => esc_html__( 'Not found', 'shopbuilder' ),
136 'not_found_in_trash' => esc_html__( 'Not found in Trash', 'shopbuilder' ),
137 'featured_image' => esc_html__( 'Featured Image', 'shopbuilder' ),
138 'set_featured_image' => esc_html__( 'Set featured image', 'shopbuilder' ),
139 'remove_featured_image' => esc_html__( 'Remove featured image', 'shopbuilder' ),
140 'use_featured_image' => esc_html__( 'Use as featured image', 'shopbuilder' ),
141 'insert_into_item' => esc_html__( 'Insert into page', 'shopbuilder' ),
142 'uploaded_to_this_item' => esc_html__( 'Uploaded to this page', 'shopbuilder' ),
143 'items_list' => esc_html__( 'Pages list', 'shopbuilder' ),
144 'items_list_navigation' => esc_html__( 'Pages list navigation', 'shopbuilder' ),
145 'filter_items_list' => esc_html__( 'Filter from list', 'shopbuilder' ),
146 ];
147
148 $tb_args = [
149 'label' => esc_html__( 'Templates Builder', 'shopbuilder' ),
150 'description' => esc_html__( 'Shopbuilder Template', 'shopbuilder' ),
151 'labels' => $tb_labels,
152 'supports' => [ 'title', 'editor', 'elementor', 'author', 'permalink', 'comments' ],
153 'hierarchical' => false,
154 'public' => true,
155 'show_ui' => true,
156 'show_in_menu' => 'rtsb',
157 'show_in_admin_bar' => false,
158 'show_in_nav_menus' => true,
159 'can_export' => true,
160 'has_archive' => false,
161 'rewrite' => [
162 'slug' => 'rtsb-template',
163 'pages' => false,
164 'with_front' => true,
165 'feeds' => false,
166 ],
167 'query_var' => true,
168 'publicly_queryable' => true,
169 // 'capability_type' => 'product', Will Remove this line in the future.
170 'show_in_rest' => true,
171 'rest_base' => BuilderFns::$post_type_tb,
172 ];
173
174 $tb_args = apply_filters( 'rtsb/builder/template_args', $tb_args );
175
176 register_post_type( BuilderFns::$post_type_tb, $tb_args );
177
178 // Flash rewrite rules.
179 $this->flush_rewrite_rules();
180 }
181
182 /**
183 * Flush rewrite
184 *
185 * @return void
186 */
187 public function flush_rewrite_rules() {
188 if ( get_option( 'shopbuilder_permalinks_flushed', 'no' ) !== 'yes' ) {
189 flush_rewrite_rules();
190 update_option( 'shopbuilder_permalinks_flushed', 'yes' );
191 }
192 }
193
194 /**
195 * Add new columns to the post table
196 *
197 * @param array $columns - Current columns on the list post.
198 */
199 public function add_new_columns( $columns ) {
200 $column_meta = [
201 'type' => esc_html__( 'Template Type', 'shopbuilder' ),
202 'edit_with' => esc_html__( 'Editor Type', 'shopbuilder' ),
203 'set_default' => esc_html__( 'Set as Active', 'shopbuilder' ),
204 ];
205
206 unset( $columns['comments'] );
207
208 $columns = array_merge(
209 array_slice( $columns, 0, 2 ),
210 $column_meta,
211 array_slice( $columns, 2 )
212 );
213
214 return $columns;
215 }
216
217 /**
218 * Display data in new columns
219 *
220 * @param string $column table column.
221 * @param string $post_id Post id.
222 *
223 * @return void
224 */
225 public function custom_columns( $column, $post_id ) { // phpcs:ignore Generic.Metrics.NestingLevel.TooHigh
226 $post_id = absint( $post_id );
227 $types = BuilderFns::builder_page_types();
228 $template_type = BuilderFns::builder_type( $post_id ) ? BuilderFns::builder_type( $post_id ) : array_key_first( $types );
229
230 switch ( $column ) {
231 case 'type':
232 $the_type = ! empty( $types[ $template_type ] ) ? '<b>' . esc_html( ucwords( $types[ $template_type ] ) ) . '</b>' : '';
233 $the_type = $this->template_type_suffix( $the_type, $template_type, $post_id );
234 Fns::print_html( apply_filters( 'rtsb/columns/template/types/text', $the_type, $template_type, $post_id ) );
235 break;
236 case 'edit_with':
237 $edit_by = Fns::page_edit_with( $post_id );
238 echo esc_html( ucfirst( $edit_by ) );
239 break;
240 case 'set_default':
241 $singleton_types = apply_filters(
242 'rtsb/builder/singleton_types',
243 array_keys( BuilderFns::builder_page_types() )
244 );
245 if ( in_array( $template_type, $singleton_types, true ) ) {
246 $is_set_default = absint( BuilderFns::builder_page_id_by_type( $template_type ) );
247 } else {
248 // Pool type: read per-post meta flag — multiple templates of the same type can be enabled simultaneously.
249 $is_set_default = 'on' === get_post_meta( $post_id, '_rtsb_tb_enabled_in_pool', true ) ? $post_id : 0;
250 }
251 $is_published = 'publish' === get_post_status( $post_id );
252 $page_type_for = $template_type;
253 if ( 'product' === $template_type ) {
254 $product_page_for = get_post_meta( $post_id, '_is_product_page_template_for', true );
255 switch ( $product_page_for ) {
256 case 'specific_products':
257 $page_type_for = 'template-' . $post_id . '-specific-products';
258 $set_default = BuilderFns::get_specific_product_as_default( $post_id );
259 if ( $set_default ) {
260 $is_set_default = $post_id;
261 }
262 if ( ! $set_default && $is_set_default === $post_id ) {
263 $is_set_default = '';
264 }
265 break;
266 case 'product_cats':
267 $page_type_for = 'product-page-template-' . $post_id . '-specific-category';
268 $set_default_option_name = BuilderFns::option_name_product_page_specific_cat_set_default( $post_id );
269 $pp_cat_set_default = TemplateSettings::instance()->get_option( $set_default_option_name );
270 if ( $pp_cat_set_default ) {
271 $is_set_default = $post_id;
272 }
273 break;
274 case 'product_tags':
275 $page_type_for = 'product-page-template-' . $post_id . '-specific-tag';
276 $set_default_option_name = BuilderFns::option_name_product_page_specific_tag_set_default( $post_id );
277 $pp_tag_set_default = TemplateSettings::instance()->get_option( $set_default_option_name );
278 if ( $pp_tag_set_default ) {
279 $is_set_default = $post_id;
280 }
281 break;
282 case 'product_brands':
283 $page_type_for = 'product-page-template-' . $post_id . '-specific-brand';
284 $set_default_option_name = BuilderFns::option_name_product_page_specific_brand_set_default( $post_id );
285 $pp_brand_set_default = TemplateSettings::instance()->get_option( $set_default_option_name );
286 if ( $pp_brand_set_default ) {
287 $is_set_default = $post_id;
288 }
289 break;
290 default:
291 break;
292 }
293 } elseif ( 'archive' === $template_type ) {
294 $categories_name = apply_filters( 'rtsb/template/builder/selected/categories', [], $post_id, $template_type );
295 $set_default = BuilderFns::get_specific_category_as_default( $post_id );
296 if ( ! empty( $categories_name ) && $set_default ) {
297 $is_set_default = $post_id;
298 $page_type_for = 'template-' . $post_id . '-specific-category';
299 } else {
300 $option_name = BuilderFns::option_name( $template_type );
301 $is_set_default = TemplateSettings::instance()->get_option( $option_name );
302 $set_default = $is_set_default;
303 }
304 if ( ! $set_default && $is_set_default === $post_id ) {
305 $is_set_default = '';
306 }
307 }
308
309 $is_set_default = apply_filters( 'rtsb/builder/columns/set_default', $is_set_default, $post_id, $template_type );
310 $page_type_for = apply_filters( 'rtsb/builder/columns/page_type_for', $page_type_for, $post_id, $template_type );
311 ?>
312 <span class="rtsb-switch-wrapper page-type-<?php echo esc_attr( $page_type_for ); ?>" <?php echo ! $is_published ? 'style="pointer-events: none;"' : null; ?> title="<?php esc_html_e( 'Only publish post can set default ', 'shopbuilder' ); ?>">
313 <label class="rtsb-switch">
314 <?php do_action( 'rtsb/set/default/column/extra/field', $post_id, $template_type, $is_set_default, $is_published ); ?>
315 <div class="rtsb_template_type" data-template_type="<?php echo esc_attr( $template_type ); ?>" style='display:none;'></div>
316 <input disabled="disabled" value="<?php echo absint( $post_id ); ?>" class="rtsb_set_default" name="set_default" type="checkbox" <?php echo esc_attr( $post_id === $is_set_default ? 'checked' : '' ); ?> >
317 <span class="rtsb-slider rtsb-round ">
318 <span class="rtsb-loader"></span>
319 </span>
320 </label>
321 </span>
322 <?php
323 break;
324 }
325 }
326
327 /**
328 * Appends template sub-type suffix and selected item details to the type column text.
329 *
330 * For product templates: shows "Template For Selected Products/Categories/Tags"
331 * with linked item names below.
332 * For archive templates: shows "Template For Selected Category" with linked names.
333 *
334 * @param string $the_type The current type column HTML.
335 * @param string $template_type The template type slug.
336 * @param int $post_id The builder post ID.
337 *
338 * @return string
339 */
340 private function template_type_suffix( $the_type, $template_type, $post_id ) {
341 if ( 'product' === $template_type ) {
342 $the_type = $this->product_template_type_suffix( $the_type, $post_id );
343 } elseif ( 'archive' === $template_type ) {
344 $the_type = $this->archive_template_type_suffix( $the_type, $post_id );
345 }
346
347 return $the_type;
348 }
349
350 /**
351 * Appends product template sub-type suffix with linked product/category/tag names.
352 *
353 * @param string $the_type The current type column HTML.
354 * @param int $post_id The builder post ID.
355 *
356 * @return string
357 */
358 private function product_template_type_suffix( $the_type, $post_id ) {
359 $product_page_for = get_post_meta( $post_id, '_is_product_page_template_for', true );
360 $has_pro = rtsb()->has_pro();
361 $pro_label = ! $has_pro ? ' <span class="rtsb-pro-label" style="color:#fff;background:#ff5722;padding:1px 6px;border-radius:3px;font-size:11px;font-weight:600;">' . esc_html__( 'Pro', 'shopbuilder' ) . '</span>' : '';
362
363 switch ( $product_page_for ) {
364 case 'specific_products':
365 $the_type .= ' - ' . esc_html__( 'Template For Selected Products', 'shopbuilder' ) . $pro_label;
366 if ( $has_pro ) {
367 $the_type .= $this->get_selected_products_html( $post_id );
368 }
369 break;
370 case 'product_cats':
371 $the_type .= ' - ' . esc_html__( 'Template For Selected Categories', 'shopbuilder' ) . $pro_label;
372 if ( $has_pro ) {
373 $the_type .= $this->get_selected_terms_html( $post_id, 'product_cat' );
374 }
375 break;
376 case 'product_tags':
377 $the_type .= ' - ' . esc_html__( 'Template For Selected Tags', 'shopbuilder' ) . $pro_label;
378 if ( $has_pro ) {
379 $the_type .= $this->get_selected_terms_html( $post_id, 'product_tag' );
380 }
381 break;
382 }
383
384 return $the_type;
385 }
386
387 /**
388 * Appends archive template sub-type suffix with linked category names.
389 *
390 * @param string $the_type The current type column HTML.
391 * @param int $post_id The builder post ID.
392 *
393 * @return string
394 */
395 private function archive_template_type_suffix( $the_type, $post_id ) {
396 $option_name = BuilderFns::archive_option_name_by_template_id( $post_id );
397 $categories = TemplateSettings::instance()->get_option( $option_name );
398
399 if ( ! empty( $categories ) && is_array( $categories ) ) {
400 $has_pro = rtsb()->has_pro();
401 $pro_label = ! $has_pro ? ' <span class="rtsb-pro-label" style="color:#fff;background:#ff5722;padding:1px 6px;border-radius:3px;font-size:11px;font-weight:600;">' . esc_html__( 'Pro', 'shopbuilder' ) . '</span>' : '';
402 $the_type .= ' - ' . esc_html__( 'Template For Selected Category', 'shopbuilder' ) . $pro_label;
403 $the_type .= $this->get_selected_archive_categories_html( $categories );
404 }
405
406 return $the_type;
407 }
408
409 /**
410 * Gets HTML list of selected archive category names with links.
411 *
412 * @param array $category_slugs Array of term slugs.
413 *
414 * @return string
415 */
416 private function get_selected_archive_categories_html( $category_slugs ) {
417 if ( empty( $category_slugs ) || ! is_array( $category_slugs ) ) {
418 return '';
419 }
420
421 $links = [];
422
423 foreach ( $category_slugs as $cat_slug ) {
424 $term = get_term_by( 'slug', $cat_slug, 'product_cat' );
425
426 if ( is_wp_error( $term ) || ! $term ) {
427 continue;
428 }
429
430 $term_link = get_term_link( $term );
431
432 if ( is_wp_error( $term_link ) ) {
433 continue;
434 }
435
436 $links[] = '<a href="' . esc_url( $term_link ) . '" target="_blank">'
437 . esc_html( $term->name ) . '</a>';
438 }
439
440 if ( empty( $links ) ) {
441 return '';
442 }
443
444 return '<br><small>' . implode( ', ', $links ) . '</small>';
445 }
446
447 /**
448 * Gets HTML list of selected product names with links to their detail pages.
449 *
450 * @param int $post_id The builder post ID.
451 *
452 * @return string
453 */
454 private function get_selected_products_html( $post_id ) {
455 $option_name = BuilderFns::option_name_by_template_id( $post_id );
456 $product_ids = TemplateSettings::instance()->get_option( $option_name );
457
458 if ( empty( $product_ids ) || ! is_array( $product_ids ) ) {
459 return '';
460 }
461
462 $links = [];
463
464 foreach ( $product_ids as $product_id ) {
465 $product_id = absint( $product_id );
466 $product = wc_get_product( $product_id );
467
468 if ( ! $product ) {
469 continue;
470 }
471
472 $links[] = '<a href="' . esc_url( get_permalink( $product_id ) ) . '" target="_blank">'
473 . esc_html( $product->get_name() ) . '</a>';
474 }
475
476 if ( empty( $links ) ) {
477 return '';
478 }
479
480 return '<br><small>' . implode( ', ', $links ) . '</small>';
481 }
482
483 /**
484 * Gets HTML list of selected term names with links.
485 *
486 * @param int $post_id The builder post ID.
487 * @param string $taxonomy The taxonomy slug.
488 *
489 * @return string
490 */
491 private function get_selected_terms_html( $post_id, $taxonomy ) {
492 if ( 'product_cat' === $taxonomy ) {
493 $option_name = BuilderFns::option_name_product_page_selected_cat( $post_id );
494 } else {
495 $option_name = BuilderFns::option_name_product_page_selected_tag( $post_id );
496 }
497
498 $term_ids = TemplateSettings::instance()->get_option( $option_name );
499
500 if ( empty( $term_ids ) || ! is_array( $term_ids ) ) {
501 return '';
502 }
503
504 $links = [];
505
506 foreach ( $term_ids as $term_id ) {
507 $term = get_term( absint( $term_id ), $taxonomy );
508
509 if ( is_wp_error( $term ) || ! $term ) {
510 continue;
511 }
512
513 $term_link = get_term_link( $term );
514
515 if ( is_wp_error( $term_link ) ) {
516 continue;
517 }
518
519 $links[] = '<a href="' . esc_url( $term_link ) . '" target="_blank">'
520 . esc_html( $term->name ) . '</a>';
521 }
522
523 if ( empty( $links ) ) {
524 return '';
525 }
526
527 return '<br><small>' . implode( ', ', $links ) . '</small>';
528 }
529
530 /**
531 * Register sortable columns
532 *
533 * @param [type] $columns column list.
534 *
535 * @return array
536 */
537 public function register_sortable_columns( $columns ) {
538 $columns['type'] = 'type';
539
540 return $columns;
541 }
542
543 /**
544 * Meta sortable function.
545 *
546 * @param object $query query object.
547 *
548 * @return void
549 */
550 public function sortable_columns_query( $query ) {
551 if ( ! is_admin() || ! $this->is_current_screen() ) {
552 return;
553 }
554 $orderby = $query->get( 'orderby' );
555 if ( 'type' === $orderby ) {
556 $query->set( 'meta_key', BuilderFns::template_type_meta_key() );
557 $query->set( 'orderby', 'meta_value' );
558 }
559 }
560
561 /**
562 * Check template screen
563 *
564 * @return boolean
565 */
566 public function is_current_screen() {
567 global $pagenow, $typenow;
568
569 return 'edit.php' === $pagenow && BuilderFns::$post_type_tb === $typenow;
570 }
571
572 /**
573 * Manage Template filter by template type
574 *
575 * @param WP_Query $query WordPress main query.
576 *
577 * @return void
578 */
579 public function query_filter( WP_Query $query ) {
580
581 if ( ! is_admin() || ! $this->is_current_screen() || ! empty( $query->query_vars['meta_key'] ) ) {
582 return;
583 }
584 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
585 $type = isset( $_GET['template_type'] ) ? sanitize_key( $_GET['template_type'] ) : '';
586
587 if ( '' != $type && 'all' != $type ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
588 $query->query_vars['meta_key'] = BuilderFns::template_type_meta_key(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
589 $query->query_vars['meta_value'] = $type; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
590 $query->query_vars['meta_compare'] = '=';
591 }
592 }
593
594 /**
595 * Load Template.
596 *
597 * @param string $template Template File.
598 *
599 * @return string
600 */
601 public function builder_template( $template ) {
602 $builder_page_id = BuilderFns::is_builder_preview() ? get_the_ID() : BuilderFns::builder_page_id_by_page();
603 if ( defined( 'ELEMENTOR_VERSION' ) && $builder_page_id ) { // Elementor Check.
604 $page_template = get_post_meta( $builder_page_id, '_wp_page_template', true );
605 $new_template = RTSB_ABSPATH . 'page-templates/builder-template.php';
606 if ( 'elementor_canvas' === $page_template ) {
607 $new_template = RTSB_ABSPATH . 'page-templates/elementor-canvas.php';
608 } elseif ( 'elementor_header_footer' === $page_template ) {
609 $new_template = RTSB_ABSPATH . 'page-templates/builder-template.php';
610 }
611 if ( file_exists( $new_template ) ) {
612 $template = $new_template;
613 }
614 }
615
616 return $template;
617 }
618
619 /**
620 * Restrict the preview access.
621 *
622 * @return void
623 */
624 public function restrict_preview_access() {
625 if ( ! apply_filters( 'rtsb/builder/preview/access', true ) ) {
626 return;
627 }
628
629 if ( is_singular( 'rtsb_builder' ) ) {
630 if ( ! is_user_logged_in() ) {
631 wp_safe_redirect( home_url() );
632 }
633 }
634 }
635
636 /**
637 * Add/Remove edit link in dashboard.
638 *
639 * Add or remove an edit link to the post/page action links on the post/pages list table.
640 *
641 * Fired by `post_row_actions` and `page_row_actions` filters.
642 *
643 * @access public
644 *
645 * @param array $actions An array of row action links.
646 *
647 * @return array An updated array of row action links.
648 */
649 public function filter_post_row_actions( $actions ) {
650 if ( $this->is_current_screen() ) {
651 unset( $actions['inline hide-if-no-js'] );
652
653 if ( isset( $actions['view'] ) ) {
654 $actions['view'] = str_replace( __( 'View', 'shopbuilder' ), __( 'Preview', 'shopbuilder' ), $actions['view'] );
655 }
656 }
657
658 return $actions;
659 }
660 }
661