PluginProbe ʕ •ᴥ•ʔ
WooCommerce / 11.0.0
WooCommerce v11.0.0
11.1.0-rc.2 11.1.0-rc.1 11.1.0-beta.2 11.1.0-beta.1 11.0.1 11.0.0 11.0.0-rc.3 11.0.0-rc.2 11.0.0-rc.1 11.0.0-beta.2 11.0.0-beta.1 10.9.4 10.9.3 10.9.2 10.9.1 10.9.0 10.9.0-rc.1 10.9.0-beta.2 10.9.0-beta.1 10.8.1 10.8.0 10.8.0-rc.1 10.8.0-beta.2 10.8.0-beta.1 7.8.0-beta.1 7.8.0-beta.2 7.8.0-rc.1 7.8.0-rc.2 7.8.1 7.8.2 7.8.3 7.8.4 7.9.0 7.9.0-beta.1 7.9.0-beta.2 7.9.0-rc.2 7.9.0-rc.3 7.9.1 7.9.2 8.0.0 8.0.0-beta.1 8.0.0-beta.2 8.0.0-rc.1 8.0.0-rc.2 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.1.0 8.1.0-beta.1 8.1.0-rc.1 8.1.0-rc.2 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 8.2.0-beta.1 8.2.0-rc.1 8.2.0-rc.2 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.3.0 8.3.0-beta.1 8.3.0-rc.1 8.3.0-rc.2 8.3.1 8.3.2 8.3.3 8.3.4 8.4.0 8.4.0-beta.1 8.4.0-rc.1 8.4.1 8.4.2 8.4.3 8.5.0 8.5.0-beta.1 8.5.0-rc.1 8.5.1 8.5.2 8.5.3 8.5.4 8.5.5 8.6.0 8.6.0-beta.1 8.6.0-rc.1 8.6.1 8.6.2 8.6.3 8.6.4 8.7.0 8.7.0-beta.1 8.7.0-beta.2 8.7.0-rc.1 8.7.1 8.7.2 8.7.3 8.8.0 8.8.0-beta.1 8.8.0-rc.1 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.8.6 8.8.7 8.9.0 8.9.0-beta.1 8.9.0-rc.1 8.9.1 8.9.2 8.9.3 8.9.4 8.9.5 9.0.0 9.0.0-beta.1 9.0.0-beta.2 9.0.0-rc.1 9.0.1 9.0.2 9.0.3 9.0.4 9.1.0 9.1.0-beta.1 9.1.0-rc.1 9.1.1 9.1.2 9.1.3 9.1.4 9.1.5 9.1.6 9.2.0 9.2.0-beta.1 9.2.0-rc.1 9.2.1 9.2.2 9.2.3 9.2.4 9.2.5 9.3.0 9.3.0-beta.1 9.3.0-rc.1 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.3.6 9.4.0 9.4.0-beta.1 9.4.0-beta.2 9.4.0-rc.1 9.4.0-rc.2 9.4.0-rc.3 9.4.0-rc.4 9.4.1 9.4.2 9.4.3 9.4.4 9.4.5 9.5.0 9.5.0-beta.1 9.5.0-beta.2 9.5.0-rc.1 9.5.1 9.5.2 9.5.3 9.5.4 9.6.0 9.6.0-beta.1 9.6.0-beta.2 9.6.0-rc.1 9.6.1 9.6.2 9.6.3 9.6.4 9.7.0 9.7.0-beta.1 9.7.0-rc.1 9.7.1 9.7.2 9.7.3 9.8.0 9.8.0-beta.1 9.8.0-rc.1 9.8.1 9.8.2 9.8.3 9.8.4 9.8.5 9.8.6 9.8.7 9.9.0 9.9.0-beta.1 9.9.0-rc.1 9.9.1 9.9.2 9.9.3 9.9.4 9.9.5 9.9.6 9.9.7 3.7.3 7.1.2 3.8.0 7.2.0 3.8.0-beta.1 7.2.0-beta.1 3.8.0-rc.1 7.2.0-beta.2 3.8.0-rc.2 7.2.0-rc.1 3.8.1 7.2.0-rc.2 3.8.2 7.2.1 3.8.3 7.2.2 3.9.0 7.2.3 3.9.0-beta.1 7.2.4 3.9.0-beta.2 7.3.0 3.9.0-rc.1 7.3.0-beta.1 3.9.0-rc.2 7.3.0-beta.2 3.9.0-rc.3 7.3.0-rc.1 3.9.0-rc.4 7.3.0-rc.2 3.9.1 7.3.1 3.9.2 7.4.0 3.9.3 7.4.0-beta.1 3.9.4 7.4.0-beta.2 3.9.5 7.4.0-rc.1 4.0.0 7.4.0-rc.2 4.0.0-beta.1 7.4.1 4.0.0-rc.1 7.4.2 4.0.0-rc.2 7.5.0 4.0.1 7.5.0-beta.1 4.0.2 7.5.0-beta.2 4.0.3 7.5.0-rc.1 4.0.4 7.5.1 4.1.0 7.5.2 4.1.0-beta.1 7.6.0 4.1.0-beta.2 7.6.0-beta.1 4.1.0-rc.1 7.6.0-beta.2 4.1.0-rc.2 7.6.0-rc.1 4.1.1 7.6.0-rc.2 4.1.2 7.6.0-rc.3 4.1.3 7.6.1 4.1.4 7.6.2 4.2.0 7.7.0 4.2.0-RC.1 7.7.0-beta.1 4.2.0-RC.2 7.7.0-beta.2 4.2.0-beta.1 7.7.0-rc.1 4.2.1 7.7.1 4.2.2 7.7.2 4.2.3 7.7.3 4.2.4 7.8.0 4.2.5 4.3.0 4.3.0-beta.1 4.3.0-rc.1 4.3.0-rc.2 4.3.0-rc.3 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 4.4.0 4.4.0-beta.1 4.4.0-rc.1 4.4.1 4.4.2 4.4.3 4.4.4 4.5.0 4.5.0-beta.1 4.5.0-rc.1 4.5.0-rc.3 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.6.0-beta.1 4.6.0-rc.1 4.6.1 4.6.2 4.6.3 4.6.4 4.6.5 4.7.0 4.7.0-beta.1 4.7.0-beta.2 4.7.0-rc.1 4.7.1 4.7.1-beta.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.0-beta.1 4.8.0-rc.1 4.8.0-rc.2 4.8.1 4.8.2 4.8.3 4.9.0 4.9.0-beta.1 4.9.0-rc.1 4.9.0-rc.2 4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 5.0.0 5.0.0-beta.1 5.0.0-beta.2 5.0.0-rc.1 5.0.0-rc.2 5.0.0-rc.3 5.0.1 5.0.2 5.0.3 5.1.0 5.1.0-beta.1 5.1.0-rc.1 trunk 5.1.1 10.0.0 5.1.2 10.0.0-rc.1 5.1.3 10.0.0-rc.2 5.2.0 10.0.1 5.2.0-beta.1 10.0.2 5.2.0-rc.1 10.0.3 5.2.0-rc.2 10.0.4 5.2.1 10.0.5 5.2.2 10.0.6 5.2.3 10.1.0 5.2.4 10.1.0-rc.1 5.2.5 10.1.0-rc.2 5.3.0 10.1.0-rc.3 5.3.0-beta.1 10.1.0-rc.4 5.3.0-rc.1 10.1.1 5.3.0-rc.2 10.1.2 5.3.1 10.1.3 5.3.2 10.1.4 5.3.3 10.2.0 5.4.0 10.2.0-beta.1 5.4.0-beta.1 10.2.0-beta.2 5.4.0-rc.1 10.2.0-rc.1 5.4.1 10.2.1 5.4.2 10.2.2 5.4.3 10.2.3 5.4.4 10.2.4 5.4.5 10.3.0 5.5.0 10.3.0-beta.1 5.5.0-beta.1 10.3.0-beta.2 5.5.0-rc.1 10.3.0-rc.1 5.5.0-rc.2 10.3.0-rc.2 5.5.1 10.3.1 5.5.2 10.3.2 5.5.3 10.3.3 5.5.4 10.3.4 5.5.5 10.3.5 5.6.0 10.3.6 5.6.0-beta.1 10.3.7 5.6.0-rc.1 10.3.8 5.6.0-rc.2 10.4.0 5.6.1 10.4.0-beta.1 5.6.2 10.4.0-beta.2 5.6.3 10.4.0-rc.1 5.7.0 10.4.1 5.7.0-beta.1 10.4.2 5.7.0-rc.1 10.4.3 5.7.1 10.4.4 5.7.2 10.5.0 5.7.3 10.5.0-beta.1 5.8.0 10.5.0-beta.2 5.8.0-beta.1 10.5.0-rc.1 5.8.0-beta.2 10.5.0-rc.2 5.8.0-rc.1 10.5.0-rc.3 5.8.1 10.5.1 5.8.2 10.5.2 5.9.0 10.5.3 5.9.0-beta.1 10.6.0 5.9.0-rc.1 10.6.0-beta.1 5.9.0-rc.2 10.6.0-beta.2 5.9.1 10.6.0-rc.1 5.9.2 10.6.1 6.0.0 10.6.2 6.0.0-beta.1 10.7.0 6.0.0-rc.1 10.7.0-beta.1 6.0.1 10.7.0-beta.2 6.0.2 10.7.0-rc.1 6.1.0 3.0.0 6.1.0-beta.1 3.0.1 6.1.0-rc.1 3.0.2 6.1.0-rc.2 3.0.3 6.1.1 3.0.4 6.1.2 3.0.5 6.1.3 3.0.6 6.2.0 3.0.7 6.2.0-beta.1 3.0.8 6.2.0-rc.1 3.0.9 6.2.0-rc.2 3.1.0 6.2.1 3.1.1 6.2.2 3.1.2 6.2.3 3.2.0 6.3.0 3.2.1 6.3.0-beta.1 3.2.2 6.3.0-rc.1 3.2.3 6.3.0-rc.2 3.2.4 6.3.1 3.2.5 6.3.2 3.2.6 6.4.0 3.3.0 6.4.0-beta.1 3.3.1 6.4.0-rc.1 3.3.2 6.4.1 3.3.2-rc.1 6.4.2 3.3.3 6.5.0 3.3.4 6.5.0-beta.1 3.3.5 6.5.0-rc.1 3.3.6 6.5.0-rc.2 3.4.0 6.5.1 3.4.0-beta.1 6.5.2 3.4.0-rc.2 6.6.0 3.4.1 6.6.0-beta.1 3.4.2 6.6.0-rc.1 3.4.3 6.6.0-rc.2 3.4.4 6.6.1 3.4.5 6.6.2 3.4.6 6.7.0 3.4.7 6.7.0-beta.1 3.4.8 6.7.0-beta.2 3.5.0 6.7.0-rc.1 3.5.0-beta.1 6.7.1 3.5.0-rc.1 6.8.0 3.5.0-rc.2 6.8.0-beta.1 3.5.1 6.8.0-beta.2 3.5.10 6.8.0-rc.1 3.5.2 6.8.1 3.5.3 6.8.2 3.5.4 6.8.3 3.5.5 6.9.0 3.5.6 6.9.0-beta.1 3.5.7 6.9.0-beta.2 3.5.8 6.9.0-rc.1 3.5.9 6.9.1 3.6.0 6.9.2 3.6.0-beta.1 6.9.3 3.6.0-rc.1 6.9.4 3.6.0-rc.2 6.9.5 3.6.0-rc.3 7.0.0 3.6.1 7.0.0-beta.1 3.6.2 7.0.0-beta.2 3.6.3 7.0.0-beta.3 3.6.4 7.0.0-rc.1 3.6.5 7.0.0-rc.2 3.6.6 7.0.1 3.6.7 7.0.2 3.7.0 7.1.0 3.7.0-beta.1 7.1.0-beta.1 3.7.0-rc.1 7.1.0-beta.2 3.7.0-rc.2 7.1.0-rc.1 3.7.1 7.1.0-rc.2 3.7.2 7.1.1
woocommerce / src / Blocks / BlockTypes / Cart.php
woocommerce / src / Blocks / BlockTypes Last commit date
Accordion 1 year ago AddToCartWithOptions 1 month ago OrderConfirmation 3 months ago ProductCollection 1 month ago Reviews 3 months ago AbstractBlock.php 1 month ago AbstractDynamicBlock.php 2 years ago AbstractInnerBlock.php 1 year ago AbstractProductGrid.php 5 months ago ActiveFilters.php 2 years ago AddToCartForm.php 2 months ago AddToWishlistButton.php 2 months ago AllProducts.php 1 month ago AllReviews.php 2 years ago AtomicBlock.php 2 years ago AttributeFilter.php 1 year ago Breadcrumbs.php 1 month ago Cart.php 1 month ago CartAcceptedPaymentMethodsBlock.php 2 years ago CartCrossSellsBlock.php 2 years ago CartCrossSellsProductsBlock.php 2 years ago CartExpressPaymentBlock.php 1 year ago CartItemsBlock.php 2 years ago CartLineItemsBlock.php 2 years ago CartLink.php 3 months ago CartOrderSummaryBlock.php 2 years ago CartOrderSummaryCouponFormBlock.php 2 years ago CartOrderSummaryDiscountBlock.php 2 years ago CartOrderSummaryFeeBlock.php 2 years ago CartOrderSummaryHeadingBlock.php 2 years ago CartOrderSummaryShippingBlock.php 2 years ago CartOrderSummarySubtotalBlock.php 2 years ago CartOrderSummaryTaxesBlock.php 2 years ago CartOrderSummaryTotalsBlock.php 2 years ago CartTotalsBlock.php 2 years ago CatalogSorting.php 2 months ago CategoryDescription.php 3 months ago CategoryTitle.php 3 months ago Checkout.php 1 month ago CheckoutActionsBlock.php 1 year ago CheckoutAdditionalInformationBlock.php 2 years ago CheckoutBillingAddressBlock.php 2 years ago CheckoutContactInformationBlock.php 2 years ago CheckoutExpressPaymentBlock.php 10 months ago CheckoutFieldsBlock.php 2 years ago CheckoutOrderNoteBlock.php 2 years ago CheckoutOrderSummaryBlock.php 2 years ago CheckoutOrderSummaryCartItemsBlock.php 2 years ago CheckoutOrderSummaryCouponFormBlock.php 2 years ago CheckoutOrderSummaryDiscountBlock.php 2 years ago CheckoutOrderSummaryFeeBlock.php 2 years ago CheckoutOrderSummaryShippingBlock.php 2 years ago CheckoutOrderSummarySubtotalBlock.php 2 years ago CheckoutOrderSummaryTaxesBlock.php 2 years ago CheckoutOrderSummaryTotalsBlock.php 2 years ago CheckoutPaymentBlock.php 2 years ago CheckoutPickupOptionsBlock.php 2 years ago CheckoutShippingAddressBlock.php 2 years ago CheckoutShippingMethodBlock.php 2 years ago CheckoutShippingMethodsBlock.php 2 years ago CheckoutTermsBlock.php 2 years ago CheckoutTotalsBlock.php 2 years ago ClassicShortcode.php 1 year ago ClassicTemplate.php 6 months ago ComingSoon.php 1 year ago CouponCode.php 3 months ago CustomerAccount.php 5 months ago Dropdown.php 1 month ago EmailContent.php 7 months ago EmptyCartBlock.php 2 years ago EmptyMiniCartContentsBlock.php 1 year ago EnableBlockJsonAssetsTrait.php 1 year ago FeaturedCategory.php 9 months ago FeaturedItem.php 9 months ago FeaturedProduct.php 9 months ago FilledCartBlock.php 2 years ago FilledMiniCartContentsBlock.php 6 months ago FilterWrapper.php 2 years ago HandpickedProducts.php 1 year ago MiniCart.php 1 month ago MiniCartCartButtonBlock.php 1 year ago MiniCartCheckoutButtonBlock.php 1 year ago MiniCartContents.php 5 months ago MiniCartFooterBlock.php 1 month ago MiniCartItemsBlock.php 1 year ago MiniCartProductsTableBlock.php 1 month ago MiniCartShoppingButtonBlock.php 10 months ago MiniCartTitleBlock.php 1 year ago MiniCartTitleItemsCounterBlock.php 1 year ago MiniCartTitleLabelBlock.php 1 year ago NextPreviousButtons.php 7 months ago PageContentWrapper.php 2 years ago PaymentMethodIcons.php 1 year ago PriceFilter.php 1 year ago ProceedToCheckoutBlock.php 2 years ago ProductAverageRating.php 1 year ago ProductBestSellers.php 2 years ago ProductButton.php 1 month ago ProductCategories.php 2 months ago ProductCategory.php 2 years ago ProductDescription.php 10 months ago ProductDetails.php 7 months ago ProductFilterActive.php 2 months ago ProductFilterAttribute.php 1 month ago ProductFilterCheckboxList.php 2 months ago ProductFilterChips.php 2 months ago ProductFilterClearButton.php 2 months ago ProductFilterPrice.php 2 months ago ProductFilterPriceSlider.php 2 months ago ProductFilterRating.php 2 months ago ProductFilterRemovableChips.php 2 months ago ProductFilterStatus.php 1 month ago ProductFilterTaxonomy.php 1 month ago ProductFilters.php 1 month ago ProductGallery.php 2 months ago ProductGalleryLargeImage.php 2 months ago ProductGalleryThumbnails.php 2 months ago ProductImage.php 1 month ago ProductImageGallery.php 9 months ago ProductMeta.php 2 years ago ProductNew.php 2 years ago ProductOnSale.php 2 years ago ProductPrice.php 3 months ago ProductQuery.php 1 month ago ProductRating.php 1 year ago ProductRatingCounter.php 1 year ago ProductRatingStars.php 1 year ago ProductResultsCount.php 3 months ago ProductSKU.php 3 months ago ProductSaleBadge.php 1 year ago ProductSearch.php 1 year ago ProductSpecifications.php 3 months ago ProductStockIndicator.php 3 months ago ProductSummary.php 9 months ago ProductTag.php 2 years ago ProductTemplate.php 1 month ago ProductTitle.php 1 year ago ProductTopRated.php 2 years ago ProductsByAttribute.php 2 years ago RatingFilter.php 2 years ago RelatedProducts.php 5 months ago ReviewsByCategory.php 2 years ago ReviewsByProduct.php 2 years ago SavedForLater.php 2 months ago SingleProduct.php 3 months ago StockFilter.php 2 years ago StoreNotices.php 1 year ago Wishlist.php 2 months ago
Cart.php
349 lines
1 <?php
2 namespace Automattic\WooCommerce\Blocks\BlockTypes;
3
4 use Automattic\WooCommerce\Blocks\Utils\CartCheckoutUtils;
5 use Automattic\WooCommerce\Enums\TaxDisplayMode;
6
7 /**
8 * Cart class.
9 *
10 * @internal
11 */
12 class Cart extends AbstractBlock {
13 /**
14 * Block name.
15 *
16 * @var string
17 */
18 protected $block_name = 'cart';
19
20 /**
21 * Chunks build folder.
22 *
23 * @var string
24 */
25 protected $chunks_folder = 'cart-blocks';
26
27 /**
28 * Initialize this block type.
29 *
30 * - Hook into WP lifecycle.
31 * - Register the block with WordPress.
32 */
33 protected function initialize() {
34 parent::initialize();
35 add_action( 'wp_loaded', array( $this, 'register_patterns' ) );
36 add_action( 'wp', array( $this, 'disable_wp_emoji' ) );
37 }
38
39 /**
40 * Remove WordPress emoji detection script on pages containing this block.
41 *
42 * The wp-emoji MutationObserver converts emoji text nodes to <img> elements
43 * when React hydrates or re-renders, corrupting the DOM tree and crashing the block.
44 * The wp-exclude-emoji class on the wrapper only prevents the initial parse, not the
45 * MutationObserver, so the script must be removed entirely.
46 *
47 * @since 10.8.0
48 *
49 * @return void
50 */
51 public function disable_wp_emoji() {
52 if ( has_block( $this->get_full_block_name() ) ) {
53 remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
54 remove_action( 'wp_print_styles', 'print_emoji_styles' );
55 }
56 }
57
58 /**
59 * Dequeues the scripts added by WC Core to the Cart page.
60 *
61 * @return void
62 */
63 public function dequeue_woocommerce_core_scripts() {
64 wp_dequeue_script( 'wc-cart' );
65 wp_dequeue_script( 'wc-password-strength-meter' );
66 wp_dequeue_script( 'selectWoo' );
67 wp_dequeue_style( 'select2' );
68 }
69
70 /**
71 * Register block pattern for Empty Cart Message to make it translatable.
72 */
73 public function register_patterns() {
74 $shop_permalink = wc_get_page_permalink( 'shop' );
75
76 register_block_pattern(
77 'woocommerce/cart-heading',
78 array(
79 'title' => '',
80 'inserter' => false,
81 'content' => '<!-- wp:heading {"align":"wide", "level":1} --><h1 class="wp-block-heading alignwide">' . esc_html__( 'Cart', 'woocommerce' ) . '</h1><!-- /wp:heading -->',
82 )
83 );
84 register_block_pattern(
85 'woocommerce/cart-cross-sells-message',
86 array(
87 'title' => '',
88 'inserter' => false,
89 'content' => '<!-- wp:heading {"fontSize":"large"} --><h2 class="wp-block-heading has-large-font-size">' . esc_html__( 'You may be interested in…', 'woocommerce' ) . '</h2><!-- /wp:heading -->',
90 )
91 );
92 register_block_pattern(
93 'woocommerce/cart-empty-message',
94 array(
95 'title' => '',
96 'inserter' => false,
97 'content' => '
98 <!-- wp:heading {"textAlign":"center","className":"with-empty-cart-icon wc-block-cart__empty-cart__title"} --><h2 class="wp-block-heading has-text-align-center with-empty-cart-icon wc-block-cart__empty-cart__title">' . esc_html__( 'Your cart is currently empty!', 'woocommerce' ) . '</h2><!-- /wp:heading -->
99 <!-- wp:paragraph {"align":"center"} --><p class="has-text-align-center"><a href="' . esc_attr( esc_url( $shop_permalink ) ) . '">' . esc_html__( 'Browse store', 'woocommerce' ) . '</a></p><!-- /wp:paragraph -->
100 ',
101 )
102 );
103 register_block_pattern(
104 'woocommerce/cart-new-in-store-message',
105 array(
106 'title' => '',
107 'inserter' => false,
108 'content' => '<!-- wp:heading {"textAlign":"center"} --><h2 class="wp-block-heading has-text-align-center">' . esc_html__( 'New in store', 'woocommerce' ) . '</h2><!-- /wp:heading -->',
109 )
110 );
111 }
112
113 /**
114 * Get the editor script handle for this block type.
115 *
116 * @param string $key Data to get, or default to everything.
117 * @return array|string;
118 */
119 protected function get_block_type_editor_script( $key = null ) {
120 $script = [
121 'handle' => 'wc-' . $this->block_name . '-block',
122 'path' => $this->asset_api->get_block_asset_build_path( $this->block_name ),
123 'dependencies' => [ 'wc-blocks' ],
124 ];
125 return $key ? $script[ $key ] : $script;
126 }
127
128 /**
129 * Get the frontend script handle for this block type.
130 *
131 * @see $this->register_block_type()
132 * @param string $key Data to get, or default to everything.
133 * @return array|string
134 */
135 protected function get_block_type_script( $key = null ) {
136 $script = [
137 'handle' => 'wc-' . $this->block_name . '-block-frontend',
138 'path' => $this->asset_api->get_block_asset_build_path( $this->block_name . '-frontend' ),
139 'dependencies' => [],
140 ];
141 return $key ? $script[ $key ] : $script;
142 }
143
144 /**
145 * Get the frontend style handle for this block type.
146 *
147 * @return string[]
148 */
149 protected function get_block_type_style() {
150 return array_merge( parent::get_block_type_style(), [ 'wc-blocks-packages-style' ] );
151 }
152
153 /**
154 * Enqueue frontend assets for this block, just in time for rendering.
155 *
156 * @param array $attributes Any attributes that currently are available from the block.
157 * @param string $content The block content.
158 * @param WP_Block $block The block object.
159 */
160 protected function enqueue_assets( array $attributes, $content, $block ) {
161 /**
162 * Fires before cart block scripts are enqueued.
163 *
164 * @since 2.6.0
165 */
166 do_action( 'woocommerce_blocks_enqueue_cart_block_scripts_before' );
167 parent::enqueue_assets( $attributes, $content, $block );
168 /**
169 * Fires after cart block scripts are enqueued.
170 *
171 * @since 2.6.0
172 */
173 do_action( 'woocommerce_blocks_enqueue_cart_block_scripts_after' );
174 }
175
176 /**
177 * Append frontend scripts when rendering the Cart block.
178 *
179 * @param array $attributes Block attributes.
180 * @param string $content Block content.
181 * @param WP_Block $block Block instance.
182 * @return string Rendered block type output.
183 */
184 protected function render( $attributes, $content, $block ) {
185 // Dequeue the core scripts when rendering this block.
186 add_action( 'wp_enqueue_scripts', array( $this, 'dequeue_woocommerce_core_scripts' ), 20 );
187
188 /**
189 * We need to check if $content has any templates from prior iterations of the block, in order to update to the latest iteration.
190 * We test the iteration version by searching for new blocks brought in by it.
191 * The blocks used for testing should be always available in the block (not removable by the user).
192 */
193
194 $regex_for_filled_cart_block = '/<div[^<]*?data-block-name="woocommerce\/filled-cart-block"[^>]*?>/mi';
195 // Filled Cart block was added in i2, so we search for it to see if we have a Cart i1 template.
196 $has_i1_template = ! preg_match( $regex_for_filled_cart_block, $content );
197
198 if ( $has_i1_template ) {
199 /**
200 * This fallback structure needs to match the defaultTemplate variables defined in the block's edit.tsx files,
201 * starting from the parent block and going down each inner block, in the order the blocks were registered.
202 */
203 $inner_blocks_html = '$0
204 <div data-block-name="woocommerce/filled-cart-block" class="wp-block-woocommerce-filled-cart-block">
205 <div data-block-name="woocommerce/cart-items-block" class="wp-block-woocommerce-cart-items-block">
206 <div data-block-name="woocommerce/cart-line-items-block" class="wp-block-woocommerce-cart-line-items-block"></div>
207 </div>
208 <div data-block-name="woocommerce/cart-totals-block" class="wp-block-woocommerce-cart-totals-block">
209 <div data-block-name="woocommerce/cart-order-summary-block" class="wp-block-woocommerce-cart-order-summary-block"></div>
210 <div data-block-name="woocommerce/cart-express-payment-block" class="wp-block-woocommerce-cart-express-payment-block"></div>
211 <div data-block-name="woocommerce/proceed-to-checkout-block" class="wp-block-woocommerce-proceed-to-checkout-block"></div>
212 <div data-block-name="woocommerce/cart-accepted-payment-methods-block" class="wp-block-woocommerce-cart-accepted-payment-methods-block"></div>
213 </div>
214 </div>
215 <div data-block-name="woocommerce/empty-cart-block" class="wp-block-woocommerce-empty-cart-block">
216 ';
217
218 $content = preg_replace( '/<div class="[a-zA-Z0-9_\- ]*wp-block-woocommerce-cart[a-zA-Z0-9_\- ]*">/mi', $inner_blocks_html, $content );
219 $content = $content . '</div>';
220 }
221
222 /**
223 * Cart i3 added inner blocks for Order summary. We need to add them to Cart i2 templates.
224 * The order needs to match the order in which these blocks were registered.
225 */
226 $order_summary_with_inner_blocks = '$0
227 <div data-block-name="woocommerce/cart-order-summary-heading-block" class="wp-block-woocommerce-cart-order-summary-heading-block"></div>
228 <div data-block-name="woocommerce/cart-order-summary-subtotal-block" class="wp-block-woocommerce-cart-order-summary-subtotal-block"></div>
229 <div data-block-name="woocommerce/cart-order-summary-fee-block" class="wp-block-woocommerce-cart-order-summary-fee-block"></div>
230 <div data-block-name="woocommerce/cart-order-summary-discount-block" class="wp-block-woocommerce-cart-order-summary-discount-block"></div>
231 <div data-block-name="woocommerce/cart-order-summary-coupon-form-block" class="wp-block-woocommerce-cart-order-summary-coupon-form-block"></div>
232 <div data-block-name="woocommerce/cart-order-summary-shipping-form-block" class="wp-block-woocommerce-cart-order-summary-shipping-block"></div>
233 <div data-block-name="woocommerce/cart-order-summary-taxes-block" class="wp-block-woocommerce-cart-order-summary-taxes-block"></div>
234 ';
235 // Order summary subtotal block was added in i3, so we search for it to see if we have a Cart i2 template.
236 $regex_for_order_summary_subtotal = '/<div[^<]*?data-block-name="woocommerce\/cart-order-summary-subtotal-block"[^>]*?>/mi';
237 $regex_for_order_summary = '/<div[^<]*?data-block-name="woocommerce\/cart-order-summary-block"[^>]*?>/mi';
238 $has_i2_template = ! preg_match( $regex_for_order_summary_subtotal, $content );
239
240 if ( $has_i2_template ) {
241 $content = preg_replace( $regex_for_order_summary, $order_summary_with_inner_blocks, $content );
242 }
243
244 return $content;
245 }
246
247 /**
248 * Extra data passed through from server to client for block.
249 *
250 * @param array $attributes Any attributes that currently are available from the block.
251 * Note, this will be empty in the editor context when the block is
252 * not in the post content on editor load.
253 */
254 protected function enqueue_data( array $attributes = [] ) {
255 parent::enqueue_data( $attributes );
256
257 $this->asset_data_registry->add( 'countryData', CartCheckoutUtils::get_country_data() );
258 $this->asset_data_registry->add( 'displayItemizedTaxes', 'itemized' === get_option( 'woocommerce_tax_total_display' ) );
259 $this->asset_data_registry->add( 'displayCartPricesIncludingTax', TaxDisplayMode::INCLUSIVE === get_option( 'woocommerce_tax_display_cart' ) );
260 $this->asset_data_registry->add( 'taxesEnabled', wc_tax_enabled() );
261 $this->asset_data_registry->add( 'couponsEnabled', wc_coupons_enabled() );
262 $this->asset_data_registry->add( 'shippingEnabled', wc_shipping_enabled() );
263 $this->asset_data_registry->add( 'hasDarkEditorStyleSupport', current_theme_supports( 'dark-editor-style' ) );
264 $this->asset_data_registry->register_page_id( isset( $attributes['checkoutPageId'] ) ? $attributes['checkoutPageId'] : 0 );
265 $this->asset_data_registry->add( 'isBlockTheme', wp_is_block_theme() );
266 $this->asset_data_registry->add( 'shippingMethodsExist', CartCheckoutUtils::shipping_methods_exist() > 0 );
267
268 $is_block_editor = $this->is_block_editor();
269
270 // Check `current_user_can` so we can show notices about incompatible extensions in the front-end to admins too.
271 if ( ( $is_block_editor || current_user_can( 'manage_woocommerce' ) ) && ! $this->asset_data_registry->exists( 'incompatibleExtensions' ) ) {
272 if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) && function_exists( 'get_plugins' ) ) {
273 $declared_extensions = \Automattic\WooCommerce\Utilities\FeaturesUtil::get_compatible_plugins_for_feature( 'cart_checkout_blocks' );
274 $all_plugins = \get_plugins();
275 $incompatible_extensions = array_reduce(
276 $declared_extensions['incompatible'],
277 function ( array $acc, $item ) use ( $all_plugins ) {
278 $plugin = $all_plugins[ $item ] ?? null;
279 $plugin_id = $plugin['TextDomain'] ?? dirname( $item );
280 $plugin_name = $plugin['Name'] ?? $plugin_id;
281 $acc[] = [
282 'id' => $plugin_id,
283 'title' => $plugin_name,
284 ];
285 return $acc;
286 },
287 []
288 );
289 $this->asset_data_registry->add( 'incompatibleExtensions', $incompatible_extensions );
290 }
291 }
292
293 // Hydrate the following data depending on admin or frontend context.
294 if ( ! is_admin() && ! WC()->is_rest_api_request() ) {
295 $this->asset_data_registry->hydrate_api_request( '/wc/store/v1/cart' );
296 }
297
298 /**
299 * Fires after cart block data is registered.
300 *
301 * @since 2.6.0
302 */
303 do_action( 'woocommerce_blocks_cart_enqueue_data' );
304 }
305
306 /**
307 * Register script and style assets for the block type before it is registered.
308 *
309 * This registers the scripts; it does not enqueue them.
310 */
311 protected function register_block_type_assets() {
312 parent::register_block_type_assets();
313 $chunks = $this->get_chunks_paths( $this->chunks_folder );
314 $vendor_chunks = $this->get_chunks_paths( 'vendors--cart-blocks' );
315 $shared_chunks = [];
316 $this->register_chunk_translations( array_merge( $chunks, $vendor_chunks, $shared_chunks ) );
317 }
318
319 /**
320 * Get list of Cart block & its inner-block types.
321 *
322 * @return array;
323 */
324 public static function get_cart_block_types() {
325 return [
326 'Cart',
327 'CartOrderSummaryTaxesBlock',
328 'CartOrderSummarySubtotalBlock',
329 'CartOrderSummaryTotalsBlock',
330 'FilledCartBlock',
331 'EmptyCartBlock',
332 'CartTotalsBlock',
333 'CartItemsBlock',
334 'CartLineItemsBlock',
335 'CartOrderSummaryBlock',
336 'CartExpressPaymentBlock',
337 'ProceedToCheckoutBlock',
338 'CartAcceptedPaymentMethodsBlock',
339 'CartOrderSummaryCouponFormBlock',
340 'CartOrderSummaryDiscountBlock',
341 'CartOrderSummaryFeeBlock',
342 'CartOrderSummaryHeadingBlock',
343 'CartOrderSummaryShippingBlock',
344 'CartCrossSellsBlock',
345 'CartCrossSellsProductsBlock',
346 ];
347 }
348 }
349