first commit

This commit is contained in:
Rachit Bhargava
2023-07-21 17:12:10 -04:00
parent d0fe47dde4
commit 5d0f0734d8
14003 changed files with 2829464 additions and 0 deletions

View File

@@ -0,0 +1,601 @@
<?php
/**
* InstalledExtensions class file.
*/
namespace Automattic\WooCommerce\Admin\Marketing;
use Automattic\WooCommerce\Admin\PluginsHelper;
/**
* Installed Marketing Extensions class.
*/
class InstalledExtensions {
/**
* Gets an array of plugin data for the "Installed marketing extensions" card.
*
* Valid extensions statuses are: installed, activated, configured
*/
public static function get_data() {
$data = [];
$automatewoo = self::get_automatewoo_extension_data();
$aw_referral = self::get_aw_referral_extension_data();
$aw_birthdays = self::get_aw_birthdays_extension_data();
$mailchimp = self::get_mailchimp_extension_data();
$facebook = self::get_facebook_extension_data();
$pinterest = self::get_pinterest_extension_data();
$google = self::get_google_extension_data();
$amazon_ebay = self::get_amazon_ebay_extension_data();
$mailpoet = self::get_mailpoet_extension_data();
$creative_mail = self::get_creative_mail_extension_data();
$tiktok = self::get_tiktok_extension_data();
$jetpack_crm = self::get_jetpack_crm_extension_data();
$zapier = self::get_zapier_extension_data();
$salesforce = self::get_salesforce_extension_data();
$vimeo = self::get_vimeo_extension_data();
$trustpilot = self::get_trustpilot_extension_data();
if ( $automatewoo ) {
$data[] = $automatewoo;
}
if ( $aw_referral ) {
$data[] = $aw_referral;
}
if ( $aw_birthdays ) {
$data[] = $aw_birthdays;
}
if ( $mailchimp ) {
$data[] = $mailchimp;
}
if ( $facebook ) {
$data[] = $facebook;
}
if ( $pinterest ) {
$data[] = $pinterest;
}
if ( $google ) {
$data[] = $google;
}
if ( $amazon_ebay ) {
$data[] = $amazon_ebay;
}
if ( $mailpoet ) {
$data[] = $mailpoet;
}
if ( $creative_mail ) {
$data[] = $creative_mail;
}
if ( $tiktok ) {
$data[] = $tiktok;
}
if ( $jetpack_crm ) {
$data[] = $jetpack_crm;
}
if ( $zapier ) {
$data[] = $zapier;
}
if ( $salesforce ) {
$data[] = $salesforce;
}
if ( $vimeo ) {
$data[] = $vimeo;
}
if ( $trustpilot ) {
$data[] = $trustpilot;
}
return $data;
}
/**
* Get allowed plugins.
*
* @return array
*/
public static function get_allowed_plugins() {
return [
'automatewoo',
'mailchimp-for-woocommerce',
'creative-mail-by-constant-contact',
'facebook-for-woocommerce',
'pinterest-for-woocommerce',
'google-listings-and-ads',
'hubspot-for-woocommerce',
'woocommerce-amazon-ebay-integration',
'mailpoet',
];
}
/**
* Get AutomateWoo extension data.
*
* @return array|bool
*/
protected static function get_automatewoo_extension_data() {
$slug = 'automatewoo';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/automatewoo.svg';
if ( 'activated' === $data['status'] && function_exists( 'AW' ) ) {
$data['settingsUrl'] = admin_url( 'admin.php?page=automatewoo-settings' );
$data['docsUrl'] = 'https://automatewoo.com/docs/';
$data['status'] = 'configured'; // Currently no configuration step.
}
return $data;
}
/**
* Get AutomateWoo Refer a Friend extension data.
*
* @return array|bool
*/
protected static function get_aw_referral_extension_data() {
$slug = 'automatewoo-referrals';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/automatewoo.svg';
if ( 'activated' === $data['status'] ) {
$data['docsUrl'] = 'https://automatewoo.com/docs/refer-a-friend/';
$data['status'] = 'configured';
if ( function_exists( 'AW_Referrals' ) ) {
$data['settingsUrl'] = admin_url( 'admin.php?page=automatewoo-settings&tab=referrals' );
}
}
return $data;
}
/**
* Get AutomateWoo Birthdays extension data.
*
* @return array|bool
*/
protected static function get_aw_birthdays_extension_data() {
$slug = 'automatewoo-birthdays';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/automatewoo.svg';
if ( 'activated' === $data['status'] ) {
$data['docsUrl'] = 'https://automatewoo.com/docs/getting-started-with-birthdays/';
$data['status'] = 'configured';
if ( function_exists( 'AW_Birthdays' ) ) {
$data['settingsUrl'] = admin_url( 'admin.php?page=automatewoo-settings&tab=birthdays' );
}
}
return $data;
}
/**
* Get MailChimp extension data.
*
* @return array|bool
*/
protected static function get_mailchimp_extension_data() {
$slug = 'mailchimp-for-woocommerce';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/mailchimp.svg';
if ( 'activated' === $data['status'] && function_exists( 'mailchimp_is_configured' ) ) {
$data['docsUrl'] = 'https://mailchimp.com/help/connect-or-disconnect-mailchimp-for-woocommerce/';
$data['settingsUrl'] = admin_url( 'admin.php?page=mailchimp-woocommerce' );
if ( mailchimp_is_configured() ) {
$data['status'] = 'configured';
}
}
return $data;
}
/**
* Get Facebook extension data.
*
* @return array|bool
*/
protected static function get_facebook_extension_data() {
$slug = 'facebook-for-woocommerce';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/facebook-icon.svg';
if ( 'activated' === $data['status'] && function_exists( 'facebook_for_woocommerce' ) ) {
$integration = facebook_for_woocommerce()->get_integration();
if ( $integration->is_configured() ) {
$data['status'] = 'configured';
}
$data['settingsUrl'] = facebook_for_woocommerce()->get_settings_url();
$data['docsUrl'] = facebook_for_woocommerce()->get_documentation_url();
}
return $data;
}
/**
* Get Pinterest extension data.
*
* @return array|bool
*/
protected static function get_pinterest_extension_data() {
$slug = 'pinterest-for-woocommerce';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/pinterest.svg';
$data['docsUrl'] = 'https://woocommerce.com/document/pinterest-for-woocommerce/?utm_medium=product';
if ( 'activated' === $data['status'] && class_exists( 'Pinterest_For_Woocommerce' ) ) {
$pinterest_onboarding_completed = Pinterest_For_Woocommerce()::is_setup_complete();
if ( $pinterest_onboarding_completed ) {
$data['status'] = 'configured';
$data['settingsUrl'] = admin_url( 'admin.php?page=wc-admin&path=/pinterest/settings' );
} else {
$data['settingsUrl'] = admin_url( 'admin.php?page=wc-admin&path=/pinterest/landing' );
}
}
return $data;
}
/**
* Get Google extension data.
*
* @return array|bool
*/
protected static function get_google_extension_data() {
$slug = 'google-listings-and-ads';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/google.svg';
if ( 'activated' === $data['status'] && function_exists( 'woogle_get_container' ) && class_exists( '\Automattic\WooCommerce\GoogleListingsAndAds\MerchantCenter\MerchantCenterService' ) ) {
$merchant_center = woogle_get_container()->get( \Automattic\WooCommerce\GoogleListingsAndAds\MerchantCenter\MerchantCenterService::class );
if ( $merchant_center->is_setup_complete() ) {
$data['status'] = 'configured';
$data['settingsUrl'] = admin_url( 'admin.php?page=wc-admin&path=/google/settings' );
} else {
$data['settingsUrl'] = admin_url( 'admin.php?page=wc-admin&path=/google/start' );
}
$data['docsUrl'] = 'https://woocommerce.com/document/google-listings-and-ads/?utm_medium=product';
}
return $data;
}
/**
* Get Amazon / Ebay extension data.
*
* @return array|bool
*/
protected static function get_amazon_ebay_extension_data() {
$slug = 'woocommerce-amazon-ebay-integration';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/amazon-ebay.svg';
if ( 'activated' === $data['status'] && class_exists( '\CodistoConnect' ) ) {
$codisto_merchantid = get_option( 'codisto_merchantid' );
// Use same check as codisto admin tabs.
if ( is_numeric( $codisto_merchantid ) ) {
$data['status'] = 'configured';
}
$data['settingsUrl'] = admin_url( 'admin.php?page=codisto-settings' );
$data['docsUrl'] = 'https://woocommerce.com/document/multichannel-for-woocommerce-google-amazon-ebay-walmart-integration/?utm_medium=product';
}
return $data;
}
/**
* Get MailPoet extension data.
*
* @return array|bool
*/
protected static function get_mailpoet_extension_data() {
$slug = 'mailpoet';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/mailpoet.svg';
if ( 'activated' === $data['status'] && class_exists( '\MailPoet\API\API' ) ) {
$mailpoet_api = \MailPoet\API\API::MP( 'v1' );
if ( ! method_exists( $mailpoet_api, 'isSetupComplete' ) || $mailpoet_api->isSetupComplete() ) {
$data['status'] = 'configured';
$data['settingsUrl'] = admin_url( 'admin.php?page=mailpoet-settings' );
} else {
$data['settingsUrl'] = admin_url( 'admin.php?page=mailpoet-newsletters' );
}
$data['docsUrl'] = 'https://kb.mailpoet.com/';
$data['supportUrl'] = 'https://www.mailpoet.com/support/';
}
return $data;
}
/**
* Get Creative Mail for WooCommerce extension data.
*
* @return array|bool
*/
protected static function get_creative_mail_extension_data() {
$slug = 'creative-mail-by-constant-contact';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/creative-mail-by-constant-contact.png';
if ( 'activated' === $data['status'] && class_exists( '\CreativeMail\Helpers\OptionsHelper' ) ) {
if ( ! method_exists( '\CreativeMail\Helpers\OptionsHelper', 'get_instance_id' ) || \CreativeMail\Helpers\OptionsHelper::get_instance_id() !== null ) {
$data['status'] = 'configured';
$data['settingsUrl'] = admin_url( 'admin.php?page=creativemail_settings' );
} else {
$data['settingsUrl'] = admin_url( 'admin.php?page=creativemail' );
}
$data['docsUrl'] = 'https://app.creativemail.com/kb/help/WooCommerce';
$data['supportUrl'] = 'https://app.creativemail.com/kb/help/';
}
return $data;
}
/**
* Get TikTok for WooCommerce extension data.
*
* @return array|bool
*/
protected static function get_tiktok_extension_data() {
$slug = 'tiktok-for-business';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/tiktok.jpg';
if ( 'activated' === $data['status'] ) {
if ( false !== get_option( 'tt4b_access_token' ) ) {
$data['status'] = 'configured';
}
$data['settingsUrl'] = admin_url( 'admin.php?page=tiktok' );
$data['docsUrl'] = 'https://woocommerce.com/document/tiktok-for-woocommerce/';
$data['supportUrl'] = 'https://ads.tiktok.com/athena/user-feedback/?identify_key=6a1e079024806640c5e1e695d13db80949525168a052299b4970f9c99cb5ac78';
}
return $data;
}
/**
* Get Jetpack CRM for WooCommerce extension data.
*
* @return array|bool
*/
protected static function get_jetpack_crm_extension_data() {
$slug = 'zero-bs-crm';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/jetpack-crm.png';
if ( 'activated' === $data['status'] ) {
$data['status'] = 'configured';
$data['settingsUrl'] = admin_url( 'admin.php?page=zerobscrm-plugin-settings' );
$data['docsUrl'] = 'https://kb.jetpackcrm.com/';
$data['supportUrl'] = 'https://kb.jetpackcrm.com/crm-support/';
}
return $data;
}
/**
* Get WooCommerce Zapier extension data.
*
* @return array|bool
*/
protected static function get_zapier_extension_data() {
$slug = 'woocommerce-zapier';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/zapier.png';
if ( 'activated' === $data['status'] ) {
$data['status'] = 'configured';
$data['settingsUrl'] = admin_url( 'admin.php?page=wc-settings&tab=wc_zapier' );
$data['docsUrl'] = 'https://docs.om4.io/woocommerce-zapier/';
}
return $data;
}
/**
* Get Salesforce extension data.
*
* @return array|bool
*/
protected static function get_salesforce_extension_data() {
$slug = 'integration-with-salesforce';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/salesforce.jpg';
if ( 'activated' === $data['status'] && class_exists( '\Integration_With_Salesforce_Admin' ) ) {
if ( ! method_exists( '\Integration_With_Salesforce_Admin', 'get_connection_status' ) || \Integration_With_Salesforce_Admin::get_connection_status() ) {
$data['status'] = 'configured';
}
$data['settingsUrl'] = admin_url( 'admin.php?page=integration-with-salesforce' );
$data['docsUrl'] = 'https://woocommerce.com/document/salesforce-integration/';
$data['supportUrl'] = 'https://wpswings.com/submit-query/';
}
return $data;
}
/**
* Get Vimeo extension data.
*
* @return array|bool
*/
protected static function get_vimeo_extension_data() {
$slug = 'vimeo';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/vimeo.png';
if ( 'activated' === $data['status'] && class_exists( '\Tribe\Vimeo_WP\Vimeo\Vimeo_Auth' ) ) {
if ( method_exists( '\Tribe\Vimeo_WP\Vimeo\Vimeo_Auth', 'has_access_token' ) ) {
$vimeo_auth = new \Tribe\Vimeo_WP\Vimeo\Vimeo_Auth();
if ( $vimeo_auth->has_access_token() ) {
$data['status'] = 'configured';
}
} else {
$data['status'] = 'configured';
}
$data['settingsUrl'] = admin_url( 'options-general.php?page=vimeo_settings' );
$data['docsUrl'] = 'https://woocommerce.com/document/vimeo/';
$data['supportUrl'] = 'https://vimeo.com/help/contact';
}
return $data;
}
/**
* Get Trustpilot extension data.
*
* @return array|bool
*/
protected static function get_trustpilot_extension_data() {
$slug = 'trustpilot-reviews';
if ( ! PluginsHelper::is_plugin_installed( $slug ) ) {
return false;
}
$data = self::get_extension_base_data( $slug );
$data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/trustpilot.png';
if ( 'activated' === $data['status'] ) {
$data['status'] = 'configured';
$data['settingsUrl'] = admin_url( 'admin.php?page=woocommerce-trustpilot-settings-page' );
$data['docsUrl'] = 'https://woocommerce.com/document/trustpilot-reviews/';
$data['supportUrl'] = 'https://support.trustpilot.com/hc/en-us/requests/new';
}
return $data;
}
/**
* Get an array of basic data for a given extension.
*
* @param string $slug Plugin slug.
*
* @return array|false
*/
protected static function get_extension_base_data( $slug ) {
$status = PluginsHelper::is_plugin_active( $slug ) ? 'activated' : 'installed';
$plugin_data = PluginsHelper::get_plugin_data( $slug );
if ( ! $plugin_data ) {
return false;
}
return [
'slug' => $slug,
'status' => $status,
'name' => $plugin_data['Name'],
'description' => html_entity_decode( wp_trim_words( $plugin_data['Description'], 20 ) ),
'supportUrl' => 'https://woocommerce.com/my-account/create-a-ticket/?utm_medium=product',
];
}
}

