<?php
/**
* REST controller for getting products, extending of what WooCommerce
* does not provide at the moment.
*
* @package Kliken Marketing for Google
*/
namespace Kliken\WcPlugin;
defined( 'ABSPATH' ) || exit;
/**
* REST API Products controller class.
*
* @extends \WC_REST_Products_Controller
*/
class REST_Products_Controller extends \WC_REST_Products_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
protected $namespace = 'wc-kliken/v1';
/**
* Register the routes for products.
*/
public function register_routes() {
register_rest_route(
$this->namespace,
'/products/modified',
[
[
'methods' => \WP_REST_Server::READABLE,
'callback' => [ $this, 'get_items' ],
'permission_callback' => [ $this, 'get_items_permissions_check' ],
'args' => $this->get_collection_params(),
],
]
);
register_rest_route(
$this->namespace,
'/products/deleted',
[
[
'methods' => \WP_REST_Server::READABLE,
'callback' => [ $this, 'get_deleted_products' ],
'permission_callback' => [ $this, 'get_items_permissions_check' ],
],
]
);
}
/**
* Get deleted/trashed products.
*
* @param \WP_REST_Request $request Full details about the request.
* @return \WP_Error|\WP_REST_Response
*/
public function get_deleted_products( $request ) {
$page = intval( $request['page'] );
$per_page = intval( $request['per_page'] );
$use_gmt = $request['dates_are_gmt'];
$query_args = [
'fields' => 'ids', // We only need post ids for this.
'post_type' => $this->post_type,
'post_status' => 'trash',
'ignore_sticky_posts' => true,
'paged' => 0 === $page ? 1 : $page,
'posts_per_page' => 0 === $per_page ? 100 : $per_page,
'orderby' => 'date ID',
'order' => 'ASC',
];
$query_args['date_query'] = [];
// Set before into date query. Date query must be specified as an array of an array.
if ( isset( $request['before'] ) ) {
$query_args['date_query'][] = [
'column' => $use_gmt ? 'post_modified_gmt' : 'post_modified',
'before' => $request['before'],
];
}
// Set after into date query. Date query must be specified as an array of an array.
if ( isset( $request['after'] ) ) {
$query_args['date_query'][] = [
'column' => $use_gmt ? 'post_modified_gmt' : 'post_modified',
'after' => $request['after'],
];
}
$query = new \WP_Query();
$result = $query->query( $query_args );
$total_posts = $query->found_posts;
if ( $total_posts < 1 ) {
// Out-of-bounds, run the query again without LIMIT for total count.
unset( $query_args['paged'] );
$count_query = new \WP_Query();
$count_query->query( $query_args );
$total_posts = $count_query->found_posts;
}
$response = rest_ensure_response( $result );
$response->header( 'X-WP-Total', (int) $total_posts );
$response->header( 'X-WP-TotalPages', (int) ceil( $total_posts / (int) $query_args['posts_per_page'] ) );
return $response;
}
/**
* Prepare objects query to get modified products.
*
* @since 3.0.0
* @param \WP_REST_Request $request Full details about the request.
* @return array
*/
protected function prepare_objects_query( $request ) {
$args = parent::prepare_objects_query( $request );
// Reset the date query to look up post_modified column instead.
if ( ! empty( $args['date_query'] ) ) {
foreach ( $args['date_query'] as $key => $query ) {
if ( ! isset( $args['date_query'][ $key ]['column'] ) ) {
continue;
}
$args['date_query'][ $key ]['column'] = $request['dates_are_gmt']
? 'post_modified_gmt'
: 'post_modified';
}
}
return $args;
}
}