Create new API endpoint for WC coupons
Because I haven't found an easy way how to use WP or WC API, I decided to create a MailPoet endpoint for getting coupons that allows me loading them via Ajax. [MAILPOET-5123]
This commit is contained in:
65
mailpoet/lib/API/JSON/v1/Coupons.php
Normal file
65
mailpoet/lib/API/JSON/v1/Coupons.php
Normal file
@@ -0,0 +1,65 @@
|
||||
<?php declare(strict_types = 1);
|
||||
|
||||
namespace MailPoet\API\JSON\v1;
|
||||
|
||||
use MailPoet\API\JSON\Endpoint as APIEndpoint;
|
||||
use MailPoet\API\JSON\SuccessResponse;
|
||||
use MailPoet\Config\AccessControl;
|
||||
use MailPoet\WooCommerce\Helper;
|
||||
use MailPoet\WP\Functions as WPFunctions;
|
||||
|
||||
class Coupons extends APIEndpoint {
|
||||
public const DEFAULT_PAGE_SIZE = 10;
|
||||
|
||||
/** @var Helper */
|
||||
public $helper;
|
||||
|
||||
/*** @var WPFunctions */
|
||||
private $wp;
|
||||
|
||||
public $permissions = [
|
||||
'global' => AccessControl::PERMISSION_MANAGE_EMAILS,
|
||||
];
|
||||
|
||||
public function __construct(
|
||||
WPFunctions $wp,
|
||||
Helper $helper
|
||||
) {
|
||||
$this->wp = $wp;
|
||||
$this->helper = $helper;
|
||||
}
|
||||
|
||||
public function getCoupons(array $data = []): SuccessResponse {
|
||||
$pageSize = $data['page_size'] ?? self::DEFAULT_PAGE_SIZE;
|
||||
$pageNumber = $data['page_number'] ?? 0;
|
||||
$discountType = $data['discount_type'] ?? null;
|
||||
$search = $data['search'] ?? null;
|
||||
$includeCouponId = $data['include_coupon_id'] ?? null;
|
||||
|
||||
return $this->successResponse(
|
||||
$this->formatCoupons($this->helper->getCouponList(
|
||||
(int)$pageSize,
|
||||
(int)$pageNumber,
|
||||
$discountType,
|
||||
$search,
|
||||
(int)$includeCouponId
|
||||
))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $couponPosts
|
||||
* @return array
|
||||
*/
|
||||
private function formatCoupons(array $couponPosts): array {
|
||||
return array_map(function (\WP_Post $post): array {
|
||||
$discountType = $this->wp->getPostMeta($post->ID, 'discount_type', true);
|
||||
return [
|
||||
'id' => $post->ID,
|
||||
'text' => $post->post_title, // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
|
||||
'excerpt' => $post->post_excerpt, // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
|
||||
'discountType' => $discountType,
|
||||
];
|
||||
}, $couponPosts);
|
||||
}
|
||||
}
|
@@ -70,6 +70,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
||||
$container->autowire(\MailPoet\API\JSON\v1\Analytics::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\API\JSON\v1\AutomatedLatestContent::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\API\JSON\v1\AutomaticEmails::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\API\JSON\v1\Coupons::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\API\JSON\v1\CustomFields::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\API\JSON\v1\DynamicSegments::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\API\JSON\v1\FeatureFlags::class)->setPublic(true);
|
||||
|
@@ -211,24 +211,46 @@ class Helper {
|
||||
return wc_get_order_statuses();
|
||||
}
|
||||
|
||||
public function getCouponList(): array {
|
||||
$couponPosts = $this->wp->getPosts([
|
||||
'posts_per_page' => -1,
|
||||
/**
|
||||
* @return array|\WP_Post[]
|
||||
*/
|
||||
public function getCouponList(
|
||||
int $pageSize = 10,
|
||||
int $pageNumber = 1,
|
||||
?string $discountType = null,
|
||||
?string $search = null,
|
||||
?int $includeCouponId = null
|
||||
): array {
|
||||
$args = [
|
||||
'posts_per_page' => $pageSize,
|
||||
'orderby' => 'name',
|
||||
'order' => 'asc',
|
||||
'post_type' => 'shop_coupon',
|
||||
'post_status' => 'publish',
|
||||
]);
|
||||
|
||||
return array_map(function(\WP_Post $post): array {
|
||||
$discountType = $this->wp->getPostMeta($post->ID, 'discount_type', true);
|
||||
return [
|
||||
'id' => $post->ID,
|
||||
'text' => $post->post_title, // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
|
||||
'excerpt' => $post->post_excerpt, // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
|
||||
'discountType' => $discountType,
|
||||
'paged' => $pageNumber,
|
||||
];
|
||||
}, $couponPosts);
|
||||
// Filtering coupons by discount type
|
||||
if ($discountType) {
|
||||
$args['meta_key'] = 'discount_type';
|
||||
$args['meta_value'] = $discountType;
|
||||
}
|
||||
// Search coupon by a query string
|
||||
if ($search) {
|
||||
$args['s'] = $search;
|
||||
}
|
||||
|
||||
$includeCoupons = [];
|
||||
// We need to include the coupon with the given ID in the first page
|
||||
if ($includeCouponId && $pageNumber === 1) {
|
||||
$includeArgs = $args;
|
||||
$includeArgs['include'] = [$includeCouponId];
|
||||
$includeCoupons = $this->wp->getPosts($includeArgs);
|
||||
}
|
||||
|
||||
// We remove duplicates because one of the remaining pages might contain the coupon with the given ID
|
||||
$result = array_merge($includeCoupons, $this->wp->getPosts($args));
|
||||
$result = array_unique($result, SORT_REGULAR);
|
||||
return array_values($result);
|
||||
}
|
||||
|
||||
public function wcGetPriceDecimalSeparator() {
|
||||
|
Reference in New Issue
Block a user