AMP_Cart_Controller
Summary
AMP_Cart_Controller class
Source
File: src/BigCommerce/Proxy/AMP_Cart_Controller.php
class AMP_Cart_Controller extends Proxy_Controller { /** * Init endpoint. * * @return void */ public function register_routes() { $public_args = [ 'methods' => WP_REST_Server::READABLE, 'callback' => [ $this, 'get_items' ], 'permission_callback' => '__return_true', ]; register_rest_route( $this->proxy_base, '/amp-cart/', $public_args ); } /** * Adds additional data to a single item. * * @param array $item Cart item. * @return array Updated data. */ private function build_item( $item ) { $query = new WP_Query( [ 'post_type' => Product::NAME, 'posts_per_page' => 1, 'meta_key' => 'bigcommerce_id', 'meta_value' => $item['product_id'], ] ); if ( is_wp_error( $query ) || ! $query->have_posts() ) { return $item; } $post = reset( $query->posts ); $product = new Product( $post->ID ); $item['permalink'] = amp_get_permalink( $post->ID ); $thumbnail_id = get_post_thumbnail_id( $post->ID ); $thumbnail = get_the_post_thumbnail( $post->ID, Image_Sizes::BC_SMALL ); if ( $thumbnail_id ) { $image = wp_get_attachment_image_src( $thumbnail_id, Image_Sizes::BC_SMALL ); $item['thumbnail_src'] = str_replace( home_url(), '', $image[0] ); $item['thumbnail_height'] = $image[2]; $item['thumbnail_width'] = $image[1]; $item['thumbnail_srcset'] = wp_get_attachment_image_srcset( $thumbnail_id, Image_Sizes::BC_SMALL ); } $brand = $product->brand(); if ( $brand ) { $item['brand'] = $brand; } $item['price'] = apply_filters( 'bigcommerce/currency/format', sprintf( '¤%0.2f', $item['sale_price'] ), $item['sale_price'] ); return $item; } /** * Adds additional data to items. * * @param array $data Array of items. * @return array Modified array. */ private function build_items( $data ) { // Extract items from physical_items, digital_items, etc. $items = array_reduce( array_keys( $data['line_items'] ), function( $list, $key ) use ( $data ) { return $list + (array) $data['line_items'][ $key ]; }, [] ); $items = array_map( [ $this, 'build_item' ], $items ); return $items; } /** * Returns cart data. * * @param \WP_REST_Request $request Request instance. * * @return \WP_REST_Response|\WP_Error */ public function get_items( $request ) { $cart_id = $request->get_param( 'cart_id' ); if ( empty( $cart_id ) ) { return rest_ensure_response( null ); } $request = new WP_REST_Request( 'GET', sprintf( '/%scarts/%s', trailingslashit( $this->proxy_base ), $cart_id ) ); $response = rest_do_request( $request ); if ( 200 !== $response->status || is_wp_error( $response ) || ! isset( $response->data['data'] ) ) { return rest_ensure_response( null ); } $data = $response->data['data']; $data['items'] = $this->build_items( $data ); $data['items_count'] = count( $data['items'] ); $data['total'] = apply_filters( 'bigcommerce/currency/format', sprintf( '¤%0.2f', $data['cart_amount'] ), $data['cart_amount'] ); return rest_ensure_response( $data ); } }
Methods
- get_items — Returns cart data.
- register_routes — Init endpoint.