File "TargetAudienceController.php"
Full Path: /home/warrior1/public_html/wp-content/plugins/google-listings-and-ads/src/API/Site/Controllers/MerchantCenter/TargetAudienceController.php
File size: 8.18 KB
MIME-type: text/x-php
Charset: utf-8
<?php
declare( strict_types=1 );
namespace Automattic\WooCommerce\GoogleListingsAndAds\API\Site\Controllers\MerchantCenter;
use Automattic\WooCommerce\GoogleListingsAndAds\API\Site\Controllers\BaseOptionsController;
use Automattic\WooCommerce\GoogleListingsAndAds\API\Site\Controllers\CountryCodeTrait;
use Automattic\WooCommerce\GoogleListingsAndAds\API\TransportMethods;
use Automattic\WooCommerce\GoogleListingsAndAds\Google\GoogleHelper;
use Automattic\WooCommerce\GoogleListingsAndAds\Internal\Interfaces\ISO3166AwareInterface;
use Automattic\WooCommerce\GoogleListingsAndAds\Options\OptionsInterface;
use Automattic\WooCommerce\GoogleListingsAndAds\Proxies\RESTServer;
use Automattic\WooCommerce\GoogleListingsAndAds\Proxies\WC;
use Automattic\WooCommerce\GoogleListingsAndAds\Proxies\WP;
use Automattic\WooCommerce\GoogleListingsAndAds\Shipping\ShippingZone;
use Locale;
use WP_REST_Request as Request;
use WP_REST_Response as Response;
use function wp_get_available_translations;
defined( 'ABSPATH' ) || exit;
/**
* Class TargetAudienceController
*
* @package Automattic\WooCommerce\GoogleListingsAndAds\API\Site\Controllers\MerchantCenter
*/
class TargetAudienceController extends BaseOptionsController implements ISO3166AwareInterface {
use CountryCodeTrait;
/**
* The WP proxy object.
*
* @var WP
*/
protected $wp;
/**
* @var ShippingZone
*/
protected $shipping_zone;
/**
* @var WC
*/
protected $wc;
/**
* @var GoogleHelper
*/
protected $google_helper;
/**
* TargetAudienceController constructor.
*
* @param RESTServer $server
* @param WP $wp
* @param WC $wc
* @param ShippingZone $shipping_zone
* @param GoogleHelper $google_helper
*/
public function __construct( RESTServer $server, WP $wp, WC $wc, ShippingZone $shipping_zone, GoogleHelper $google_helper ) {
parent::__construct( $server );
$this->wp = $wp;
$this->wc = $wc;
$this->shipping_zone = $shipping_zone;
$this->google_helper = $google_helper;
}
/**
* Register rest routes with WordPress.
*/
public function register_routes(): void {
$this->register_route(
'mc/target_audience',
[
[
'methods' => TransportMethods::READABLE,
'callback' => $this->get_read_audience_callback(),
'permission_callback' => $this->get_permission_callback(),
],
[
'methods' => TransportMethods::CREATABLE,
'callback' => $this->get_update_audience_callback(),
'permission_callback' => $this->get_permission_callback(),
'args' => $this->get_schema_properties(),
],
'schema' => $this->get_api_response_schema_callback(),
]
);
$this->register_route(
'mc/target_audience/suggestions',
[
[
'methods' => TransportMethods::READABLE,
'callback' => $this->get_suggest_audience_callback(),
'permission_callback' => $this->get_permission_callback(),
],
'schema' => $this->get_api_response_schema_callback(),
]
);
}
/**
* Get the callback function for reading the target audience data.
*
* @return callable
*/
protected function get_read_audience_callback(): callable {
return function( Request $request ) {
return $this->prepare_item_for_response( $this->get_target_audience_option(), $request );
};
}
/**
* Get the callback function for suggesting the target audience data.
*
* @return callable
*
* @since 1.9.0
*/
protected function get_suggest_audience_callback(): callable {
return function( Request $request ) {
return $this->prepare_item_for_response( $this->get_target_audience_suggestion(), $request );
};
}
/**
* Get the callback function for updating the target audience data.
*
* @return callable
*/
protected function get_update_audience_callback(): callable {
return function( Request $request ) {
$data = $this->prepare_item_for_database( $request );
$this->update_target_audience_option( $data );
$this->prepare_item_for_response( $data, $request );
return new Response(
[
'status' => 'success',
'message' => __( 'Successfully updated the Target Audience settings.', 'google-listings-and-ads' ),
],
201
);
};
}
/**
* Retrieves all of the registered additional fields for a given object-type.
*
* @param string $object_type Optional. The object type.
*
* @return array Registered additional fields (if any), empty array if none or if the object type could
* not be inferred.
*/
protected function get_additional_fields( $object_type = null ): array {
$fields = parent::get_additional_fields( $object_type );
// Fields are expected to be an array with a 'get_callback' callable that returns the field value.
$fields['locale'] = [
'schema' => [
'type' => 'string',
'description' => __( 'The locale for the site.', 'google-listings-and-ads' ),
'context' => [ 'view' ],
'readonly' => true,
],
'get_callback' => function() {
return $this->wp->get_locale();
},
];
$fields['language'] = [
'schema' => [
'type' => 'string',
'description' => __( 'The language to use for product listings.', 'google-listings-and-ads' ),
'context' => [ 'view' ],
'readonly' => true,
],
'get_callback' => $this->get_language_callback(),
];
return $fields;
}
/**
* Get the option data for the target audience.
*
* @return array
*/
protected function get_target_audience_option(): array {
return $this->options->get( OptionsInterface::TARGET_AUDIENCE, [] );
}
/**
* Get the suggested values for the target audience option.
*
* @return string[]
*
* @since 1.9.0
*/
protected function get_target_audience_suggestion(): array {
$countries = $this->shipping_zone->get_shipping_countries();
$base_country = $this->wc->get_base_country();
// Add WooCommerce store country if it's supported and not already in the list.
if ( ! in_array( $base_country, $countries, true ) && $this->google_helper->is_country_supported( $base_country ) ) {
$countries[] = $base_country;
}
return [
'location' => 'selected',
'countries' => $countries,
];
}
/**
* Update the option data for the target audience.
*
* @param array $data
*
* @return bool
*/
protected function update_target_audience_option( array $data ): bool {
return $this->options->update( OptionsInterface::TARGET_AUDIENCE, $data );
}
/**
* Get the item schema for the controller.
*
* @return array
*/
protected function get_schema_properties(): array {
return [
'location' => [
'type' => 'string',
'description' => __( 'Location where products will be shown.', 'google-listings-and-ads' ),
'context' => [ 'edit', 'view' ],
'validate_callback' => 'rest_validate_request_arg',
'required' => true,
'enum' => [
'all',
'selected',
],
],
'countries' => [
'type' => 'array',
'description' => __(
'Array of country codes in ISO 3166-1 alpha-2 format.',
'google-listings-and-ads'
),
'context' => [ 'edit', 'view' ],
'sanitize_callback' => $this->get_country_code_sanitize_callback(),
'validate_callback' => $this->get_country_code_validate_callback(),
],
];
}
/**
* Get the item schema name for the controller.
*
* Used for building the API response schema.
*
* @return string
*/
protected function get_schema_title(): string {
return 'target_audience';
}
/**
* Get the callback to provide the language in use for the site.
*
* @return callable
*/
protected function get_language_callback(): callable {
$locale = $this->wp->get_locale();
// Default to using the Locale class if it is available.
if ( class_exists( Locale::class ) ) {
return function() use ( $locale ): string {
return Locale::getDisplayLanguage( $locale, $locale );
};
}
return function() use ( $locale ): string {
// en_US isn't provided by the translations API.
if ( 'en_US' === $locale ) {
return 'English';
}
require_once ABSPATH . 'wp-admin/includes/translation-install.php';
return wp_get_available_translations()[ $locale ]['native_name'] ?? $locale;
};
}
}