PluginProbe ʕ •ᴥ•ʔ
WooCommerce / 10.9.1
WooCommerce v10.9.1
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 / StoreApi / RoutesController.php
woocommerce / src / StoreApi Last commit date
Exceptions 2 years ago Formatters 1 year ago Payments 4 months ago Routes 4 weeks ago Schemas 4 weeks ago Utilities 4 weeks ago Authentication.php 4 months ago Formatters.php 2 years ago Legacy.php 1 year ago RoutesController.php 4 weeks ago SchemaController.php 4 weeks ago SessionHandler.php 3 months ago StoreApi.php 4 months ago deprecated.php 2 years ago functions.php 2 years ago
RoutesController.php
187 lines
1 <?php
2 declare( strict_types = 1 );
3
4 namespace Automattic\WooCommerce\StoreApi;
5
6 use Automattic\WooCommerce\Internal\ShopperLists\ShopperListsController;
7 use Automattic\WooCommerce\StoreApi\Routes\V1\AbstractRoute;
8 use Automattic\WooCommerce\Utilities\FeaturesUtil;
9
10 /**
11 * RoutesController class.
12 */
13 class RoutesController {
14 /**
15 * Stores schema_controller.
16 *
17 * @var SchemaController
18 */
19 protected $schema_controller;
20
21 /**
22 * Stores routes.
23 *
24 * @var array
25 */
26 protected $routes = [];
27
28 /**
29 * Namespace for the API.
30 *
31 * @var string
32 */
33 private static $api_namespace = 'wc/store';
34
35 /**
36 * Constructor.
37 *
38 * @param SchemaController $schema_controller Schema controller class passed to each route.
39 */
40 public function __construct( SchemaController $schema_controller ) {
41 $this->schema_controller = $schema_controller;
42 $this->routes = [
43 'v1' => [
44 Routes\V1\Batch::IDENTIFIER => Routes\V1\Batch::class,
45 Routes\V1\Cart::IDENTIFIER => Routes\V1\Cart::class,
46 Routes\V1\CartAddItem::IDENTIFIER => Routes\V1\CartAddItem::class,
47 Routes\V1\CartApplyCoupon::IDENTIFIER => Routes\V1\CartApplyCoupon::class,
48 Routes\V1\CartCoupons::IDENTIFIER => Routes\V1\CartCoupons::class,
49 Routes\V1\CartCouponsByCode::IDENTIFIER => Routes\V1\CartCouponsByCode::class,
50 Routes\V1\CartExtensions::IDENTIFIER => Routes\V1\CartExtensions::class,
51 Routes\V1\CartItems::IDENTIFIER => Routes\V1\CartItems::class,
52 Routes\V1\CartItemsByKey::IDENTIFIER => Routes\V1\CartItemsByKey::class,
53 Routes\V1\CartRemoveCoupon::IDENTIFIER => Routes\V1\CartRemoveCoupon::class,
54 Routes\V1\CartRemoveItem::IDENTIFIER => Routes\V1\CartRemoveItem::class,
55 Routes\V1\CartSelectShippingRate::IDENTIFIER => Routes\V1\CartSelectShippingRate::class,
56 Routes\V1\CartUpdateItem::IDENTIFIER => Routes\V1\CartUpdateItem::class,
57 Routes\V1\CartUpdateCustomer::IDENTIFIER => Routes\V1\CartUpdateCustomer::class,
58 Routes\V1\Checkout::IDENTIFIER => Routes\V1\Checkout::class,
59 Routes\V1\CheckoutOrder::IDENTIFIER => Routes\V1\CheckoutOrder::class,
60 Routes\V1\Order::IDENTIFIER => Routes\V1\Order::class,
61 Routes\V1\ProductAttributes::IDENTIFIER => Routes\V1\ProductAttributes::class,
62 Routes\V1\ProductAttributesById::IDENTIFIER => Routes\V1\ProductAttributesById::class,
63 Routes\V1\ProductAttributeTerms::IDENTIFIER => Routes\V1\ProductAttributeTerms::class,
64 Routes\V1\ProductCategories::IDENTIFIER => Routes\V1\ProductCategories::class,
65 Routes\V1\ProductCategoriesById::IDENTIFIER => Routes\V1\ProductCategoriesById::class,
66 Routes\V1\ProductBrands::IDENTIFIER => Routes\V1\ProductBrands::class,
67 Routes\V1\ProductBrandsById::IDENTIFIER => Routes\V1\ProductBrandsById::class,
68 Routes\V1\ProductCollectionData::IDENTIFIER => Routes\V1\ProductCollectionData::class,
69 Routes\V1\ProductReviews::IDENTIFIER => Routes\V1\ProductReviews::class,
70 Routes\V1\ProductTags::IDENTIFIER => Routes\V1\ProductTags::class,
71 Routes\V1\Products::IDENTIFIER => Routes\V1\Products::class,
72 Routes\V1\ProductsById::IDENTIFIER => Routes\V1\ProductsById::class,
73 Routes\V1\ProductsBySlug::IDENTIFIER => Routes\V1\ProductsBySlug::class,
74 ],
75 'private' => [
76 // This route should be moved outside of the Store API namespace.
77 Routes\V1\Patterns::IDENTIFIER => Routes\V1\Patterns::class,
78 ],
79 'shopper_lists' => [
80 // Gated by ShopperListsController — registered only when at least one shopper-list feature is enabled.
81 Routes\V1\ShopperLists::IDENTIFIER => Routes\V1\ShopperLists::class,
82 Routes\V1\ShopperListsBySlug::IDENTIFIER => Routes\V1\ShopperListsBySlug::class,
83 Routes\V1\ShopperListItems::IDENTIFIER => Routes\V1\ShopperListItems::class,
84 Routes\V1\ShopperListItemsByKey::IDENTIFIER => Routes\V1\ShopperListItemsByKey::class,
85 ],
86 'agentic' => [
87 // Agentic Commerce Protocol endpoints.
88 Routes\V1\Agentic\CheckoutSessions::IDENTIFIER => Routes\V1\Agentic\CheckoutSessions::class,
89 Routes\V1\Agentic\CheckoutSessionsUpdate::IDENTIFIER => Routes\V1\Agentic\CheckoutSessionsUpdate::class,
90 Routes\V1\Agentic\CheckoutSessionsComplete::IDENTIFIER => Routes\V1\Agentic\CheckoutSessionsComplete::class,
91 ],
92 ];
93 }
94
95 /**
96 * Register all Store API routes. This includes routes under specific version namespaces.
97 */
98 public function register_all_routes() {
99 $this->register_routes( 'v1', self::$api_namespace );
100 $this->register_routes( 'v1', self::$api_namespace . '/v1' );
101 $this->register_routes( 'private', 'wc/private' );
102
103 if ( wc_get_container()->get( ShopperListsController::class )->is_enabled() ) {
104 $this->register_routes( 'shopper_lists', self::$api_namespace . '/v1' );
105 }
106
107 if ( FeaturesUtil::feature_is_enabled( 'agentic_checkout' ) ) {
108 $this->register_routes( 'agentic', 'wc/agentic/v1' );
109 }
110 }
111
112 /**
113 * Get a route class instance.
114 *
115 * Each route class is instantized with the SchemaController instance, and its main Schema Type.
116 *
117 * @throws \Exception If the schema does not exist.
118 * @param string $name Name of schema.
119 * @param string $version API Version being requested.
120 * @return AbstractRoute
121 */
122 public function get( $name, $version = 'v1' ) {
123 $route = $this->routes[ $version ][ $name ] ?? false;
124
125 if ( ! $route ) {
126 throw new \Exception( "{$name} {$version} route does not exist" );
127 }
128
129 return new $route(
130 $this->schema_controller,
131 $this->schema_controller->get( $route::SCHEMA_TYPE, $route::SCHEMA_VERSION )
132 );
133 }
134
135 /**
136 * Get a route path without instantiating the corresponding RoutesController object.
137 *
138 * @throws \Exception If the schema does not exist.
139 *
140 * @param string $version API Version being requested.
141 * @param string $controller Whether to return controller name. If false, returns empty array. Note:
142 * When $controller param is true, the output should not be used directly in front-end code, to prevent class names from leaking. It's not a security issue necessarily, but it's not a good practice.
143 * When $controller param is false, it currently returns and empty array. But it can be modified in future to return include more details about the route info that can be used in frontend.
144 *
145 * @return string[] List of route paths.
146 */
147 public function get_all_routes( $version = 'v1', $controller = false ) {
148 $routes = array();
149
150 foreach ( $this->routes[ $version ] as $key => $route_class ) {
151
152 if ( ! method_exists( $route_class, 'get_path_regex' ) ) {
153 throw new \Exception( esc_html( "{$route_class} route does not have a get_path_regex method" ) );
154 }
155
156 $route_path = '/' . trailingslashit( self::$api_namespace ) . $version . $route_class::get_path_regex();
157
158 $routes[ $route_path ] = $controller ? $route_class : array();
159 }
160
161 return $routes;
162 }
163
164 /**
165 * Register defined list of routes with WordPress.
166 *
167 * @param string $version API Version being registered..
168 * @param string $namespace Overrides the default route namespace.
169 */
170 protected function register_routes( $version = 'v1', $namespace = 'wc/store/v1' ) {
171 if ( ! isset( $this->routes[ $version ] ) ) {
172 return;
173 }
174 $route_identifiers = array_keys( $this->routes[ $version ] );
175 foreach ( $route_identifiers as $route ) {
176 $route_instance = $this->get( $route, $version );
177 $route_instance->set_namespace( $namespace );
178
179 register_rest_route(
180 $route_instance->get_namespace(),
181 $route_instance->get_path(),
182 $route_instance->get_args()
183 );
184 }
185 }
186 }
187