Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
WordPress rest api for get all products by sorting like latest, price, rating or popularity
<?php
/**
* All Products By Sorting.
*
* @package :ewpapi
*/
/**
*
* Add an endpoint to show all products by sorting.
**/
class Ewpapi_All_Products_By_Sorting_REST_Controller {
/**
* Add an endpoint to show all products by sorting.
*/
public function __construct() {
add_action( 'rest_api_init', array( $this, 'products_by_sorting' ) );
}
/**
* Show all products by sorting.
*/
public function products_by_sorting() {
$route_namespace = apply_filters( 'ewpapi_route_namespace', 'ewpapi/v1' );
register_rest_route(
$route_namespace,
'/products-by-sorting',
array(
'methods' => 'POST',
'callback' => function( $data ) {
if ( empty( $data['number'] ) ) {
$post_per_page = 12;
} else {
$post_per_page = $data['number'];
}
$order = ! empty( $data['order'] ) ? $data['order'] : 'desc';
$orderby = ! empty( $data['orderby'] ) ? $data['orderby'] : 'date';
$args = array(
'post_status' => 'publish',
'post_type' => 'product',
'orderby' => $orderby,
'order' => $order,
'posts_per_page' => $post_per_page,
);
switch ( $orderby ) {
case 'price':
$args['meta_key'] = '_price';
$args['orderby'] = 'meta_value_num';
$order = ! empty( $data['order'] ) ? $data['order'] : 'asc';
$args['order'] = $order;
break;
case 'rating':
$args['orderby'] = 'meta_value_num';
$args['meta_key'] = '_wc_average_rating';
$order = ! empty( $data['order'] ) ? $data['order'] : 'desc';
$args['order'] = $order;
break;
case 'popularity':
$args['orderby'] = 'meta_value_num';
$args['meta_key'] = 'total_sales';
$order = ! empty( $data['order'] ) ? $data['order'] : 'desc';
$args['order'] = $order;
break;
}
$products_by_sorting = get_posts( $args );
if ( is_array( $products_by_sorting ) && ! empty( $products_by_sorting ) ) {
foreach ( $products_by_sorting as $products_by_sorting ) {
$product_id = $products_by_sorting->ID;
$image = get_the_post_thumbnail_url( $product_id );
$_product = wc_get_product( $product_id );
$regular_price = $_product->get_regular_price();
$sale_price = $_product->get_sale_price();
$price = $_product->get_price();
$short_description = wp_strip_all_tags( $_product->get_description() );
$items[] = array(
'id' => $products_by_sorting->ID,
'title' => $products_by_sorting->post_title,
'image' => $image,
'price' => $_product->get_price(),
'regular_price' => $_product->get_regular_price(),
'sale_price' => $sale_price,
'short_description' => $short_description,
'average_rating' => $_product->get_average_rating(),
'rating_count' => $_product->get_rating_count(),
);
}
return $items;
}
},
'args' => array(
'number' => array(),
'order' => array(
'validate_callback' => function( $param, $request, $key ) {
return is_string( $param );
},
'description' => 'Order of the products like asc or desc',
),
'orderby' => array(
'validate_callback' => function( $param, $request, $key ) {
return is_string( $param );
},
'description' => 'Order by the products like latest, price, rating or popularity',
),
),
'permission_callback' => function() {
return true;
},
)
);
}
}
$ewpapi_products_by_sorting = new Ewpapi_All_Products_By_Sorting_REST_Controller();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment