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

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