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

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