Commit 876f9bb3064 for woocommerce

commit 876f9bb3064fc12bc533ea1daf783a6f471baea1
Author: Wesley Rosa <wesleyjrosa@gmail.com>
Date:   Thu Jun 18 13:53:12 2026 -0300

    Add TaxDisplayMode enum class for woocommerce_tax_display option values (#65812)

    Add TaxDisplayMode enum class and adopt it across the codebase

    Introduces src/Enums/TaxDisplayMode.php with INCLUSIVE ('incl') and
    EXCLUSIVE ('excl') constants for the woocommerce_tax_display_shop and
    woocommerce_tax_display_cart option values, and replaces raw string
    literals across the codebase with the enum constants.

    Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

diff --git a/plugins/woocommerce/changelog/add-tax-display-mode-enum b/plugins/woocommerce/changelog/add-tax-display-mode-enum
new file mode 100644
index 00000000000..e46324ce2ed
--- /dev/null
+++ b/plugins/woocommerce/changelog/add-tax-display-mode-enum
@@ -0,0 +1,4 @@
+Significance: minor
+Type: add
+
+Add TaxDisplayMode enum class for woocommerce_tax_display_shop/cart option values and implement it across the codebase.
diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php
index 617e9ad7b1c..e9116bdd302 100644
--- a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php
+++ b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php
@@ -15,6 +15,7 @@ use Automattic\WooCommerce\Enums\OrderStatus;
 use Automattic\WooCommerce\Enums\ProductTaxStatus;
 use Automattic\WooCommerce\Enums\ProductType;
 use Automattic\WooCommerce\Enums\TaxBasedOn;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use Automattic\WooCommerce\Internal\CostOfGoodsSold\CogsAwareTrait;
 use Automattic\WooCommerce\Internal\Customers\SearchService as CustomersSearchService;
 use Automattic\WooCommerce\Internal\Orders\PaymentInfo;
@@ -2428,7 +2429,7 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
 	public function get_formatted_line_subtotal( $item, $tax_display = '' ) {
 		$tax_display = $tax_display ? $tax_display : get_option( 'woocommerce_tax_display_cart' );

-		if ( 'excl' === $tax_display ) {
+		if ( TaxDisplayMode::EXCLUSIVE === $tax_display ) {
 			$ex_tax_label = $this->get_prices_include_tax() ? 1 : 0;

 			$subtotal = wc_price(
@@ -2468,7 +2469,7 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {

 		if ( ! $compound ) {

-			if ( 'incl' === $tax_display ) {
+			if ( TaxDisplayMode::INCLUSIVE === $tax_display ) {
 				$subtotal_taxes = 0;
 				foreach ( $this->get_items() as $item ) {
 					$subtotal_taxes += self::round_line_tax( (float) $item->get_subtotal_tax(), false );
@@ -2478,11 +2479,11 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {

 			$subtotal = wc_price( $subtotal, array( 'currency' => $this->get_currency() ) );

-			if ( 'excl' === $tax_display && $this->get_prices_include_tax() && wc_tax_enabled() ) {
+			if ( TaxDisplayMode::EXCLUSIVE === $tax_display && $this->get_prices_include_tax() && wc_tax_enabled() ) {
 				$subtotal .= ' <small class="tax_label">' . WC()->countries->ex_tax_or_vat() . '</small>';
 			}
 		} else {
-			if ( 'incl' === $tax_display ) {
+			if ( TaxDisplayMode::INCLUSIVE === $tax_display ) {
 				return '';
 			}

@@ -2516,7 +2517,7 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {

 		if ( 0 < abs( (float) $this->get_shipping_total() ) ) {

-			if ( 'excl' === $tax_display ) {
+			if ( TaxDisplayMode::EXCLUSIVE === $tax_display ) {

 				// Show shipping excluding tax.
 				$shipping = wc_price( $this->get_shipping_total(), array( 'currency' => $this->get_currency() ) );
@@ -2561,7 +2562,7 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
 		 *
 		 * @since 2.7.0.
 		 */
-		return apply_filters( 'woocommerce_order_discount_to_display', wc_price( $this->get_total_discount( 'excl' === $tax_display ), array( 'currency' => $this->get_currency() ) ), $this );
+		return apply_filters( 'woocommerce_order_discount_to_display', wc_price( $this->get_total_discount( TaxDisplayMode::EXCLUSIVE === $tax_display ), array( 'currency' => $this->get_currency() ) ), $this );
 	}

 	/**
@@ -2636,7 +2637,7 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
 				$total_rows[ 'fee_' . $fee->get_id() ] = array(
 					'type'  => 'fee',
 					'label' => $fee->get_name() . ':',
-					'value' => wc_price( 'excl' === $tax_display ? (float) $fee->get_total() : (float) $fee->get_total() + (float) $fee->get_total_tax(), array( 'currency' => $this->get_currency() ) ),
+					'value' => wc_price( TaxDisplayMode::EXCLUSIVE === $tax_display ? (float) $fee->get_total() : (float) $fee->get_total() + (float) $fee->get_total_tax(), array( 'currency' => $this->get_currency() ) ),
 				);
 			}
 		}
@@ -2651,7 +2652,7 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
 	 */
 	protected function add_order_item_totals_tax_rows( &$total_rows, $tax_display ) {
 		// Tax for tax exclusive prices.
-		if ( 'excl' === $tax_display && wc_tax_enabled() ) {
+		if ( TaxDisplayMode::EXCLUSIVE === $tax_display && wc_tax_enabled() ) {
 			if ( 'itemized' === get_option( 'woocommerce_tax_total_display' ) ) {
 				foreach ( $this->get_tax_totals() as $code => $tax ) {
 					$total_rows[ sanitize_title( $code ) ] = array(
diff --git a/plugins/woocommerce/includes/admin/settings/views/settings-tax.php b/plugins/woocommerce/includes/admin/settings/views/settings-tax.php
index b1546800ec9..2f14a66e242 100644
--- a/plugins/woocommerce/includes/admin/settings/views/settings-tax.php
+++ b/plugins/woocommerce/includes/admin/settings/views/settings-tax.php
@@ -8,6 +8,7 @@
 defined( 'ABSPATH' ) || exit;

 use Automattic\WooCommerce\Enums\TaxBasedOn;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;

 $settings = array(

@@ -78,24 +79,24 @@ $settings = array(
 	array(
 		'title'   => __( 'Display prices in the shop', 'woocommerce' ),
 		'id'      => 'woocommerce_tax_display_shop',
-		'default' => 'excl',
+		'default' => TaxDisplayMode::EXCLUSIVE,
 		'type'    => 'select',
 		'class'   => 'wc-enhanced-select',
 		'options' => array(
-			'incl' => __( 'Including tax', 'woocommerce' ),
-			'excl' => __( 'Excluding tax', 'woocommerce' ),
+			TaxDisplayMode::INCLUSIVE => __( 'Including tax', 'woocommerce' ),
+			TaxDisplayMode::EXCLUSIVE => __( 'Excluding tax', 'woocommerce' ),
 		),
 	),

 	array(
 		'title'   => __( 'Display prices during cart and checkout', 'woocommerce' ),
 		'id'      => 'woocommerce_tax_display_cart',
-		'default' => 'excl',
+		'default' => TaxDisplayMode::EXCLUSIVE,
 		'type'    => 'select',
 		'class'   => 'wc-enhanced-select',
 		'options' => array(
-			'incl' => __( 'Including tax', 'woocommerce' ),
-			'excl' => __( 'Excluding tax', 'woocommerce' ),
+			TaxDisplayMode::INCLUSIVE => __( 'Including tax', 'woocommerce' ),
+			TaxDisplayMode::EXCLUSIVE => __( 'Excluding tax', 'woocommerce' ),
 		),
 	),

diff --git a/plugins/woocommerce/includes/class-wc-cart.php b/plugins/woocommerce/includes/class-wc-cart.php
index 4e29045e352..84b14cbdc09 100644
--- a/plugins/woocommerce/includes/class-wc-cart.php
+++ b/plugins/woocommerce/includes/class-wc-cart.php
@@ -12,6 +12,7 @@
 use Automattic\WooCommerce\Blocks\Utils\CartCheckoutUtils;
 use Automattic\WooCommerce\Enums\ProductStatus;
 use Automattic\WooCommerce\Enums\ProductType;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use Automattic\WooCommerce\Internal\Tax\TaxRateDataStore;
 use Automattic\WooCommerce\StoreApi\Utilities\LocalPickupUtils;
 use Automattic\WooCommerce\Utilities\DiscountsUtil;
@@ -388,7 +389,14 @@ class WC_Cart extends WC_Legacy_Cart {
 	 * @return bool
 	 */
 	public function display_prices_including_tax() {
-		return apply_filters( 'woocommerce_cart_' . __FUNCTION__, 'incl' === $this->get_tax_price_display_mode() );
+		/**
+		 * Filter whether or not the cart is displaying prices including tax.
+		 *
+		 * @since 3.3.0
+		 *
+		 * @param bool $display_prices_including_tax Whether or not the cart is displaying prices including tax.
+		 */
+		return apply_filters( 'woocommerce_cart_' . __FUNCTION__, TaxDisplayMode::INCLUSIVE === $this->get_tax_price_display_mode() );
 	}

 	/*
@@ -2448,7 +2456,7 @@ class WC_Cart extends WC_Legacy_Cart {
 	 */
 	public function get_tax_price_display_mode() {
 		if ( $this->get_customer() && $this->get_customer()->get_is_vat_exempt() ) {
-			return 'excl';
+			return TaxDisplayMode::EXCLUSIVE;
 		}

 		return get_option( 'woocommerce_tax_display_cart' );
diff --git a/plugins/woocommerce/includes/class-wc-order.php b/plugins/woocommerce/includes/class-wc-order.php
index d8afdd2c389..3b5bca75caf 100644
--- a/plugins/woocommerce/includes/class-wc-order.php
+++ b/plugins/woocommerce/includes/class-wc-order.php
@@ -7,6 +7,7 @@
  */

 use Automattic\WooCommerce\Enums\OrderStatus;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use Automattic\WooCommerce\Utilities\FeaturesUtil;
 use Automattic\WooCommerce\StoreApi\Utilities\LocalPickupUtils;
 use Automattic\WooCommerce\Utilities\NumberUtil;
@@ -222,7 +223,7 @@ class WC_Order extends WC_Abstract_Order {
 		$tax_string      = '';

 		// Tax for inclusive prices.
-		if ( wc_tax_enabled() && 'incl' === $tax_display ) {
+		if ( wc_tax_enabled() && TaxDisplayMode::INCLUSIVE === $tax_display ) {
 			$tax_string_array = array();
 			$tax_totals       = $this->get_tax_totals();

diff --git a/plugins/woocommerce/includes/class-wc-product-grouped.php b/plugins/woocommerce/includes/class-wc-product-grouped.php
index 87558073937..418152756e1 100644
--- a/plugins/woocommerce/includes/class-wc-product-grouped.php
+++ b/plugins/woocommerce/includes/class-wc-product-grouped.php
@@ -9,6 +9,7 @@
  */

 use Automattic\WooCommerce\Enums\ProductType;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;

 defined( 'ABSPATH' ) || exit;

@@ -97,7 +98,7 @@ class WC_Product_Grouped extends WC_Product {

 		foreach ( $children as $child ) {
 			if ( '' !== $child->get_price() ) {
-				$child_prices[] = 'incl' === $tax_display_mode ? wc_get_price_including_tax( $child ) : wc_get_price_excluding_tax( $child );
+				$child_prices[] = TaxDisplayMode::INCLUSIVE === $tax_display_mode ? wc_get_price_including_tax( $child ) : wc_get_price_excluding_tax( $child );
 			}
 		}

diff --git a/plugins/woocommerce/includes/class-wc-query.php b/plugins/woocommerce/includes/class-wc-query.php
index edb899ca8b5..275f070bc00 100644
--- a/plugins/woocommerce/includes/class-wc-query.php
+++ b/plugins/woocommerce/includes/class-wc-query.php
@@ -8,6 +8,7 @@

 use Automattic\WooCommerce\Internal\ProductAttributesLookup\Filterer;
 use Automattic\WooCommerce\Enums\ProductStockStatus;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;

 defined( 'ABSPATH' ) || exit;

@@ -787,7 +788,7 @@ class WC_Query {
 		 * Adjust if the store taxes are not displayed how they are stored.
 		 * Kicks in when prices excluding tax are displayed including tax.
 		 */
-		if ( wc_tax_enabled() && 'incl' === get_option( 'woocommerce_tax_display_shop' ) && ! wc_prices_include_tax() ) {
+		if ( wc_tax_enabled() && TaxDisplayMode::INCLUSIVE === get_option( 'woocommerce_tax_display_shop' ) && ! wc_prices_include_tax() ) {
 			$tax_class = apply_filters( 'woocommerce_price_filter_widget_tax_class', '' ); // Uses standard tax class.
 			$tax_rates = WC_Tax::get_rates( $tax_class );

diff --git a/plugins/woocommerce/includes/class-wc-structured-data.php b/plugins/woocommerce/includes/class-wc-structured-data.php
index d0318c43b58..5e647e1a044 100644
--- a/plugins/woocommerce/includes/class-wc-structured-data.php
+++ b/plugins/woocommerce/includes/class-wc-structured-data.php
@@ -15,6 +15,7 @@
 use Automattic\WooCommerce\Enums\OrderStatus;
 use Automattic\WooCommerce\Enums\ProductType;
 use Automattic\WooCommerce\Enums\ProductStockStatus;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;

 defined( 'ABSPATH' ) || exit;

@@ -247,7 +248,7 @@ class WC_Structured_Data {
 						'validThrough'  => $price_valid_until,
 					);
 					if ( wc_tax_enabled() ) {
-						$unit_price_spec['valueAddedTaxIncluded'] = 'incl' === get_option( 'woocommerce_tax_display_shop' );
+						$unit_price_spec['valueAddedTaxIncluded'] = TaxDisplayMode::INCLUSIVE === get_option( 'woocommerce_tax_display_shop' );
 					}
 					$markup_offer = array(
 						'@type'              => 'Offer',
@@ -283,7 +284,7 @@ class WC_Structured_Data {
 							'validThrough'  => $sale_price_valid_until ?? $price_valid_until,
 						);
 						if ( wc_tax_enabled() ) {
-							$sale_unit_price_spec['valueAddedTaxIncluded'] = 'incl' === get_option( 'woocommerce_tax_display_shop' );
+							$sale_unit_price_spec['valueAddedTaxIncluded'] = TaxDisplayMode::INCLUSIVE === get_option( 'woocommerce_tax_display_shop' );
 						}
 						$markup_offer['priceSpecification'] = array( $sale_unit_price_spec );
 					}
@@ -293,7 +294,7 @@ class WC_Structured_Data {
 				$child_ids        = $product->get_children();
 				_prime_post_caches( $child_ids );
 				$children       = array_filter( array_map( 'wc_get_product', $child_ids ), 'wc_products_array_filter_visible_grouped' );
-				$price_function = 'incl' === $tax_display_mode ? 'wc_get_price_including_tax' : 'wc_get_price_excluding_tax';
+				$price_function = TaxDisplayMode::INCLUSIVE === $tax_display_mode ? 'wc_get_price_including_tax' : 'wc_get_price_excluding_tax';

 				foreach ( $children as $child ) {
 					if ( '' !== $child->get_regular_price() ) {
@@ -321,7 +322,7 @@ class WC_Structured_Data {
 					'validThrough'  => $price_valid_until,
 				);
 				if ( wc_tax_enabled() ) {
-					$unit_price_specification['valueAddedTaxIncluded'] = 'incl' === $tax_display_mode;
+					$unit_price_specification['valueAddedTaxIncluded'] = TaxDisplayMode::INCLUSIVE === $tax_display_mode;
 				}
 				if ( $product->is_on_sale() && $min_price !== $min_sale_price ) {
 					// `priceType` should only be specified in prices which are not the current offer.
@@ -349,13 +350,13 @@ class WC_Structured_Data {
 						'validThrough'  => $sale_price_valid_until ?? $price_valid_until,
 					);
 					if ( wc_tax_enabled() ) {
-						$grouped_sale_spec['valueAddedTaxIncluded'] = 'incl' === $tax_display_mode;
+						$grouped_sale_spec['valueAddedTaxIncluded'] = TaxDisplayMode::INCLUSIVE === $tax_display_mode;
 					}
 					array_unshift( $markup_offer['priceSpecification'], $grouped_sale_spec );
 				}
 			} else {
 				$tax_display_mode         = get_option( 'woocommerce_tax_display_shop' );
-				$regular_price            = 'incl' === $tax_display_mode
+				$regular_price            = TaxDisplayMode::INCLUSIVE === $tax_display_mode
 					? wc_get_price_including_tax( $product, array( 'price' => $product->get_regular_price() ) )
 					: wc_get_price_excluding_tax( $product, array( 'price' => $product->get_regular_price() ) );
 				$unit_price_specification = array(
@@ -365,7 +366,7 @@ class WC_Structured_Data {
 					'validThrough'  => $price_valid_until,
 				);
 				if ( wc_tax_enabled() ) {
-					$unit_price_specification['valueAddedTaxIncluded'] = 'incl' === $tax_display_mode;
+					$unit_price_specification['valueAddedTaxIncluded'] = TaxDisplayMode::INCLUSIVE === $tax_display_mode;
 				}
 				if ( $product->is_on_sale() ) {
 					// `priceType` should only be specified in prices which are not the current offer.
@@ -380,7 +381,7 @@ class WC_Structured_Data {
 				);

 				if ( $product->is_on_sale() ) {
-					$sale_price = 'incl' === $tax_display_mode
+					$sale_price = TaxDisplayMode::INCLUSIVE === $tax_display_mode
 						? wc_get_price_including_tax( $product, array( 'price' => $product->get_sale_price() ) )
 						: wc_get_price_excluding_tax( $product, array( 'price' => $product->get_sale_price() ) );
 					if ( $product->get_date_on_sale_to() ) {
@@ -396,7 +397,7 @@ class WC_Structured_Data {
 						'validThrough'  => $sale_price_valid_until ?? $price_valid_until,
 					);
 					if ( wc_tax_enabled() ) {
-						$simple_sale_spec['valueAddedTaxIncluded'] = 'incl' === $tax_display_mode;
+						$simple_sale_spec['valueAddedTaxIncluded'] = TaxDisplayMode::INCLUSIVE === $tax_display_mode;
 					}
 					array_unshift( $markup_offer['priceSpecification'], $simple_sale_spec );
 				}
diff --git a/plugins/woocommerce/includes/data-stores/class-wc-product-variable-data-store-cpt.php b/plugins/woocommerce/includes/data-stores/class-wc-product-variable-data-store-cpt.php
index 780790a085d..c424a01cf21 100644
--- a/plugins/woocommerce/includes/data-stores/class-wc-product-variable-data-store-cpt.php
+++ b/plugins/woocommerce/includes/data-stores/class-wc-product-variable-data-store-cpt.php
@@ -8,6 +8,7 @@
 use Automattic\WooCommerce\Internal\Caches\ProductVersionStringInvalidator;
 use Automattic\WooCommerce\Enums\ProductStatus;
 use Automattic\WooCommerce\Enums\ProductStockStatus;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use Automattic\WooCommerce\Utilities\CallbackUtil;

 if ( ! defined( 'ABSPATH' ) ) {
@@ -433,7 +434,7 @@ class WC_Product_Variable_Data_Store_CPT extends WC_Product_Data_Store_CPT imple

 						// If we are getting prices for display, we need to account for taxes.
 						if ( $for_display ) {
-							if ( 'incl' === $tax_display_mode ) {
+							if ( TaxDisplayMode::INCLUSIVE === $tax_display_mode ) {
 								$price         = '' === $price ? '' : wc_get_price_including_tax(
 									$variation,
 									array(
@@ -613,7 +614,7 @@ class WC_Product_Variable_Data_Store_CPT extends WC_Product_Data_Store_CPT imple

 		if ( $for_display && wc_tax_enabled() ) {
 			$price_hash = array(
-				get_option( 'woocommerce_tax_display_shop', 'excl' ),
+				get_option( 'woocommerce_tax_display_shop', TaxDisplayMode::EXCLUSIVE ),
 				WC_Tax::get_rates(),
 				empty( WC()->customer ) ? false : WC()->customer->is_vat_exempt(),
 			);
diff --git a/plugins/woocommerce/includes/legacy/abstract-wc-legacy-order.php b/plugins/woocommerce/includes/legacy/abstract-wc-legacy-order.php
index e89fe74d64b..d513e044185 100644
--- a/plugins/woocommerce/includes/legacy/abstract-wc-legacy-order.php
+++ b/plugins/woocommerce/includes/legacy/abstract-wc-legacy-order.php
@@ -1,6 +1,7 @@
 <?php

 use Automattic\WooCommerce\Enums\OrderStatus;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;

 if ( ! defined( 'ABSPATH' ) ) {
 	exit;
@@ -433,9 +434,9 @@ abstract class WC_Abstract_Legacy_Order extends WC_Data {
 		} elseif ( 'tax_display_cart' === $key ) {
 			return get_option( 'woocommerce_tax_display_cart' );
 		} elseif ( 'display_totals_ex_tax' === $key ) {
-			return 'excl' === get_option( 'woocommerce_tax_display_cart' );
+			return TaxDisplayMode::EXCLUSIVE === get_option( 'woocommerce_tax_display_cart' );
 		} elseif ( 'display_cart_ex_tax' === $key ) {
-			return 'excl' === get_option( 'woocommerce_tax_display_cart' );
+			return TaxDisplayMode::EXCLUSIVE === get_option( 'woocommerce_tax_display_cart' );
 		} elseif ( 'cart_discount' === $key ) {
 			return $this->get_total_discount();
 		} elseif ( 'cart_discount_tax' === $key ) {
diff --git a/plugins/woocommerce/includes/wc-product-functions.php b/plugins/woocommerce/includes/wc-product-functions.php
index 4226a9a8c10..a63fe826bc4 100644
--- a/plugins/woocommerce/includes/wc-product-functions.php
+++ b/plugins/woocommerce/includes/wc-product-functions.php
@@ -13,6 +13,7 @@ use Automattic\WooCommerce\Enums\ProductStatus;
 use Automattic\WooCommerce\Enums\ProductStockStatus;
 use Automattic\WooCommerce\Enums\ProductType;
 use Automattic\WooCommerce\Enums\CatalogVisibility;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use Automattic\WooCommerce\Internal\Caches\ProductTransientsDeferrer;
 use Automattic\WooCommerce\Internal\Utilities\ProductUtil;
 use Automattic\WooCommerce\Proxies\LegacyProxy;
@@ -1677,7 +1678,7 @@ function wc_get_price_to_display( $product, $args = array() ) {
 		'cart' === $args['display_context'] ? 'woocommerce_tax_display_cart' : 'woocommerce_tax_display_shop'
 	);

-	return 'incl' === $tax_display ?
+	return TaxDisplayMode::INCLUSIVE === $tax_display ?
 		wc_get_price_including_tax(
 			$product,
 			array(
diff --git a/plugins/woocommerce/includes/widgets/class-wc-widget-price-filter.php b/plugins/woocommerce/includes/widgets/class-wc-widget-price-filter.php
index 8b0175e7320..b9d4599c9d5 100644
--- a/plugins/woocommerce/includes/widgets/class-wc-widget-price-filter.php
+++ b/plugins/woocommerce/includes/widgets/class-wc-widget-price-filter.php
@@ -9,6 +9,7 @@
  */

 use Automattic\Jetpack\Constants;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;

 defined( 'ABSPATH' ) || exit;

@@ -97,7 +98,7 @@ class WC_Widget_Price_Filter extends WC_Widget {
 		// Check to see if we should add taxes to the prices if store are excl tax but display incl.
 		$tax_display_mode = get_option( 'woocommerce_tax_display_shop' );

-		if ( wc_tax_enabled() && ! wc_prices_include_tax() && 'incl' === $tax_display_mode ) {
+		if ( wc_tax_enabled() && ! wc_prices_include_tax() && TaxDisplayMode::INCLUSIVE === $tax_display_mode ) {
 			$tax_class = apply_filters( 'woocommerce_price_filter_widget_tax_class', '' ); // Uses standard tax class.
 			$tax_rates = WC_Tax::get_rates( $tax_class );

diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/Cart.php b/plugins/woocommerce/src/Blocks/BlockTypes/Cart.php
index 545e7f67523..5b6d27a60af 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/Cart.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/Cart.php
@@ -2,6 +2,7 @@
 namespace Automattic\WooCommerce\Blocks\BlockTypes;

 use Automattic\WooCommerce\Blocks\Utils\CartCheckoutUtils;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;

 /**
  * Cart class.
@@ -255,7 +256,7 @@ class Cart extends AbstractBlock {

 		$this->asset_data_registry->add( 'countryData', CartCheckoutUtils::get_country_data() );
 		$this->asset_data_registry->add( 'displayItemizedTaxes', 'itemized' === get_option( 'woocommerce_tax_total_display' ) );
-		$this->asset_data_registry->add( 'displayCartPricesIncludingTax', 'incl' === get_option( 'woocommerce_tax_display_cart' ) );
+		$this->asset_data_registry->add( 'displayCartPricesIncludingTax', TaxDisplayMode::INCLUSIVE === get_option( 'woocommerce_tax_display_cart' ) );
 		$this->asset_data_registry->add( 'taxesEnabled', wc_tax_enabled() );
 		$this->asset_data_registry->add( 'couponsEnabled', wc_coupons_enabled() );
 		$this->asset_data_registry->add( 'shippingEnabled', wc_shipping_enabled() );
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/Checkout.php b/plugins/woocommerce/src/Blocks/BlockTypes/Checkout.php
index 479a0969668..ce2792016fb 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/Checkout.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/Checkout.php
@@ -7,6 +7,7 @@ use Automattic\WooCommerce\StoreApi\Utilities\LocalPickupUtils;
 use Automattic\WooCommerce\Blocks\Utils\CartCheckoutUtils;
 use Automattic\WooCommerce\Blocks\Domain\Services\CheckoutFields;
 use Automattic\WooCommerce\Blocks\Package;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use Automattic\WooCommerce\StoreApi\Utilities\PaymentUtils;
 use Automattic\WooCommerce\Blocks\Domain\Services\CheckoutFieldsSchema\Validation;
 use Automattic\WooCommerce\Internal\AddressProvider\AddressProviderController;
@@ -479,7 +480,7 @@ class Checkout extends AbstractBlock {
 			)
 		);
 		$this->asset_data_registry->add( 'checkoutShowLoginReminder', filter_var( get_option( 'woocommerce_enable_checkout_login_reminder' ), FILTER_VALIDATE_BOOLEAN ) );
-		$this->asset_data_registry->add( 'displayCartPricesIncludingTax', 'incl' === get_option( 'woocommerce_tax_display_cart' ) );
+		$this->asset_data_registry->add( 'displayCartPricesIncludingTax', TaxDisplayMode::INCLUSIVE === get_option( 'woocommerce_tax_display_cart' ) );
 		$this->asset_data_registry->add( 'displayItemizedTaxes', 'itemized' === get_option( 'woocommerce_tax_total_display' ) );
 		$this->asset_data_registry->add( 'forcedBillingAddress', 'billing_only' === get_option( 'woocommerce_ship_to_destination' ) );
 		$this->asset_data_registry->add( 'generatePassword', filter_var( get_option( 'woocommerce_registration_generate_password' ), FILTER_VALIDATE_BOOLEAN ) );
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/MiniCart.php b/plugins/woocommerce/src/Blocks/BlockTypes/MiniCart.php
index e914481128d..3628e5fa1c6 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/MiniCart.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/MiniCart.php
@@ -14,6 +14,7 @@ use Automattic\WooCommerce\Blocks\Utils\Utils;
 use Automattic\WooCommerce\Blocks\Utils\MiniCartUtils;
 use Automattic\WooCommerce\Blocks\Utils\BlockHooksTrait;
 use Automattic\WooCommerce\Admin\Features\Features;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use Automattic\WooCommerce\Blocks\Utils\BlocksSharedState;
 use Automattic\WooCommerce\Internal\ComingSoon\ComingSoonHelper;
 use Automattic\Block_Delimiter;
@@ -526,7 +527,7 @@ class MiniCart extends AbstractBlock {
 			$template_part_contents           = $this->get_template_part_contents( false );
 			$template_part_contents           = do_blocks( $this->process_template_contents( $template_part_contents ) );
 			$cart_item_count                  = $cart ? $cart->get_cart_contents_count() : 0;
-			$display_cart_price_including_tax = get_option( 'woocommerce_tax_display_cart' ) === 'incl';
+			$display_cart_price_including_tax = get_option( 'woocommerce_tax_display_cart' ) === TaxDisplayMode::INCLUSIVE;
 			$cart_item_count                  = $cart ? $cart->get_cart_contents_count() : 0;
 			$badge_is_visible                 = ( 'always' === $product_count_visibility ) || ( 'never' !== $product_count_visibility && $cart_item_count > 0 );
 			$formatted_subtotal               = '';
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/MiniCartFooterBlock.php b/plugins/woocommerce/src/Blocks/BlockTypes/MiniCartFooterBlock.php
index f04e706d224..ecf14b2cd3a 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/MiniCartFooterBlock.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/MiniCartFooterBlock.php
@@ -2,6 +2,7 @@
 namespace Automattic\WooCommerce\Blocks\BlockTypes;

 use Automattic\WooCommerce\Admin\Features\Features;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;

 /**
  * MiniCartFooterBlock class.
@@ -43,7 +44,7 @@ class MiniCartFooterBlock extends AbstractInnerBlock {
 		$cart                             = $this->get_cart_instance();
 		$subtotal_label                   = __( 'Subtotal', 'woocommerce' );
 		$other_costs_label                = $this->get_totals_item_description();
-		$display_cart_price_including_tax = get_option( 'woocommerce_tax_display_cart' ) === 'incl';
+		$display_cart_price_including_tax = get_option( 'woocommerce_tax_display_cart' ) === TaxDisplayMode::INCLUSIVE;
 		$subtotal                         = $display_cart_price_including_tax ? $cart->get_subtotal_tax() : $cart->get_subtotal();
 		$formatted_subtotal               = '';
 		$html                             = new \WP_HTML_Tag_Processor( wc_price( $subtotal ) );
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/ProductCollection/QueryBuilder.php b/plugins/woocommerce/src/Blocks/BlockTypes/ProductCollection/QueryBuilder.php
index c58bfaf96dc..c5b4f6a6bbc 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/ProductCollection/QueryBuilder.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/ProductCollection/QueryBuilder.php
@@ -10,6 +10,7 @@ use Automattic\WooCommerce\Blocks\BlockTypes\StockFilter;
 use WP_Query;
 use WC_Tax;
 use Automattic\WooCommerce\Enums\ProductStockStatus;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;

 /**
  * QueryBuilder class.
@@ -984,7 +985,7 @@ class QueryBuilder {
 		$base_tax_rates = WC_Tax::get_base_tax_rates( $tax_class );

 		// If prices are shown incl. tax, we want to remove the taxes from the filter amount to match prices stored excl. tax.
-		if ( 'incl' === $tax_display ) {
+		if ( TaxDisplayMode::INCLUSIVE === $tax_display ) {
 			/**
 			 * Filters if taxes should be removed from locations outside the store base location.
 			 *
@@ -1021,7 +1022,7 @@ class QueryBuilder {
 	 */
 	private function should_adjust_price_range_for_taxes() {
 		$display_setting      = get_option( 'woocommerce_tax_display_shop' ); // Tax display setting ('incl' or 'excl').
-		$price_storage_method = wc_prices_include_tax() ? 'incl' : 'excl';
+		$price_storage_method = wc_prices_include_tax() ? TaxDisplayMode::INCLUSIVE : TaxDisplayMode::EXCLUSIVE;

 		return $display_setting !== $price_storage_method;
 	}
diff --git a/plugins/woocommerce/src/Blocks/Shipping/ShippingController.php b/plugins/woocommerce/src/Blocks/Shipping/ShippingController.php
index 3c71342bba1..a6a84761bdb 100644
--- a/plugins/woocommerce/src/Blocks/Shipping/ShippingController.php
+++ b/plugins/woocommerce/src/Blocks/Shipping/ShippingController.php
@@ -5,6 +5,7 @@ use Automattic\WooCommerce\Blocks\Assets\Api as AssetApi;
 use Automattic\WooCommerce\Blocks\Assets\AssetDataRegistry;
 use Automattic\WooCommerce\Blocks\Utils\CartCheckoutUtils;
 use Automattic\WooCommerce\Enums\ProductTaxStatus;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use Automattic\WooCommerce\StoreApi\Utilities\LocalPickupUtils;
 use Automattic\WooCommerce\Utilities\ArrayUtil;
 use WC_Customer;
@@ -136,7 +137,7 @@ class ShippingController {
 			$tax         = $shipping_method->get_total_tax();

 			// Format cost with tax handling.
-			if ( 'excl' === $tax_display ) {
+			if ( TaxDisplayMode::EXCLUSIVE === $tax_display ) {
 				// Show pickup cost excluding tax.
 				$formatted_cost = wc_price( $cost, array( 'currency' => $order->get_currency() ) );
 				if ( (float) $tax > 0 && $order->get_prices_include_tax() ) {
diff --git a/plugins/woocommerce/src/Enums/README.md b/plugins/woocommerce/src/Enums/README.md
index c4d04cc76c3..9bbc90302b9 100644
--- a/plugins/woocommerce/src/Enums/README.md
+++ b/plugins/woocommerce/src/Enums/README.md
@@ -16,6 +16,7 @@ The enum classes make it easier to reference string values and avoid typos. They
 - [ProductStockStatus](./ProductStockStatus.php) - Enumerates the possible stock statuses of a product.
 - [ProductType](./ProductType.php) - Enumerates the possible types of a product.
 - [TaxBasedOn](./TaxBasedOn.php) - Enumerates the possible values of the `woocommerce_tax_based_on` option.
+- [TaxDisplayMode](./TaxDisplayMode.php) - Enumerates the possible values of the `woocommerce_tax_display_shop` and `woocommerce_tax_display_cart` options.
 - [WeightUnit](./WeightUnit.php) - Enumerates the possible values of the `woocommerce_weight_unit` option.

 ## Contributing
diff --git a/plugins/woocommerce/src/Enums/TaxDisplayMode.php b/plugins/woocommerce/src/Enums/TaxDisplayMode.php
new file mode 100644
index 00000000000..819c3695eef
--- /dev/null
+++ b/plugins/woocommerce/src/Enums/TaxDisplayMode.php
@@ -0,0 +1,28 @@
+<?php
+
+declare( strict_types = 1 );
+
+namespace Automattic\WooCommerce\Enums;
+
+/**
+ * Enum class for the possible values of the `woocommerce_tax_display_shop` and
+ * `woocommerce_tax_display_cart` options, which control whether prices are
+ * shown including or excluding tax.
+ *
+ * @since 11.0.0
+ */
+final class TaxDisplayMode {
+	/**
+	 * Prices displayed including tax.
+	 *
+	 * @var string
+	 */
+	public const INCLUSIVE = 'incl';
+
+	/**
+	 * Prices displayed excluding tax.
+	 *
+	 * @var string
+	 */
+	public const EXCLUSIVE = 'excl';
+}
diff --git a/plugins/woocommerce/src/Internal/Email/OrderPriceFormatter.php b/plugins/woocommerce/src/Internal/Email/OrderPriceFormatter.php
index ae122bdccd4..7e96ab5ccc0 100644
--- a/plugins/woocommerce/src/Internal/Email/OrderPriceFormatter.php
+++ b/plugins/woocommerce/src/Internal/Email/OrderPriceFormatter.php
@@ -7,6 +7,7 @@ declare( strict_types = 1 );

 namespace Automattic\WooCommerce\Internal\Email;

+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use WC_Abstract_Order;
 use WC_Order_Item;

@@ -26,7 +27,7 @@ class OrderPriceFormatter {
 	 * @return string Formatted item subtotal.
 	 */
 	public static function get_formatted_item_subtotal( WC_Abstract_Order $order, WC_Order_Item $item, string $tax_display ): string {
-		$includes_tax  = 'excl' !== $tax_display;
+		$includes_tax  = TaxDisplayMode::EXCLUSIVE !== $tax_display;
 		$item_subtotal = $order->get_item_subtotal( $item, $includes_tax );
 		return self::format_price( $order, $item_subtotal, $includes_tax );
 	}
diff --git a/plugins/woocommerce/src/Internal/ProductFilters/QueryClauses.php b/plugins/woocommerce/src/Internal/ProductFilters/QueryClauses.php
index cf7f18e15cc..8ae467f36de 100644
--- a/plugins/woocommerce/src/Internal/ProductFilters/QueryClauses.php
+++ b/plugins/woocommerce/src/Internal/ProductFilters/QueryClauses.php
@@ -7,6 +7,7 @@ declare(strict_types=1);

 namespace Automattic\WooCommerce\Internal\ProductFilters;

+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use Automattic\WooCommerce\Internal\ProductAttributesLookup\LookupDataStore;
 use Automattic\WooCommerce\Internal\ProductFilters\Interfaces\QueryClausesGenerator;
 use Automattic\WooCommerce\Internal\ProductFilters\Interfaces\MainQueryClausesGenerator;
@@ -451,7 +452,7 @@ class QueryClauses implements QueryClausesGenerator, MainQueryClausesGenerator {
 	 */
 	private function should_adjust_price_filters_for_displayed_taxes(): bool {
 		$display  = get_option( 'woocommerce_tax_display_shop' );
-		$database = wc_prices_include_tax() ? 'incl' : 'excl';
+		$database = wc_prices_include_tax() ? TaxDisplayMode::INCLUSIVE : TaxDisplayMode::EXCLUSIVE;

 		return $display !== $database;
 	}
@@ -522,7 +523,7 @@ class QueryClauses implements QueryClausesGenerator, MainQueryClausesGenerator {
 		$base_tax_rates = WC_Tax::get_base_tax_rates( $tax_class );

 		// If prices are shown incl. tax, we want to remove the taxes from the filter amount to match prices stored excl. tax.
-		if ( 'incl' === $tax_display ) {
+		if ( TaxDisplayMode::INCLUSIVE === $tax_display ) {
 			/**
 			 * Filters if taxes should be removed from locations outside the store base location.
 			 *
diff --git a/plugins/woocommerce/src/Internal/StockNotifications/Emails/EmailManager.php b/plugins/woocommerce/src/Internal/StockNotifications/Emails/EmailManager.php
index d32c4758587..abee6708a30 100644
--- a/plugins/woocommerce/src/Internal/StockNotifications/Emails/EmailManager.php
+++ b/plugins/woocommerce/src/Internal/StockNotifications/Emails/EmailManager.php
@@ -4,6 +4,7 @@ declare( strict_types = 1 );

 namespace Automattic\WooCommerce\Internal\StockNotifications\Emails;

+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use Automattic\WooCommerce\Internal\StockNotifications\Notification;
 use Automattic\WooCommerce\Internal\StockNotifications\Factory;
 use Automattic\WooCommerce\Internal\StockNotifications\Emails\CustomerStockNotificationEmail;
@@ -103,7 +104,7 @@ class EmailManager {
 	public function maybe_restore_customer_tax_location_data( $notification ) {

 		// No need if stores displaying price excluding tax.
-		if ( 'incl' !== get_option( 'woocommerce_tax_display_shop' ) ) {
+		if ( TaxDisplayMode::INCLUSIVE !== get_option( 'woocommerce_tax_display_shop' ) ) {
 			return;
 		}

diff --git a/plugins/woocommerce/src/StoreApi/Schemas/V1/ProductSchema.php b/plugins/woocommerce/src/StoreApi/Schemas/V1/ProductSchema.php
index a59d00d3406..91ec9ebac16 100644
--- a/plugins/woocommerce/src/StoreApi/Schemas/V1/ProductSchema.php
+++ b/plugins/woocommerce/src/StoreApi/Schemas/V1/ProductSchema.php
@@ -7,6 +7,7 @@ use Automattic\WooCommerce\StoreApi\Schemas\ExtendSchema;
 use Automattic\WooCommerce\StoreApi\Utilities\QuantityLimits;
 use Automattic\WooCommerce\Blocks\Utils\ProductAvailabilityUtils;
 use Automattic\WooCommerce\Enums\ProductStockStatus;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;

 /**
  * ProductSchema class.
@@ -947,7 +948,7 @@ class ProductSchema extends AbstractSchema {
 	 * @return string Valid tax display mode.
 	 */
 	protected function get_tax_display_mode( $tax_display_mode = '' ) {
-		return in_array( $tax_display_mode, [ 'incl', 'excl' ], true ) ? $tax_display_mode : get_option( 'woocommerce_tax_display_shop' );
+		return in_array( $tax_display_mode, [ TaxDisplayMode::INCLUSIVE, TaxDisplayMode::EXCLUSIVE ], true ) ? $tax_display_mode : get_option( 'woocommerce_tax_display_shop' );
 	}

 	/**
@@ -957,7 +958,7 @@ class ProductSchema extends AbstractSchema {
 	 * @return string Function name.
 	 */
 	protected function get_price_function_from_tax_display_mode( $tax_display_mode ) {
-		return 'incl' === $tax_display_mode ? 'wc_get_price_including_tax' : 'wc_get_price_excluding_tax';
+		return TaxDisplayMode::INCLUSIVE === $tax_display_mode ? 'wc_get_price_including_tax' : 'wc_get_price_excluding_tax';
 	}

 	/**
@@ -983,7 +984,7 @@ class ProductSchema extends AbstractSchema {

 		if ( $product->is_type( ProductType::GROUPED ) ) {
 			$children       = $product->get_visible_children();
-			$price_function = 'incl' === $tax_display_mode ? 'wc_get_price_including_tax' : 'wc_get_price_excluding_tax';
+			$price_function = TaxDisplayMode::INCLUSIVE === $tax_display_mode ? 'wc_get_price_including_tax' : 'wc_get_price_excluding_tax';

 			foreach ( $children as $child ) {
 				if ( '' !== $child->get_price() ) {
diff --git a/plugins/woocommerce/src/StoreApi/Utilities/ProductQuery.php b/plugins/woocommerce/src/StoreApi/Utilities/ProductQuery.php
index e838b5c683d..6f7ea3ba335 100644
--- a/plugins/woocommerce/src/StoreApi/Utilities/ProductQuery.php
+++ b/plugins/woocommerce/src/StoreApi/Utilities/ProductQuery.php
@@ -6,6 +6,7 @@ namespace Automattic\WooCommerce\StoreApi\Utilities;
 use Automattic\WooCommerce\Enums\ProductStatus;
 use Automattic\WooCommerce\Enums\ProductType;
 use Automattic\WooCommerce\Enums\CatalogVisibility;
+use Automattic\WooCommerce\Enums\TaxDisplayMode;
 use Automattic\WooCommerce\Internal\ProductFilters\Interfaces\QueryClausesGenerator;
 use Automattic\WooCommerce\Internal\Utilities\ProductUtil;
 use Automattic\WooCommerce\StoreApi\Exceptions\RouteException;
@@ -550,7 +551,7 @@ class ProductQuery implements QueryClausesGenerator {
 	 */
 	protected function adjust_price_filters_for_displayed_taxes() {
 		$display  = get_option( 'woocommerce_tax_display_shop' );
-		$database = wc_prices_include_tax() ? 'incl' : 'excl';
+		$database = wc_prices_include_tax() ? TaxDisplayMode::INCLUSIVE : TaxDisplayMode::EXCLUSIVE;

 		return $display !== $database;
 	}
@@ -580,7 +581,7 @@ class ProductQuery implements QueryClausesGenerator {
 		$base_tax_rates = WC_Tax::get_base_tax_rates( $tax_class );

 		// If prices are shown incl. tax, we want to remove the taxes from the filter amount to match prices stored excl. tax.
-		if ( 'incl' === $tax_display ) {
+		if ( TaxDisplayMode::INCLUSIVE === $tax_display ) {
 			/**
 			 * Filters if taxes should be removed from locations outside the store base location.
 			 *