PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 3.0.0
ShopBuilder – WooCommerce Builder For Elementor v3.0.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.0.0, at app/Controllers/Builder/BuilderCpt.php

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