View File

@@ -0,0 +1,112 @@
<?php
/**
* Represents a marketing/ads campaign for marketing channels.
*
* Marketing channels (implementing MarketingChannelInterface) can use this class to map their campaign data and present it to WooCommerce core.
*/
namespace Automattic\WooCommerce\Admin\Marketing;
/**
* MarketingCampaign class
*
* @since x.x.x
*/
class MarketingCampaign {
/**
* The unique identifier.
*
* @var string
*/
protected $id;
/**
* The marketing campaign type.
*
* @var MarketingCampaignType
*/
protected $type;
/**
* Title of the marketing campaign.
*
* @var string
*/
protected $title;
/**
* The URL to the channel's campaign management page.
*
* @var string
*/
protected $manage_url;
/**
* The cost of the marketing campaign with the currency.
*
* @var Price
*/
protected $cost;
/**
* MarketingCampaign constructor.
*
* @param string $id The marketing campaign's unique identifier.
* @param MarketingCampaignType $type The marketing campaign type.
* @param string $title The title of the marketing campaign.
* @param string $manage_url The URL to the channel's campaign management page.
* @param Price|null $cost The cost of the marketing campaign with the currency.
*/
public function __construct( string $id, MarketingCampaignType $type, string $title, string $manage_url, Price $cost = null ) {
$this->id = $id;
$this->type = $type;
$this->title = $title;
$this->manage_url = $manage_url;
$this->cost = $cost;
}
/**
* Returns the marketing campaign's unique identifier.
*
* @return string
*/
public function get_id(): string {
return $this->id;
}
/**
* Returns the marketing campaign type.
*
* @return MarketingCampaignType
*/
public function get_type(): MarketingCampaignType {
return $this->type;
}
/**
* Returns the title of the marketing campaign.
*
* @return string
*/
public function get_title(): string {
return $this->title;
}
/**
* Returns the URL to manage the marketing campaign.
*
* @return string
*/
public function get_manage_url(): string {
return $this->manage_url;
}
/**
* Returns the cost of the marketing campaign with the currency.
*
* @return Price|null
*/
public function get_cost(): ?Price {
return $this->cost;
}
}

