automatewoo/includes/Integrations/Mailpoet.php
fei-source 47d3c9a8b6 Update to v6.2.2
Source: GrootMade/Festinger Vault
2026-03-15 08:31:15 +08:00

191 lines
4.7 KiB
PHP

<?php
namespace AutomateWoo;
use MailPoet\API\MP\v1\APIException;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class integrating MailPoet API
*
* @see https://github.com/mailpoet/mailpoet/tree/trunk/doc
* @class Integration_Mailpoet
* @since 5.6.10
*/
class Integration_Mailpoet extends Integration {
/** @var string */
public $integration_id = 'mailpoet';
/**
* @var \MailPoet\API\MP\v1\API
*/
private $api;
private const STATUS_SUBSCRIBED = 'subscribed';
/**
* Constructor
*
* @param \MailPoet\API\MP\v1\API $api The API Object
*/
public function __construct( $api ) {
$this->api = $api;
}
/**
* The MailPoet Integration doesn't rely on a user provided API keym so we don't need to test it.
*
* @return bool
*/
public function test_integration(): bool {
return true;
}
/**
* Check if the integration is enabled.
*
* @return bool
*/
public function is_enabled(): bool {
return (bool) Integrations::is_mailpoet_active();
}
/**
* This functions allows adding hooks for MailPoet
*
* @since 5.7.0
*/
public function init_hooks() {
add_action( 'automatewoo/customer/opted_out', [ $this, 'sync_opt_out' ] );
add_action( 'automatewoo/customer/before_is_unsubscribed', [ $this, 'sync_subscribed_status' ] );
}
/**
* Get Mailpoet lists.
* It filters the list discarding those in trash.
*
* @return array An Associative array with the list ID as a key and the list name as a value.
*/
public function get_lists() {
$list_names = [];
$lists = $this->api->getLists();
foreach ( $lists as $list ) {
// getLists method includes trashed list. We exclude those from the returned list in AW.
if ( is_null( $list['deleted_at'] ) ) {
$list_names[ $list['id'] ] = $list['name'];
}
}
return $list_names;
}
/**
* Gets a subscriber by email.
* When the subscriber doesn't exist it returns null.
*
* @param string $subscriber_email The subscriber email.
* @return array|null The subscriber or null if it doesn't exist.
*/
private function get_subscriber( $subscriber_email ) {
try {
return $this->api->getSubscriber( $subscriber_email );
} catch ( \Exception $e ) {
return null;
}
}
/**
* Add a subscriber to a list. If the subscriber doesn't exist it will be created.
*
* @param array $subscriber_data Subscriber data.
* @param string $list_id List ID
* @param array $options API Call options. Like email confirmation.
* @throws APIException When the subscribe action fails.
*/
public function subscribe( $subscriber_data, $list_id, $options = [] ) {
$subscriber = $this->get_subscriber( $subscriber_data['email'] );
if ( is_null( $subscriber ) ) {
$this->api->addSubscriber( $subscriber_data, [ $list_id ], $options );
} else {
$this->api->subscribeToList( $subscriber['id'], $list_id, $options );
}
}
/**
* Removes a subscriber from a list. If the subscriber doesn't exist it fails.
*
* @param string $subscriber_email Subscriber data.
* @param string $list_id List ID
* @throws \Exception When the subscriber doesn't exist.
*/
public function unsubscribe( $subscriber_email, $list_id ) {
$subscriber = $this->get_subscriber( $subscriber_email );
if ( is_null( $subscriber ) ) {
throw new \Exception( "Subscriber doesn't exist" );
}
$this->api->unsubscribeFromList( $subscriber['id'], $list_id );
}
/**
* Opt-out a customer when that customer opt-out from AutomateWoo
*
* @see https://github.com/woocommerce/automatewoo/issues/1313
* @since 5.7.0
* @param Customer $customer The customer object.
*/
public function sync_opt_out( $customer ) {
$subscriber = $this->get_subscriber( $customer->get_email() );
if ( $this->is_subscribed( $subscriber ) ) {
try {
$this->api->unsubscribe( $customer->get_email() );
} catch ( APIException $e ) {
return;
}
}
}
/**
* Subscribes an AW user in case the user is subscribed in MailPoet
*
* @see Customer::is_unsubscribed()
* @since 5.7.0
* @param Customer $customer The customer object
*/
public function sync_subscribed_status( $customer ) {
// If customer is subscribed in AW, no need to verify MailPoet Status.
if ( true === $customer->get_is_subscribed() ) {
return;
}
$subscriber = $this->get_subscriber( $customer->get_email() );
// If customer is subscribed in MailPoet then we opt in the customer in AW.
if ( $this->is_subscribed( $subscriber ) ) {
$customer->opt_in();
}
}
/**
* Check if a user is subscribed.
*
* @param array $subscriber The subscriber data
* @return bool True if the user is subscribed.
*/
private function is_subscribed( $subscriber ) {
return ! is_null( $subscriber ) && $subscriber['status'] === self::STATUS_SUBSCRIBED;
}
}