PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 3.2.6
ShopBuilder – WooCommerce Builder For Elementor v3.2.6
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 +7 -233 3.4.23.2.6 View file →
@@ -34,11 +34,9 @@
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 42 // Add filter for search.
@@ -76,9 +74,9 @@
76 74 [ 'post_content' => '' ],
77 75 [ 'ID' => $post_ID ]
78 76 );
79 77 // Clear cache so changes reflect properly.
80 - clean_post_cache( $post_ID );
78 + clean_post_cache( $post_ID );
81 79 }
82 80
83 81 /**
84 82 * Public function add_filter.
@@ -93,10 +91,10 @@
93 91 if ( BuilderFns::$post_type_tb != $typenow ) {
94 92 return;
95 93 }
96 94 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
97 - $selected = isset( $_GET['type'] ) ? sanitize_key( $_GET['type'] ) : '';
98 - $builder_page_types = BuilderFns::builder_page_types();
95 + $selected = isset( $_GET['type'] ) ? sanitize_key( $_GET['type'] ) : '';
96 + $builder_page_types = BuilderFns::builder_page_types();
99 97 ?>
100 98 <select name="template_type" id="type">
101 99 <option value="all" <?php selected( 'all', $selected ); ?>><?php esc_html_e( 'Template Type ', 'shopbuilder' ); ?></option>
102 100 <?php foreach ( $builder_page_types as $key => $value ) { ?>
@@ -229,9 +227,8 @@
229 227
230 228 switch ( $column ) {
231 229 case 'type':
232 230 $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 231 Fns::print_html( apply_filters( 'rtsb/columns/template/types/text', $the_type, $template_type, $post_id ) );
235 232 break;
236 233 case 'edit_with':
237 234 $edit_by = Fns::page_edit_with( $post_id );
@@ -237,20 +234,11 @@
237 234 $edit_by = Fns::page_edit_with( $post_id );
238 235 echo esc_html( ucfirst( $edit_by ) );
239 236 break;
240 237 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;
238 + $is_set_default = absint( BuilderFns::builder_page_id_by_type( $template_type ) );
239 + $is_published = 'publish' === get_post_status( $post_id );
240 + $page_type_for = $template_type;
253 241 if ( 'product' === $template_type ) {
254 242 $product_page_for = get_post_meta( $post_id, '_is_product_page_template_for', true );
255 243 switch ( $product_page_for ) {
256 244 case 'specific_products':
@@ -278,16 +266,8 @@
278 266 if ( $pp_tag_set_default ) {
279 267 $is_set_default = $post_id;
280 268 }
281 269 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 270 default:
291 271 break;
292 272 }
293 273 } elseif ( 'archive' === $template_type ) {
@@ -304,11 +284,8 @@
304 284 if ( ! $set_default && $is_set_default === $post_id ) {
305 285 $is_set_default = '';
306 286 }
307 287 }
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 288 ?>
312 289 <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 290 <label class="rtsb-switch">
314 291 <?php do_action( 'rtsb/set/default/column/extra/field', $post_id, $template_type, $is_set_default, $is_published ); ?>
@@ -321,211 +298,8 @@
321 298 </span>
322 299 <?php
323 300 break;
324 301 }
325 - }
326 -
327 - /**
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 302 }
529 303
530 304 /**
531 305 * Register sortable columns