View File

@@ -0,0 +1,130 @@
<?php
/**
* Represents a marketing campaign type supported by a marketing channel.
*
* Marketing channels (implementing MarketingChannelInterface) can use this class to define what kind of campaigns they support.
*/
namespace Automattic\WooCommerce\Admin\Marketing;
/**
* MarketingCampaignType class
*
* @since x.x.x
*/
class MarketingCampaignType {
/**
* The unique identifier.
*
* @var string
*/
protected $id;
/**
* The marketing channel that this campaign type belongs to.
*
* @var MarketingChannelInterface
*/
protected $channel;
/**
* Name of the marketing campaign type.
*
* @var string
*/
protected $name;
/**
* Description of the marketing campaign type.
*
* @var string
*/
protected $description;
/**
* The URL to the create campaign page.
*
* @var string
*/
protected $create_url;
/**
* The URL to an image/icon for the campaign type.
*
* @var string
*/
protected $icon_url;
/**
* MarketingCampaignType constructor.
*
* @param string $id A unique identifier for the campaign type.
* @param MarketingChannelInterface $channel The marketing channel that this campaign type belongs to.
* @param string $name Name of the marketing campaign type.
* @param string $description Description of the marketing campaign type.
* @param string $create_url The URL to the create campaign page.
* @param string $icon_url The URL to an image/icon for the campaign type.
*/
public function __construct( string $id, MarketingChannelInterface $channel, string $name, string $description, string $create_url, string $icon_url ) {
$this->id = $id;
$this->channel = $channel;
$this->name = $name;
$this->description = $description;
$this->create_url = $create_url;
$this->icon_url = $icon_url;
}
/**
* Returns the marketing campaign's unique identifier.
*
* @return string
*/
public function get_id(): string {
return $this->id;
}
/**
* Returns the marketing channel that this campaign type belongs to.
*
* @return MarketingChannelInterface
*/
public function get_channel(): MarketingChannelInterface {
return $this->channel;
}
/**
* Returns the name of the marketing campaign type.
*
* @return string
*/
public function get_name(): string {
return $this->name;
}
/**
* Returns the description of the marketing campaign type.
*
* @return string
*/
public function get_description(): string {
return $this->description;
}
/**
* Returns the URL to the create campaign page.
*
* @return string
*/
public function get_create_url(): string {
return $this->create_url;
}
/**
* Returns the URL to an image/icon for the campaign type.
*
* @return string
*/
public function get_icon_url(): string {
return $this->icon_url;
}
}

