PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.5.1
ShopBuilder – WooCommerce Builder For Elementor v2.5.1
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
← All changes | app/Controllers/Builder/BuilderCpt.php +23 -279 3.4.22.5.1 View file →
@@ -34,52 +34,18 @@
34 34 add_filter( 'manage_edit-' . BuilderFns::$post_type_tb . '_columns', [ $this, 'add_new_columns' ] );
35 35 add_action( 'manage_' . BuilderFns::$post_type_tb . '_posts_custom_column', [ $this, 'custom_columns' ], 10, 2 );
36 36 add_filter( 'manage_edit-' . BuilderFns::$post_type_tb . '_sortable_columns', [ $this, 'register_sortable_columns' ] );
37 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 );
38 + add_filter( 'template_include', [ $this, 'builder_template' ], 99 );
41 39 add_filter( 'template_redirect', [ $this, 'restrict_preview_access' ], 99 );
42 40
43 41 add_filter( 'parse_query', [ $this, 'query_filter' ] );
44 - // Add filter for search.
42 + // add filter for search.
45 43 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 );
44 +
45 + add_action( 'in_admin_header', [ $this, 'remove_all_notices' ], 1000 );
48 46 }
49 47
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 48
83 49 /**
84 50 * Public function add_filter.
85 51 * Added search filter for type of template
@@ -93,10 +59,10 @@
93 59 if ( BuilderFns::$post_type_tb != $typenow ) {
94 60 return;
95 61 }
96 62 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
97 - $selected = isset( $_GET['type'] ) ? sanitize_key( $_GET['type'] ) : '';
98 - $builder_page_types = BuilderFns::builder_page_types();
63 + $selected = isset( $_GET['type'] ) ? sanitize_key( $_GET['type'] ) : '';
64 + $builder_page_types = BuilderFns::builder_page_types();
99 65 ?>
100 66 <select name="template_type" id="type">
101 67 <option value="all" <?php selected( 'all', $selected ); ?>><?php esc_html_e( 'Template Type ', 'shopbuilder' ); ?></option>
102 68 <?php foreach ( $builder_page_types as $key => $value ) { ?>
@@ -221,9 +187,9 @@
221 187 * @param string $post_id Post id.
222 188 *
223 189 * @return void
224 190 */
225 - public function custom_columns( $column, $post_id ) { // phpcs:ignore Generic.Metrics.NestingLevel.TooHigh
191 + public function custom_columns( $column, $post_id ) {
226 192 $post_id = absint( $post_id );
227 193 $types = BuilderFns::builder_page_types();
228 194 $template_type = BuilderFns::builder_type( $post_id ) ? BuilderFns::builder_type( $post_id ) : array_key_first( $types );
229 195
@@ -229,9 +195,8 @@
229 195
230 196 switch ( $column ) {
231 197 case 'type':
232 198 $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 199 Fns::print_html( apply_filters( 'rtsb/columns/template/types/text', $the_type, $template_type, $post_id ) );
235 200 break;
236 201 case 'edit_with':
237 202 $edit_by = Fns::page_edit_with( $post_id );
@@ -237,20 +202,11 @@
237 202 $edit_by = Fns::page_edit_with( $post_id );
238 203 echo esc_html( ucfirst( $edit_by ) );
239 204 break;
240 205 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;
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;
253 209 if ( 'product' === $template_type ) {
254 210 $product_page_for = get_post_meta( $post_id, '_is_product_page_template_for', true );
255 211 switch ( $product_page_for ) {
256 212 case 'specific_products':
@@ -258,11 +214,8 @@
258 214 $set_default = BuilderFns::get_specific_product_as_default( $post_id );
259 215 if ( $set_default ) {
260 216 $is_set_default = $post_id;
261 217 }
262 - if ( ! $set_default && $is_set_default === $post_id ) {
263 - $is_set_default = '';
264 - }
265 218 break;
266 219 case 'product_cats':
267 220 $page_type_for = 'product-page-template-' . $post_id . '-specific-category';
268 221 $set_default_option_name = BuilderFns::option_name_product_page_specific_cat_set_default( $post_id );
@@ -278,16 +231,8 @@
278 231 if ( $pp_tag_set_default ) {
279 232 $is_set_default = $post_id;
280 233 }
281 234 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 235 default:
291 236 break;
292 237 }
293 238 } elseif ( 'archive' === $template_type ) {
@@ -295,20 +240,10 @@
295 240 $set_default = BuilderFns::get_specific_category_as_default( $post_id );
296 241 if ( ! empty( $categories_name ) && $set_default ) {
297 242 $is_set_default = $post_id;
298 243 $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 244 }
304 - if ( ! $set_default && $is_set_default === $post_id ) {
305 - $is_set_default = '';
306 - }
307 245 }
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 246 ?>
312 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' ); ?>">
313 248 <label class="rtsb-switch">
314 249 <?php do_action( 'rtsb/set/default/column/extra/field', $post_id, $template_type, $is_set_default, $is_published ); ?>
@@ -324,211 +259,8 @@
324 259 }
325 260 }
326 261
327 262 /**
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 263 * Register sortable columns
532 264 *
533 265 * @param [type] $columns column list.
534 266 *
@@ -599,9 +331,9 @@
599 331 * @return string
600 332 */
601 333 public function builder_template( $template ) {
602 334 $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.
335 + if ( $builder_page_id ) {
604 336 $page_template = get_post_meta( $builder_page_id, '_wp_page_template', true );
605 337 $new_template = RTSB_ABSPATH . 'page-templates/builder-template.php';
606 338 if ( 'elementor_canvas' === $page_template ) {
607 339 $new_template = RTSB_ABSPATH . 'page-templates/elementor-canvas.php';
@@ -647,8 +379,9 @@
647 379 * @return array An updated array of row action links.
648 380 */
649 381 public function filter_post_row_actions( $actions ) {
650 382 if ( $this->is_current_screen() ) {
383 + // unset( $actions['view'] );
651 384 unset( $actions['inline hide-if-no-js'] );
652 385
653 386 if ( isset( $actions['view'] ) ) {
654 387 $actions['view'] = str_replace( __( 'View', 'shopbuilder' ), __( 'Preview', 'shopbuilder' ), $actions['view'] );
@@ -655,6 +388,17 @@
655 388 }
656 389 }
657 390
658 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 + }
659 403 }
660 404 }