shouldPriceChildItems() ) { return false; } // Only children of per-item-priced containers carry their own real price. Children of // statically priced containers are handled entirely by Mix and Match. return $this->isChildOfPerItemPricedContainer( $cartItem ) ? $state : false; } return $state; } /** * Whether the "Apply tiered pricing inside containers" setting is enabled. * * @return bool */ protected function shouldPriceChildItems(): bool { return $this->getContainer()->getSettings()->get( MixMatchSettings::PRICE_CHILD_ITEMS_KEY, 'no' ) === 'yes'; } /** * Whether a child cart item belongs to a container with per-item pricing. * * @param array $cartItem * * @return bool */ protected function isChildOfPerItemPricedContainer( array $cartItem ): bool { $containerItem = null; if ( function_exists( 'wc_mnm_get_cart_item_container' ) ) { $containerItem = wc_mnm_get_cart_item_container( $cartItem ); } elseif ( isset( $cartItem['mnm_container'], wc()->cart->cart_contents[ $cartItem['mnm_container'] ] ) ) { $containerItem = wc()->cart->cart_contents[ $cartItem['mnm_container'] ]; } $container = is_array( $containerItem ) ? ( $containerItem['data'] ?? null ) : null; if ( ! ( $container instanceof WC_Product ) || ! is_callable( array( $container, 'is_priced_per_product' ) ) ) { return false; } return (bool) $container->is_priced_per_product(); } public function getIconURL(): string { return $this->getContainer()->getFileManager()->locateAsset( 'admin/integrations/mix-match-icon.png' ); } public function getAuthorURL(): string { return 'https://woocommerce.com/products/woocommerce-mix-and-match-products/'; } public function getTitle(): string { return 'Mix&Match for WooCommerce'; } public function getDescription(): string { return __( 'Apply tiered pricing rules correctly to Mix and Match products.', 'tier-pricing-table' ); } public function getSlug(): string { return 'mix-match-for-woocommerce'; } public function getIntegrationCategory(): string { return 'custom_product_types'; } }