View File

@@ -0,0 +1,90 @@
<?php
/**
* Represents a marketing channel for the multichannel-marketing feature.
*
* This interface will be implemented by third-party extensions to register themselves as marketing channels.
*/
namespace Automattic\WooCommerce\Admin\Marketing;
/**
* MarketingChannelInterface interface
*
* @since x.x.x
*/
interface MarketingChannelInterface {
public const PRODUCT_LISTINGS_NOT_APPLICABLE = 'not-applicable';
public const PRODUCT_LISTINGS_SYNC_IN_PROGRESS = 'sync-in-progress';
public const PRODUCT_LISTINGS_SYNC_FAILED = 'sync-failed';
public const PRODUCT_LISTINGS_SYNCED = 'synced';
/**
* Returns the unique identifier string for the marketing channel extension, also known as the plugin slug.
*
* @return string
*/
public function get_slug(): string;
/**
* Returns the name of the marketing channel.
*
* @return string
*/
public function get_name(): string;
/**
* Returns the description of the marketing channel.
*
* @return string
*/
public function get_description(): string;
/**
* Returns the path to the channel icon.
*
* @return string
*/
public function get_icon_url(): string;
/**
* Returns the setup status of the marketing channel.
*
* @return bool
*/
public function is_setup_completed(): bool;
/**
* Returns the URL to the settings page, or the link to complete the setup/onboarding if the channel has not been set up yet.
*
* @return string
*/
public function get_setup_url(): string;
/**
* Returns the status of the marketing channel's product listings.
*
* @return string
*/
public function get_product_listings_status(): string;
/**
* Returns the number of channel issues/errors (e.g. account-related errors, product synchronization issues, etc.).
*
* @return int The number of issues to resolve, or 0 if there are no issues with the channel.
*/
public function get_errors_count(): int;
/**
* Returns an array of marketing campaign types that the channel supports.
*
* @return MarketingCampaignType[] Array of marketing campaign type objects.
*/
public function get_supported_campaign_types(): array;
/**
* Returns an array of the channel's marketing campaigns.
*
* @return MarketingCampaign[]
*/
public function get_campaigns(): array;
}

