PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.4.0
ShopBuilder – WooCommerce Builder For Elementor v2.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 2.4.0, at app/Controllers/Builder/BuilderCpt.php

405 lines 13.8 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 add_filter( 'template_include', [ $this, 'builder_template' ], 99 );
39 add_filter( 'template_redirect', [ $this, 'restrict_preview_access' ], 99 );
40
41 add_filter( 'parse_query', [ $this, 'query_filter' ] );
42 // add filter for search.
43 add_action( 'restrict_manage_posts', [ $this, 'add_filter' ] );
44
45 add_action( 'in_admin_header', [ $this, 'remove_all_notices' ], 1000 );
46 }
47
48
49 /**
50 * Public function add_filter.
51 * Added search filter for type of template
52 *
53 * @since 1.0.0
54 */
55 public function add_filter() {
56
57 global $typenow;
58
59 if ( BuilderFns::$post_type_tb != $typenow ) {
60 return;
61 }
62 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
63 $selected = isset( $_GET['type'] ) ? sanitize_key( $_GET['type'] ) : '';
64 $builder_page_types = BuilderFns::builder_page_types();
65 ?>
66 <select name="template_type" id="type">
67 <option value="all" <?php selected( 'all', $selected ); ?>><?php esc_html_e( 'Template Type ', 'shopbuilder' ); ?></option>
68 <?php foreach ( $builder_page_types as $key => $value ) { ?>
69 <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $key, $selected ); ?>><?php echo esc_html( $value ); ?></option>
70 <?php } ?>
71 </select>
72 <?php
73 }
74
75 /**
76 * Post type function
77 *
78 * @return void
79 */
80 public function template_builder_post_type() {
81 /**
82 * Template Builder Post type
83 */
84 $tb_labels = [
85 'name' => esc_html_x( 'WooCommerce Page Builder', 'Post Type General Name', 'shopbuilder' ),
86 'singular_name' => esc_html_x( 'Templates Builder', 'Post Type Singular Name', 'shopbuilder' ),
87 'menu_name' => esc_html__( 'Templates Builder', 'shopbuilder' ),
88 'name_admin_bar' => esc_html__( 'Templates Builder', 'shopbuilder' ),
89 'archives' => esc_html__( 'WC Page Archives', 'shopbuilder' ),
90 'attributes' => esc_html__( 'Page Attributes', 'shopbuilder' ),
91 'parent_item_colon' => esc_html__( 'Parent Item:', 'shopbuilder' ),
92 'all_items' => esc_html__( 'Templates Builder', 'shopbuilder' ),
93 'add_new_item' => esc_html__( 'Add New Page', 'shopbuilder' ),
94 'add_new' => esc_html__( 'Add New', 'shopbuilder' ),
95 'new_item' => esc_html__( 'New Page', 'shopbuilder' ),
96 'edit_item' => esc_html__( 'Edit Page', 'shopbuilder' ),
97 'update_item' => esc_html__( 'Update Page', 'shopbuilder' ),
98 'view_item' => esc_html__( 'View Page', 'shopbuilder' ),
99 'view_items' => esc_html__( 'View Pages', 'shopbuilder' ),
100 'search_items' => esc_html__( 'Search Pages', 'shopbuilder' ),
101 'not_found' => esc_html__( 'Not found', 'shopbuilder' ),
102 'not_found_in_trash' => esc_html__( 'Not found in Trash', 'shopbuilder' ),
103 'featured_image' => esc_html__( 'Featured Image', 'shopbuilder' ),
104 'set_featured_image' => esc_html__( 'Set featured image', 'shopbuilder' ),
105 'remove_featured_image' => esc_html__( 'Remove featured image', 'shopbuilder' ),
106 'use_featured_image' => esc_html__( 'Use as featured image', 'shopbuilder' ),
107 'insert_into_item' => esc_html__( 'Insert into page', 'shopbuilder' ),
108 'uploaded_to_this_item' => esc_html__( 'Uploaded to this page', 'shopbuilder' ),
109 'items_list' => esc_html__( 'Pages list', 'shopbuilder' ),
110 'items_list_navigation' => esc_html__( 'Pages list navigation', 'shopbuilder' ),
111 'filter_items_list' => esc_html__( 'Filter from list', 'shopbuilder' ),
112 ];
113
114 $tb_args = [
115 'label' => esc_html__( 'Templates Builder', 'shopbuilder' ),
116 'description' => esc_html__( 'Shopbuilder Template', 'shopbuilder' ),
117 'labels' => $tb_labels,
118 'supports' => [ 'title', 'editor', 'elementor', 'author', 'permalink', 'comments' ],
119 'hierarchical' => false,
120 'public' => true,
121 'show_ui' => true,
122 'show_in_menu' => 'rtsb',
123 'show_in_admin_bar' => false,
124 'show_in_nav_menus' => true,
125 'can_export' => true,
126 'has_archive' => false,
127 'rewrite' => [
128 'slug' => 'rtsb-template',
129 'pages' => false,
130 'with_front' => true,
131 'feeds' => false,
132 ],
133 'query_var' => true,
134 'publicly_queryable' => true,
135 // 'capability_type' => 'product', Will Remove this line in the future.
136 'show_in_rest' => true,
137 'rest_base' => BuilderFns::$post_type_tb,
138 ];
139
140 $tb_args = apply_filters( 'rtsb/builder/template_args', $tb_args );
141
142 register_post_type( BuilderFns::$post_type_tb, $tb_args );
143
144 // Flash rewrite rules.
145 $this->flush_rewrite_rules();
146 }
147
148 /**
149 * Flush rewrite
150 *
151 * @return void
152 */
153 public function flush_rewrite_rules() {
154 if ( get_option( 'shopbuilder_permalinks_flushed', 'no' ) !== 'yes' ) {
155 flush_rewrite_rules();
156 update_option( 'shopbuilder_permalinks_flushed', 'yes' );
157 }
158 }
159
160 /**
161 * Add new columns to the post table
162 *
163 * @param array $columns - Current columns on the list post.
164 */
165 public function add_new_columns( $columns ) {
166 $column_meta = [
167 'type' => esc_html__( 'Template Type', 'shopbuilder' ),
168 'edit_with' => esc_html__( 'Editor Type', 'shopbuilder' ),
169 'set_default' => esc_html__( 'Set as Active', 'shopbuilder' ),
170 ];
171
172 unset( $columns['comments'] );
173
174 $columns = array_merge(
175 array_slice( $columns, 0, 2 ),
176 $column_meta,
177 array_slice( $columns, 2 )
178 );
179
180 return $columns;
181 }
182
183 /**
184 * Display data in new columns
185 *
186 * @param string $column table column.
187 * @param string $post_id Post id.
188 *
189 * @return void
190 */
191 public function custom_columns( $column, $post_id ) {
192 $post_id = absint( $post_id );
193 $types = BuilderFns::builder_page_types();
194 $template_type = BuilderFns::builder_type( $post_id ) ? BuilderFns::builder_type( $post_id ) : array_key_first( $types );
195
196 switch ( $column ) {
197 case 'type':
198 $the_type = ! empty( $types[ $template_type ] ) ? '<b>' . esc_html( ucwords( $types[ $template_type ] ) ) . '</b>' : '';
199 Fns::print_html( apply_filters( 'rtsb/columns/template/types/text', $the_type, $template_type, $post_id ) );
200 break;
201 case 'edit_with':
202 $edit_by = Fns::page_edit_with( $post_id );
203 echo esc_html( ucfirst( $edit_by ) );
204 break;
205 case 'set_default':
206 $is_set_default = absint( BuilderFns::builder_page_id_by_type( $template_type ) );
207 $is_published = 'publish' === get_post_status( $post_id );
208 $page_type_for = $template_type;
209 if ( 'product' === $template_type ) {
210 $product_page_for = get_post_meta( $post_id, '_is_product_page_template_for', true );
211 switch ( $product_page_for ) {
212 case 'specific_products':
213 $page_type_for = 'template-' . $post_id . '-specific-products';
214 $set_default = BuilderFns::get_specific_product_as_default( $post_id );
215 if ( $set_default ) {
216 $is_set_default = $post_id;
217 }
218 break;
219 case 'product_cats':
220 $page_type_for = 'product-page-template-' . $post_id . '-specific-category';
221 $set_default_option_name = BuilderFns::option_name_product_page_specific_cat_set_default( $post_id );
222 $pp_cat_set_default = TemplateSettings::instance()->get_option( $set_default_option_name );
223 if ( $pp_cat_set_default ) {
224 $is_set_default = $post_id;
225 }
226 break;
227 case 'product_tags':
228 $page_type_for = 'product-page-template-' . $post_id . '-specific-tag';
229 $set_default_option_name = BuilderFns::option_name_product_page_specific_tag_set_default( $post_id );
230 $pp_tag_set_default = TemplateSettings::instance()->get_option( $set_default_option_name );
231 if ( $pp_tag_set_default ) {
232 $is_set_default = $post_id;
233 }
234 break;
235 default:
236 break;
237 }
238 } elseif ( 'archive' === $template_type ) {
239 $categories_name = apply_filters( 'rtsb/template/builder/selected/categories', [], $post_id, $template_type );
240 $set_default = BuilderFns::get_specific_category_as_default( $post_id );
241 if ( ! empty( $categories_name ) && $set_default ) {
242 $is_set_default = $post_id;
243 $page_type_for = 'template-' . $post_id . '-specific-category';
244 }
245 }
246 ?>
247 <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' ); ?>">
248 <label class="rtsb-switch">
249 <?php do_action( 'rtsb/set/default/column/extra/field', $post_id, $template_type, $is_set_default, $is_published ); ?>
250 <div class="rtsb_template_type" data-template_type="<?php echo esc_attr( $template_type ); ?>" style='display:none;'></div>
251 <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' : '' ); ?> >
252 <span class="rtsb-slider rtsb-round ">
253 <span class="rtsb-loader"></span>
254 </span>
255 </label>
256 </span>
257 <?php
258 break;
259 }
260 }
261
262 /**
263 * Register sortable columns
264 *
265 * @param [type] $columns column list.
266 *
267 * @return array
268 */
269 public function register_sortable_columns( $columns ) {
270 $columns['type'] = 'type';
271
272 return $columns;
273 }
274
275 /**
276 * Meta sortable function.
277 *
278 * @param object $query query object.
279 *
280 * @return void
281 */
282 public function sortable_columns_query( $query ) {
283 if ( ! is_admin() || ! $this->is_current_screen() ) {
284 return;
285 }
286 $orderby = $query->get( 'orderby' );
287 if ( 'type' === $orderby ) {
288 $query->set( 'meta_key', BuilderFns::template_type_meta_key() );
289 $query->set( 'orderby', 'meta_value' );
290 }
291 }
292
293 /**
294 * Check template screen
295 *
296 * @return boolean
297 */
298 public function is_current_screen() {
299 global $pagenow, $typenow;
300
301 return 'edit.php' === $pagenow && BuilderFns::$post_type_tb === $typenow;
302 }
303
304 /**
305 * Manage Template filter by template type
306 *
307 * @param WP_Query $query WordPress main query.
308 *
309 * @return void
310 */
311 public function query_filter( WP_Query $query ) {
312
313 if ( ! is_admin() || ! $this->is_current_screen() || ! empty( $query->query_vars['meta_key'] ) ) {
314 return;
315 }
316 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
317 $type = isset( $_GET['template_type'] ) ? sanitize_key( $_GET['template_type'] ) : '';
318
319 if ( '' != $type && 'all' != $type ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
320 $query->query_vars['meta_key'] = BuilderFns::template_type_meta_key(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
321 $query->query_vars['meta_value'] = $type; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
322 $query->query_vars['meta_compare'] = '=';
323 }
324 }
325
326 /**
327 * Load Template.
328 *
329 * @param string $template Template File.
330 *
331 * @return string
332 */
333 public function builder_template( $template ) {
334 $builder_page_id = BuilderFns::is_builder_preview() ? get_the_ID() : BuilderFns::builder_page_id_by_page();
335 if ( $builder_page_id ) {
336 $page_template = get_post_meta( $builder_page_id, '_wp_page_template', true );
337 $new_template = RTSB_ABSPATH . 'page-templates/builder-template.php';
338 if ( 'elementor_canvas' === $page_template ) {
339 $new_template = RTSB_ABSPATH . 'page-templates/elementor-canvas.php';
340 } elseif ( 'elementor_header_footer' === $page_template ) {
341 $new_template = RTSB_ABSPATH . 'page-templates/builder-template.php';
342 }
343 if ( file_exists( $new_template ) ) {
344 $template = $new_template;
345 }
346 }
347
348 return $template;
349 }
350
351 /**
352 * Restrict the preview access.
353 *
354 * @return void
355 */
356 public function restrict_preview_access() {
357 if ( ! apply_filters( 'rtsb/builder/preview/access', true ) ) {
358 return;
359 }
360
361 if ( is_singular( 'rtsb_builder' ) ) {
362 if ( ! is_user_logged_in() ) {
363 wp_safe_redirect( home_url() );
364 }
365 }
366 }
367
368 /**
369 * Add/Remove edit link in dashboard.
370 *
371 * Add or remove an edit link to the post/page action links on the post/pages list table.
372 *
373 * Fired by `post_row_actions` and `page_row_actions` filters.
374 *
375 * @access public
376 *
377 * @param array $actions An array of row action links.
378 *
379 * @return array An updated array of row action links.
380 */
381 public function filter_post_row_actions( $actions ) {
382 if ( $this->is_current_screen() ) {
383 // unset( $actions['view'] );
384 unset( $actions['inline hide-if-no-js'] );
385
386 if ( isset( $actions['view'] ) ) {
387 $actions['view'] = str_replace( __( 'View', 'shopbuilder' ), __( 'Preview', 'shopbuilder' ), $actions['view'] );
388 }
389 }
390
391 return $actions;
392 }
393
394 /**
395 * Remove admin notices
396 */
397 public function remove_all_notices() {
398 $screen = get_current_screen();
399 if ( 'edit-rtsb_builder' === $screen->id ) {
400 remove_all_actions( 'admin_notices' );
401 remove_all_actions( 'all_admin_notices' );
402 }
403 }
404 }
405