PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 3.1.3
ShopBuilder – WooCommerce Builder For Elementor v3.1.3
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 +107 -39 2.1.9 → 3.1.3 View file →
@@ -8,8 +8,9 @@
8 8 namespace RadiusTheme\SB\Controllers\Builder;
9 9
10 10 defined( 'ABSPATH' ) || exit();
11 11
12 +use RadiusTheme\SB\Models\TemplateSettings;
12 13 use WP_Query;
13 14 use RadiusTheme\SB\Helpers\Fns;
14 15 use RadiusTheme\SB\Helpers\BuilderFns;
15 16 use RadiusTheme\SB\Traits\SingletonTrait;
@@ -34,18 +35,50 @@
34 35 add_action( 'manage_' . BuilderFns::$post_type_tb . '_posts_custom_column', [ $this, 'custom_columns' ], 10, 2 );
35 36 add_filter( 'manage_edit-' . BuilderFns::$post_type_tb . '_sortable_columns', [ $this, 'register_sortable_columns' ] );
36 37 add_action( 'pre_get_posts', [ $this, 'sortable_columns_query' ] );
37 38 add_filter( 'template_include', [ $this, 'builder_template' ], 99 );
39 + add_filter( 'template_redirect', [ $this, 'restrict_preview_access' ], 99 );
38 40
39 41 add_filter( 'parse_query', [ $this, 'query_filter' ] );
40 - // add filter for search.
42 + // Add filter for search.
41 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 + }
42 47
43 - add_action( 'in_admin_header', [ $this, 'remove_all_notices' ], 1000 );
44 -
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 + *
59 + * @return void
60 + */
61 + public function on_save_post( $post_ID, $post ) {
62 + // Only proceed on update and specific post type.
63 + if ( BuilderFns::$post_type_tb !== $post->post_type ) {
64 + return;
65 + }
66 + if ( 'elementor' !== Fns::page_edit_with( $post_ID ) ) {
67 + return;
68 + }
69 + global $wpdb;
70 + // Directly update the post_content to empty.
71 + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
72 + $wpdb->update(
73 + $wpdb->posts,
74 + [ 'post_content' => '' ],
75 + [ 'ID' => $post_ID ]
76 + );
77 + // Clear cache so changes reflect properly.
78 + clean_post_cache( $post_ID );
45 79 }
46 80
47 -
48 81 /**
49 82 * Public function add_filter.
50 83 * Added search filter for type of template
51 84 *
@@ -68,9 +101,8 @@
68 101 <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $key, $selected ); ?>><?php echo esc_html( $value ); ?></option>
69 102 <?php } ?>
70 103 </select>
71 104 <?php
72 -
73 105 }
74 106
75 107 /**
76 108 * Post type function
@@ -130,10 +162,10 @@
130 162 'with_front' => true,
131 163 'feeds' => false,
132 164 ],
133 165 'query_var' => true,
134 - 'publicly_queryable' => apply_filters( 'rtsb/builder/args/publicly_queryable', true ),
135 - 'capability_type' => 'product',
166 + 'publicly_queryable' => true,
167 + // 'capability_type' => 'product', Will Remove this line in the future.
136 168 'show_in_rest' => true,
137 169 'rest_base' => BuilderFns::$post_type_tb,
138 170 ];
139 171
@@ -142,9 +174,8 @@
142 174 register_post_type( BuilderFns::$post_type_tb, $tb_args );
143 175
144 176 // Flash rewrite rules.
145 177 $this->flush_rewrite_rules();
146 -
147 178 }
148 179
149 180 /**
150 181 * Flush rewrite
@@ -188,17 +219,17 @@
188 219 * @param string $post_id Post id.
189 220 *
190 221 * @return void
191 222 */
192 - public function custom_columns( $column, $post_id ) {
193 - $post_id = absint( $post_id );
194 - $types = BuilderFns::builder_page_types();
195 - $type = BuilderFns::builder_type( $post_id ) ? BuilderFns::builder_type( $post_id ) : array_key_first( $types );
223 + public function custom_columns( $column, $post_id ) { // phpcs:ignore Generic.Metrics.NestingLevel.TooHigh
224 + $post_id = absint( $post_id );
225 + $types = BuilderFns::builder_page_types();
226 + $template_type = BuilderFns::builder_type( $post_id ) ? BuilderFns::builder_type( $post_id ) : array_key_first( $types );
196 227
197 228 switch ( $column ) {
198 229 case 'type':
199 - $the_type = ! empty( $types[ $type ] ) ? esc_html( ucwords( $types[ $type ] ) ) : '';
200 - Fns::print_html( apply_filters( 'rtsb/columns/template/types/text', $the_type, $type, $post_id ) );
230 + $the_type = ! empty( $types[ $template_type ] ) ? '<b>' . esc_html( ucwords( $types[ $template_type ] ) ) . '</b>' : '';
231 + Fns::print_html( apply_filters( 'rtsb/columns/template/types/text', $the_type, $template_type, $post_id ) );
201 232 break;
202 233 case 'edit_with':
203 234 $edit_by = Fns::page_edit_with( $post_id );
204 235 echo esc_html( ucfirst( $edit_by ) );
@@ -203,31 +234,59 @@
203 234 $edit_by = Fns::page_edit_with( $post_id );
204 235 echo esc_html( ucfirst( $edit_by ) );
205 236 break;
206 237 case 'set_default':
207 - $is_set_default = absint( BuilderFns::builder_page_id_by_type( $type ) );
238 + $is_set_default = absint( BuilderFns::builder_page_id_by_type( $template_type ) );
208 239 $is_published = 'publish' === get_post_status( $post_id );
209 - $page_type_for = $type;
210 - if ( 'product' === $type ) {
211 - $product_ids = apply_filters( 'rtsb/product/page/builder/selected/products', [], $post_id );
212 - $set_default = BuilderFns::get_specific_product_as_default( $post_id );
213 - if ( ! empty( $product_ids ) && $set_default ) {
214 - $is_set_default = $post_id;
215 - $page_type_for = 'template-' . $post_id . '-specific-products';
240 + $page_type_for = $template_type;
241 + if ( 'product' === $template_type ) {
242 + $product_page_for = get_post_meta( $post_id, '_is_product_page_template_for', true );
243 + switch ( $product_page_for ) {
244 + case 'specific_products':
245 + $page_type_for = 'template-' . $post_id . '-specific-products';
246 + $set_default = BuilderFns::get_specific_product_as_default( $post_id );
247 + if ( $set_default ) {
248 + $is_set_default = $post_id;
249 + }
250 + if ( ! $set_default && $is_set_default === $post_id ) {
251 + $is_set_default = '';
252 + }
253 + break;
254 + case 'product_cats':
255 + $page_type_for = 'product-page-template-' . $post_id . '-specific-category';
256 + $set_default_option_name = BuilderFns::option_name_product_page_specific_cat_set_default( $post_id );
257 + $pp_cat_set_default = TemplateSettings::instance()->get_option( $set_default_option_name );
258 + if ( $pp_cat_set_default ) {
259 + $is_set_default = $post_id;
260 + }
261 + break;
262 + case 'product_tags':
263 + $page_type_for = 'product-page-template-' . $post_id . '-specific-tag';
264 + $set_default_option_name = BuilderFns::option_name_product_page_specific_tag_set_default( $post_id );
265 + $pp_tag_set_default = TemplateSettings::instance()->get_option( $set_default_option_name );
266 + if ( $pp_tag_set_default ) {
267 + $is_set_default = $post_id;
268 + }
269 + break;
270 + default:
271 + break;
216 272 }
217 - } elseif ( 'archive' === $type ) {
218 - $categories_name = apply_filters( 'rtsb/archive/page/builder/selected/categories', [], $post_id );
273 + } elseif ( 'archive' === $template_type ) {
274 + $categories_name = apply_filters( 'rtsb/template/builder/selected/categories', [], $post_id, $template_type );
219 275 $set_default = BuilderFns::get_specific_category_as_default( $post_id );
220 276 if ( ! empty( $categories_name ) && $set_default ) {
221 277 $is_set_default = $post_id;
222 278 $page_type_for = 'template-' . $post_id . '-specific-category';
223 279 }
280 + if ( ! $set_default && $is_set_default === $post_id ) {
281 + $is_set_default = '';
282 + }
224 283 }
225 284 ?>
226 285 <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' ); ?>">
227 286 <label class="rtsb-switch">
228 - <?php do_action( 'rtsb/set/default/column/extra/field', $post_id, $type, $is_set_default, $is_published ); ?>
229 - <div class="rtsb_template_type" data-template_type="<?php echo esc_attr( $type ); ?>" style='display:none;'></div>
287 + <?php do_action( 'rtsb/set/default/column/extra/field', $post_id, $template_type, $is_set_default, $is_published ); ?>
288 + <div class="rtsb_template_type" data-template_type="<?php echo esc_attr( $template_type ); ?>" style='display:none;'></div>
230 289 <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' : '' ); ?> >
231 290 <span class="rtsb-slider rtsb-round ">
232 291 <span class="rtsb-loader"></span>
233 292 </span>
@@ -310,9 +369,9 @@
310 369 * @return string
311 370 */
312 371 public function builder_template( $template ) {
313 372 $builder_page_id = BuilderFns::is_builder_preview() ? get_the_ID() : BuilderFns::builder_page_id_by_page();
314 - if ( $builder_page_id ) {
373 + if ( defined( 'ELEMENTOR_VERSION' ) && $builder_page_id ) { // Elementor Check.
315 374 $page_template = get_post_meta( $builder_page_id, '_wp_page_template', true );
316 375 $new_template = RTSB_ABSPATH . 'page-templates/builder-template.php';
317 376 if ( 'elementor_canvas' === $page_template ) {
318 377 $new_template = RTSB_ABSPATH . 'page-templates/elementor-canvas.php';
@@ -327,8 +386,25 @@
327 386 return $template;
328 387 }
329 388
330 389 /**
390 + * Restrict the preview access.
391 + *
392 + * @return void
393 + */
394 + public function restrict_preview_access() {
395 + if ( ! apply_filters( 'rtsb/builder/preview/access', true ) ) {
396 + return;
397 + }
398 +
399 + if ( is_singular( 'rtsb_builder' ) ) {
400 + if ( ! is_user_logged_in() ) {
401 + wp_safe_redirect( home_url() );
402 + }
403 + }
404 + }
405 +
406 + /**
331 407 * Add/Remove edit link in dashboard.
332 408 *
333 409 * Add or remove an edit link to the post/page action links on the post/pages list table.
334 410 *
@@ -341,22 +417,14 @@
341 417 * @return array An updated array of row action links.
342 418 */
343 419 public function filter_post_row_actions( $actions ) {
344 420 if ( $this->is_current_screen() ) {
345 - // unset( $actions['view'] );
346 421 unset( $actions['inline hide-if-no-js'] );
422 +
423 + if ( isset( $actions['view'] ) ) {
424 + $actions['view'] = str_replace( __( 'View', 'shopbuilder' ), __( 'Preview', 'shopbuilder' ), $actions['view'] );
425 + }
347 426 }
348 427
349 428 return $actions;
350 - }
351 -
352 - /**
353 - * Remove admin notices
354 - */
355 - public function remove_all_notices() {
356 - $screen = get_current_screen();
357 - if ( 'edit-rtsb_builder' === $screen->id ) {
358 - remove_all_actions( 'admin_notices' );
359 - remove_all_actions( 'all_admin_notices' );
360 - }
361 429 }
362 430 }