View File

@@ -0,0 +1,66 @@
<?php
/**
* Handles the registration of marketing channels and acts as their repository.
*/
namespace Automattic\WooCommerce\Admin\Marketing;
use Exception;
/**
* MarketingChannels repository class
*
* @since x.x.x
*/
class MarketingChannels {
/**
* The registered marketing channels.
*
* @var MarketingChannelInterface[]
*/
private $registered_channels = [];
/**
* Registers a marketing channel.
*
* @param MarketingChannelInterface $channel The marketing channel to register.
*
* @return void
*
* @throws Exception If the given marketing channel is already registered.
*/
public function register( MarketingChannelInterface $channel ): void {
if ( isset( $this->registered_channels[ $channel->get_slug() ] ) ) {
throw new Exception( __( 'Marketing channel cannot be registered because there is already a channel registered with the same slug!', 'woocommerce' ) );
}
$this->registered_channels[ $channel->get_slug() ] = $channel;
}
/**
* Unregisters all marketing channels.
*
* @return void
*/
public function unregister_all(): void {
unset( $this->registered_channels );
}
/**
* Returns an array of all registered marketing channels.
*
* @return MarketingChannelInterface[]
*/
public function get_registered_channels(): array {
/**
* Filter the list of registered marketing channels.
*
* @param MarketingChannelInterface[] $channels Array of registered marketing channels.
*
* @since x.x.x
*/
$channels = apply_filters( 'woocommerce_marketing_channels', $this->registered_channels );
return array_values( $channels );
}
}

View File

@@ -0,0 +1,56 @@
<?php
/**
* Represents a price with a currency.
*/
namespace Automattic\WooCommerce\Admin\Marketing;
/**
* Price class
*
* @since x.x.x
*/
class Price {
/**
* The price.
*
* @var string
*/
protected $value;
/**
* The currency of the price.
*
* @var string
*/
protected $currency;
/**
* Price constructor.
*
* @param string $value The value of the price.
* @param string $currency The currency of the price.
*/
public function __construct( string $value, string $currency ) {
$this->value = $value;
$this->currency = $currency;
}
/**
* Get value of the price.
*
* @return string
*/
public function get_value(): string {
return $this->value;
}
/**
* Get the currency of the price.
*
* @return string
*/
public function get_currency(): string {
return $this->currency;
}
}