PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.0.2
ShopBuilder – WooCommerce Builder For Elementor v2.0.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
← All changes | app/Controllers/Builder/BuilderCpt.php +49 -349 3.4.02.0.2 View file →
@@ -8,13 +8,11 @@
8 8 namespace RadiusTheme\SB\Controllers\Builder;
9 9
10 10 defined( 'ABSPATH' ) || exit();
11 11
12 -use RadiusTheme\SB\Models\TemplateSettings;
13 -use WP_Query;
12 +use RadiusTheme\SB\Traits\SingletonTrait;
14 13 use RadiusTheme\SB\Helpers\Fns;
15 14 use RadiusTheme\SB\Helpers\BuilderFns;
16 -use RadiusTheme\SB\Traits\SingletonTrait;
17 15
18 16 /**
19 17 * Builder Custom post type
20 18 */
@@ -34,52 +32,18 @@
34 32 add_filter( 'manage_edit-' . BuilderFns::$post_type_tb . '_columns', [ $this, 'add_new_columns' ] );
35 33 add_action( 'manage_' . BuilderFns::$post_type_tb . '_posts_custom_column', [ $this, 'custom_columns' ], 10, 2 );
36 34 add_filter( 'manage_edit-' . BuilderFns::$post_type_tb . '_sortable_columns', [ $this, 'register_sortable_columns' ] );
37 35 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 );
41 - add_filter( 'template_redirect', [ $this, 'restrict_preview_access' ], 99 );
36 + add_filter( 'template_include', [ $this, 'builder_template' ], 99 );
42 37
43 38 add_filter( 'parse_query', [ $this, 'query_filter' ] );
44 - // Add filter for search.
39 + // add filter for search
45 40 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 );
41 +
42 + add_action( 'in_admin_header', [ $this, 'remove_all_notices' ], 1000 );
43 +
48 44 }
49 45
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 46
83 47 /**
84 48 * Public function add_filter.
85 49 * Added search filter for type of template
@@ -89,14 +53,14 @@
89 53 public function add_filter() {
90 54
91 55 global $typenow;
92 56
93 - if ( BuilderFns::$post_type_tb != $typenow ) {
57 + if ( $typenow != BuilderFns::$post_type_tb ) {
94 58 return;
95 59 }
96 - // phpcs:ignore WordPress.Security.NonceVerification.Recommended
97 - $selected = isset( $_GET['type'] ) ? sanitize_key( $_GET['type'] ) : '';
98 - $builder_page_types = BuilderFns::builder_page_types();
60 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended. No need nonce.
61 + $selected = isset( $_GET['type'] ) ? sanitize_key( $_GET['type'] ) : '';
62 + $builder_page_types = BuilderFns::builder_page_types();
99 63 ?>
100 64 <select name="template_type" id="type">
101 65 <option value="all" <?php selected( 'all', $selected ); ?>><?php esc_html_e( 'Template Type ', 'shopbuilder' ); ?></option>
102 66 <?php foreach ( $builder_page_types as $key => $value ) { ?>
@@ -103,8 +67,9 @@
103 67 <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $key, $selected ); ?>><?php echo esc_html( $value ); ?></option>
104 68 <?php } ?>
105 69 </select>
106 70 <?php
71 +
107 72 }
108 73
109 74 /**
110 75 * Post type function
@@ -165,19 +130,20 @@
165 130 'feeds' => false,
166 131 ],
167 132 'query_var' => true,
168 133 'publicly_queryable' => true,
169 - // 'capability_type' => 'product', Will Remove this line in the future.
134 + 'capability_type' => 'product',
170 135 'show_in_rest' => true,
171 136 'rest_base' => BuilderFns::$post_type_tb,
172 137 ];
173 138
174 - $tb_args = apply_filters( 'rtsb/builder/template_args', $tb_args );
139 + $tb_args = apply_filters( 'rtsb_register_template_builder_args', $tb_args );
175 140
176 141 register_post_type( BuilderFns::$post_type_tb, $tb_args );
177 142
178 143 // Flash rewrite rules.
179 144 $this->flush_rewrite_rules();
145 +
180 146 }
181 147
182 148 /**
183 149 * Flush rewrite
@@ -221,18 +187,17 @@
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
226 - $post_id = absint( $post_id );
227 - $types = BuilderFns::builder_page_types();
228 - $template_type = BuilderFns::builder_type( $post_id ) ? BuilderFns::builder_type( $post_id ) : array_key_first( $types );
191 + public function custom_columns( $column, $post_id ) {
192 + $post_id = absint( $post_id );
193 + $types = BuilderFns::builder_page_types();
194 + $type = BuilderFns::builder_type( $post_id ) ? BuilderFns::builder_type( $post_id ) : array_key_first( $types );
229 195
230 196 switch ( $column ) {
231 197 case 'type':
232 - $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 - Fns::print_html( apply_filters( 'rtsb/columns/template/types/text', $the_type, $template_type, $post_id ) );
198 + $the_type = ! empty( $types[ $type ] ) ? esc_html( ucwords( $types[ $type ] ) ) : '';
199 + echo apply_filters( 'rtsb/columns/template/types/text', $the_type, $type, $post_id );
235 200 break;
236 201 case 'edit_with':
237 202 $edit_by = Fns::page_edit_with( $post_id );
238 203 echo esc_html( ucfirst( $edit_by ) );
@@ -237,83 +202,31 @@
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;
253 - if ( 'product' === $template_type ) {
254 - $product_page_for = get_post_meta( $post_id, '_is_product_page_template_for', true );
255 - switch ( $product_page_for ) {
256 - case 'specific_products':
257 - $page_type_for = 'template-' . $post_id . '-specific-products';
258 - $set_default = BuilderFns::get_specific_product_as_default( $post_id );
259 - if ( $set_default ) {
260 - $is_set_default = $post_id;
261 - }
262 - if ( ! $set_default && $is_set_default === $post_id ) {
263 - $is_set_default = '';
264 - }
265 - break;
266 - case 'product_cats':
267 - $page_type_for = 'product-page-template-' . $post_id . '-specific-category';
268 - $set_default_option_name = BuilderFns::option_name_product_page_specific_cat_set_default( $post_id );
269 - $pp_cat_set_default = TemplateSettings::instance()->get_option( $set_default_option_name );
270 - if ( $pp_cat_set_default ) {
271 - $is_set_default = $post_id;
272 - }
273 - break;
274 - case 'product_tags':
275 - $page_type_for = 'product-page-template-' . $post_id . '-specific-tag';
276 - $set_default_option_name = BuilderFns::option_name_product_page_specific_tag_set_default( $post_id );
277 - $pp_tag_set_default = TemplateSettings::instance()->get_option( $set_default_option_name );
278 - if ( $pp_tag_set_default ) {
279 - $is_set_default = $post_id;
280 - }
281 - 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 - default:
291 - break;
206 + $is_set_default = absint( BuilderFns::builder_page_id_by_type( $type ) );
207 + $is_published = 'publish' === get_post_status( $post_id );
208 + $page_type_for = $type;
209 + if ( 'product' === $type ) {
210 + $product_ids = apply_filters( 'rtsb/product/page/builder/selected/products', [], $post_id );
211 + $set_default = BuilderFns::get_specific_product_as_default( $post_id );
212 + if ( ! empty( $product_ids ) && $set_default ) {
213 + $is_set_default = $post_id;
214 + $page_type_for = 'template-' . $post_id . '-specific-products';
292 215 }
293 - } elseif ( 'archive' === $template_type ) {
294 - $categories_name = apply_filters( 'rtsb/template/builder/selected/categories', [], $post_id, $template_type );
216 + } elseif ( 'archive' === $type ) {
217 + $categories_name = apply_filters( 'rtsb/archive/page/builder/selected/categories', [], $post_id );
295 218 $set_default = BuilderFns::get_specific_category_as_default( $post_id );
296 219 if ( ! empty( $categories_name ) && $set_default ) {
297 220 $is_set_default = $post_id;
298 221 $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 222 }
304 - if ( ! $set_default && $is_set_default === $post_id ) {
305 - $is_set_default = '';
306 - }
307 223 }
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 224 ?>
312 225 <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 226 <label class="rtsb-switch">
314 - <?php do_action( 'rtsb/set/default/column/extra/field', $post_id, $template_type, $is_set_default, $is_published ); ?>
315 - <div class="rtsb_template_type" data-template_type="<?php echo esc_attr( $template_type ); ?>" style='display:none;'></div>
227 + <?php do_action( 'rtsb/set/default/column/extra/field', $post_id, $type, $is_set_default, $is_published ); ?>
228 + <div class="rtsb_template_type" data-template_type="<?php echo esc_attr( $type ); ?>" style='display:none;'></div>
316 229 <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' : '' ); ?> >
317 230 <span class="rtsb-slider rtsb-round ">
318 231 <span class="rtsb-loader"></span>
319 232 </span>
@@ -324,211 +237,8 @@
324 237 }
325 238 }
326 239
327 240 /**
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 241 * Register sortable columns
532 242 *
533 243 * @param [type] $columns column list.
534 244 *
@@ -571,23 +281,22 @@
571 281
572 282 /**
573 283 * Manage Template filter by template type
574 284 *
575 - * @param WP_Query $query WordPress main query.
285 + * @param \WP_Query $query WordPress main query.
576 286 *
577 287 * @return void
578 288 */
579 - public function query_filter( WP_Query $query ) {
289 + public function query_filter( \WP_Query $query ) {
580 290
581 291 if ( ! is_admin() || ! $this->is_current_screen() || ! empty( $query->query_vars['meta_key'] ) ) {
582 292 return;
583 293 }
584 - // phpcs:ignore WordPress.Security.NonceVerification.Recommended
585 294 $type = isset( $_GET['template_type'] ) ? sanitize_key( $_GET['template_type'] ) : '';
586 295
587 296 if ( '' != $type && 'all' != $type ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
588 297 $query->query_vars['meta_key'] = BuilderFns::template_type_meta_key(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
589 - $query->query_vars['meta_value'] = $type; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
298 + $query->query_vars['meta_value'] = $type;
590 299 $query->query_vars['meta_compare'] = '=';
591 300 }
592 301 }
593 302
@@ -599,9 +308,9 @@
599 308 * @return string
600 309 */
601 310 public function builder_template( $template ) {
602 311 $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.
312 + if ( $builder_page_id ) {
604 313 $page_template = get_post_meta( $builder_page_id, '_wp_page_template', true );
605 314 $new_template = RTSB_ABSPATH . 'page-templates/builder-template.php';
606 315 if ( 'elementor_canvas' === $page_template ) {
607 316 $new_template = RTSB_ABSPATH . 'page-templates/elementor-canvas.php';
@@ -616,25 +325,8 @@
616 325 return $template;
617 326 }
618 327
619 328 /**
620 - * Restrict the preview access.
621 - *
622 - * @return void
623 - */
624 - public function restrict_preview_access() {
625 - if ( ! apply_filters( 'rtsb/builder/preview/access', true ) ) {
626 - return;
627 - }
628 -
629 - if ( is_singular( 'rtsb_builder' ) ) {
630 - if ( ! is_user_logged_in() ) {
631 - wp_safe_redirect( home_url() );
632 - }
633 - }
634 - }
635 -
636 - /**
637 329 * Add/Remove edit link in dashboard.
638 330 *
639 331 * Add or remove an edit link to the post/page action links on the post/pages list table.
640 332 *
@@ -647,14 +339,22 @@
647 339 * @return array An updated array of row action links.
648 340 */
649 341 public function filter_post_row_actions( $actions ) {
650 342 if ( $this->is_current_screen() ) {
343 + // unset( $actions['view'] );
651 344 unset( $actions['inline hide-if-no-js'] );
652 -
653 - if ( isset( $actions['view'] ) ) {
654 - $actions['view'] = str_replace( __( 'View', 'shopbuilder' ), __( 'Preview', 'shopbuilder' ), $actions['view'] );
655 - }
656 345 }
657 346
658 347 return $actions;
348 + }
349 +
350 + /**
351 + * Remove admin notices
352 + */
353 + public function remove_all_notices() {
354 + $screen = get_current_screen();
355 + if ( 'edit-rtsb_builder' === $screen->id ) {
356 + remove_all_actions( 'admin_notices' );
357 + remove_all_actions( 'all_admin_notices' );
358 + }
659 359 }
660 360 }