This repository has been archived by the owner on Feb 23, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 219
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Store API: allow searching by
slug
and include slug
in the respon…
…se (#9017) * Add ProductBySlug, search by slug and return slug field for products * Search for product variation * Add slug to tests * Sanitize the slug
- Loading branch information
Showing
7 changed files
with
221 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
<?php | ||
namespace Automattic\WooCommerce\StoreApi\Routes\V1; | ||
|
||
use Automattic\WooCommerce\StoreApi\Exceptions\RouteException; | ||
|
||
/** | ||
* ProductsBySlug class. | ||
*/ | ||
class ProductsBySlug extends AbstractRoute { | ||
/** | ||
* The route identifier. | ||
* | ||
* @var string | ||
*/ | ||
const IDENTIFIER = 'products-by-slug'; | ||
|
||
/** | ||
* The routes schema. | ||
* | ||
* @var string | ||
*/ | ||
const SCHEMA_TYPE = 'product'; | ||
|
||
/** | ||
* Get the path of this REST route. | ||
* | ||
* @return string | ||
*/ | ||
public function get_path() { | ||
return '/products/(?P<slug>[\S]+)'; | ||
} | ||
|
||
/** | ||
* Get method arguments for this REST route. | ||
* | ||
* @return array An array of endpoints. | ||
*/ | ||
public function get_args() { | ||
return [ | ||
'args' => array( | ||
'slug' => array( | ||
'description' => __( 'Slug of the resource.', 'woo-gutenberg-products-block' ), | ||
'type' => 'string', | ||
), | ||
), | ||
[ | ||
'methods' => \WP_REST_Server::READABLE, | ||
'callback' => [ $this, 'get_response' ], | ||
'permission_callback' => '__return_true', | ||
'args' => array( | ||
'context' => $this->get_context_param( | ||
array( | ||
'default' => 'view', | ||
) | ||
), | ||
), | ||
], | ||
'schema' => [ $this->schema, 'get_public_item_schema' ], | ||
]; | ||
} | ||
|
||
/** | ||
* Get a single item. | ||
* | ||
* @throws RouteException On error. | ||
* @param \WP_REST_Request $request Request object. | ||
* @return \WP_REST_Response | ||
*/ | ||
protected function get_route_response( \WP_REST_Request $request ) { | ||
$slug = sanitize_title( $request['slug'] ); | ||
|
||
$object = $this->get_product_by_slug( $slug ); | ||
if ( ! $object ) { | ||
$object = $this->get_product_variation_by_slug( $slug ); | ||
} | ||
|
||
if ( ! $object || 0 === $object->get_id() ) { | ||
throw new RouteException( 'woocommerce_rest_product_invalid_slug', __( 'Invalid product slug.', 'woo-gutenberg-products-block' ), 404 ); | ||
} | ||
|
||
return rest_ensure_response( $this->schema->get_item_response( $object ) ); | ||
} | ||
|
||
/** | ||
* Get a product by slug. | ||
* | ||
* @param string $slug The slug of the product. | ||
*/ | ||
public function get_product_by_slug( $slug ) { | ||
return wc_get_product( get_page_by_path( $slug, OBJECT, 'product' ) ); | ||
} | ||
|
||
/** | ||
* Get a product variation by slug. | ||
* | ||
* @param string $slug The slug of the product variation. | ||
*/ | ||
private function get_product_variation_by_slug( $slug ) { | ||
global $wpdb; | ||
|
||
$result = $wpdb->get_results( | ||
$wpdb->prepare( | ||
"SELECT ID, post_name, post_parent, post_type | ||
FROM $wpdb->posts | ||
WHERE post_name = %s | ||
AND post_type = 'product_variation'", | ||
$slug | ||
) | ||
); | ||
|
||
if ( ! $result ) { | ||
return null; | ||
} | ||
|
||
return wc_get_product( $result[0]->ID ); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters