PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.6.5
ShopBuilder – WooCommerce Builder For Elementor v2.6.5
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 +109 -43 2.0.32.6.5 View file →
@@ -8,11 +8,13 @@
8 8 namespace RadiusTheme\SB\Controllers\Builder;
9 9
10 10 defined( 'ABSPATH' ) || exit();
11 11
12 -use RadiusTheme\SB\Traits\SingletonTrait;
12 +use RadiusTheme\SB\Models\TemplateSettings;
13 +use WP_Query;
13 14 use RadiusTheme\SB\Helpers\Fns;
14 15 use RadiusTheme\SB\Helpers\BuilderFns;
16 +use RadiusTheme\SB\Traits\SingletonTrait;
15 17
16 18 /**
17 19 * Builder Custom post type
18 20 */
@@ -33,18 +35,51 @@
33 35 add_action( 'manage_' . BuilderFns::$post_type_tb . '_posts_custom_column', [ $this, 'custom_columns' ], 10, 2 );
34 36 add_filter( 'manage_edit-' . BuilderFns::$post_type_tb . '_sortable_columns', [ $this, 'register_sortable_columns' ] );
35 37 add_action( 'pre_get_posts', [ $this, 'sortable_columns_query' ] );
36 38 add_filter( 'template_include', [ $this, 'builder_template' ], 99 );
39 + add_filter( 'template_redirect', [ $this, 'restrict_preview_access' ], 99 );
37 40
38 41 add_filter( 'parse_query', [ $this, 'query_filter' ] );
39 - // add filter for search
42 + // Add filter for search.
40 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 + }
41 47
42 - add_action( 'in_admin_header', [ $this, 'remove_all_notices' ], 1000 );
43 -
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 );
44 80 }
45 81
46 -
47 82 /**
48 83 * Public function add_filter.
49 84 * Added search filter for type of template
50 85 *
@@ -53,12 +88,12 @@
53 88 public function add_filter() {
54 89
55 90 global $typenow;
56 91
57 - if ( $typenow != BuilderFns::$post_type_tb ) {
92 + if ( BuilderFns::$post_type_tb != $typenow ) {
58 93 return;
59 94 }
60 - // phpcs:ignore WordPress.Security.NonceVerification.Recommended. No need nonce.
95 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended
61 96 $selected = isset( $_GET['type'] ) ? sanitize_key( $_GET['type'] ) : '';
62 97 $builder_page_types = BuilderFns::builder_page_types();
63 98 ?>
64 99 <select name="template_type" id="type">
@@ -67,9 +102,8 @@
67 102 <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $key, $selected ); ?>><?php echo esc_html( $value ); ?></option>
68 103 <?php } ?>
69 104 </select>
70 105 <?php
71 -
72 106 }
73 107
74 108 /**
75 109 * Post type function
@@ -130,20 +164,19 @@
130 164 'feeds' => false,
131 165 ],
132 166 'query_var' => true,
133 167 'publicly_queryable' => true,
134 - 'capability_type' => 'product',
168 + // 'capability_type' => 'product', Will Remove this line in the future.
135 169 'show_in_rest' => true,
136 170 'rest_base' => BuilderFns::$post_type_tb,
137 171 ];
138 172
139 - $tb_args = apply_filters( 'rtsb_register_template_builder_args', $tb_args );
173 + $tb_args = apply_filters( 'rtsb/builder/template_args', $tb_args );
140 174
141 175 register_post_type( BuilderFns::$post_type_tb, $tb_args );
142 176
143 177 // Flash rewrite rules.
144 178 $this->flush_rewrite_rules();
145 -
146 179 }
147 180
148 181 /**
149 182 * Flush rewrite
@@ -188,16 +221,16 @@
188 221 *
189 222 * @return void
190 223 */
191 224 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 );
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 );
195 228
196 229 switch ( $column ) {
197 230 case 'type':
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 );
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 ) );
200 233 break;
201 234 case 'edit_with':
202 235 $edit_by = Fns::page_edit_with( $post_id );
203 236 echo esc_html( ucfirst( $edit_by ) );
@@ -202,20 +235,42 @@
202 235 $edit_by = Fns::page_edit_with( $post_id );
203 236 echo esc_html( ucfirst( $edit_by ) );
204 237 break;
205 238 case 'set_default':
206 - $is_set_default = absint( BuilderFns::builder_page_id_by_type( $type ) );
239 + $is_set_default = absint( BuilderFns::builder_page_id_by_type( $template_type ) );
207 240 $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';
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;
215 270 }
216 - } elseif ( 'archive' === $type ) {
217 - $categories_name = apply_filters( 'rtsb/archive/page/builder/selected/categories', [], $post_id );
271 + } elseif ( 'archive' === $template_type ) {
272 + $categories_name = apply_filters( 'rtsb/template/builder/selected/categories', [], $post_id, $template_type );
218 273 $set_default = BuilderFns::get_specific_category_as_default( $post_id );
219 274 if ( ! empty( $categories_name ) && $set_default ) {
220 275 $is_set_default = $post_id;
221 276 $page_type_for = 'template-' . $post_id . '-specific-category';
@@ -223,10 +278,10 @@
223 278 }
224 279 ?>
225 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' ); ?>">
226 281 <label class="rtsb-switch">
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>
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>
229 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' : '' ); ?> >
230 285 <span class="rtsb-slider rtsb-round ">
231 286 <span class="rtsb-loader"></span>
232 287 </span>
@@ -281,22 +336,23 @@
281 336
282 337 /**
283 338 * Manage Template filter by template type
284 339 *
285 - * @param \WP_Query $query WordPress main query.
340 + * @param WP_Query $query WordPress main query.
286 341 *
287 342 * @return void
288 343 */
289 - public function query_filter( \WP_Query $query ) {
344 + public function query_filter( WP_Query $query ) {
290 345
291 346 if ( ! is_admin() || ! $this->is_current_screen() || ! empty( $query->query_vars['meta_key'] ) ) {
292 347 return;
293 348 }
349 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended
294 350 $type = isset( $_GET['template_type'] ) ? sanitize_key( $_GET['template_type'] ) : '';
295 351
296 352 if ( '' != $type && 'all' != $type ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
297 353 $query->query_vars['meta_key'] = BuilderFns::template_type_meta_key(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
298 - $query->query_vars['meta_value'] = $type;
354 + $query->query_vars['meta_value'] = $type; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
299 355 $query->query_vars['meta_compare'] = '=';
300 356 }
301 357 }
302 358
@@ -308,9 +364,9 @@
308 364 * @return string
309 365 */
310 366 public function builder_template( $template ) {
311 367 $builder_page_id = BuilderFns::is_builder_preview() ? get_the_ID() : BuilderFns::builder_page_id_by_page();
312 - if ( $builder_page_id ) {
368 + if ( defined( 'ELEMENTOR_VERSION' ) && $builder_page_id ) { // Elementor Check.
313 369 $page_template = get_post_meta( $builder_page_id, '_wp_page_template', true );
314 370 $new_template = RTSB_ABSPATH . 'page-templates/builder-template.php';
315 371 if ( 'elementor_canvas' === $page_template ) {
316 372 $new_template = RTSB_ABSPATH . 'page-templates/elementor-canvas.php';
@@ -325,8 +381,25 @@
325 381 return $template;
326 382 }
327 383
328 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 + /**
329 402 * Add/Remove edit link in dashboard.
330 403 *
331 404 * Add or remove an edit link to the post/page action links on the post/pages list table.
332 405 *
@@ -341,20 +414,13 @@
341 414 public function filter_post_row_actions( $actions ) {
342 415 if ( $this->is_current_screen() ) {
343 416 // unset( $actions['view'] );
344 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 + }
345 422 }
346 423
347 424 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 - }
359 425 }
360 426 }