Current File : /home/pacjaorg/public_html/cop29/wp-content/plugins/optinmonster/OMAPI/MailPoet.php |
<?php
/**
* Mailpoet integration class.
*
* @since 1.9.10
*
* @package OMAPI
* @author Justin Sternberg
*/
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Mailpoet integration class.
*
* @since 1.9.10
*/
class OMAPI_MailPoet {
/**
* Check to see if Mailpoet is active.
*
* @since 1.2.3
*
* @return bool
*/
public static function is_active() {
return class_exists( 'WYSIJA_object' ) || class_exists( 'MailPoet\\API\\API' );
}
/**
* Returns the available MailPoet lists.
*
* @since 1.0.0
*
* @return array An array of MailPoet lists.
*/
public function get_lists() {
// Prepare variables.
$mailpoet = null;
$lists = array();
$ret = array();
$list_id_key = 'id';
// Get lists. Check for MailPoet 3 first. Default to legacy.
if ( class_exists( '\\MailPoet\\Config\\Initializer' ) ) {
/**
* Get the MailPoet lists.
*
* @see https://github.com/mailpoet/mailpoet/blob/c8fa9f007fd6fa39c17cd45e919566726a0578d7/doc/api_methods/GetLists.md
*/
$lists = \MailPoet\API\API::MP( 'v1' )->getLists();
} else {
$mailpoet = WYSIJA::get( 'list', 'model' );
$lists = $mailpoet->get( array( 'name', 'list_id' ), array( 'is_enabled' => 1 ) );
$list_id_key = 'list_id';
}
// Add default option.
$ret[] = array(
'name' => esc_html__( 'Select your MailPoet list...', 'optin-monster-api' ),
'value' => 'none',
);
// Loop through the list data and add to array.
foreach ( (array) $lists as $list ) {
$ret[] = array(
'name' => $list['name'],
'value' => $list[ $list_id_key ],
);
}
/**
* Filters the MailPoet lists.
*
* @param array $ret The MailPoet lists array.
* @param array $lists The raw MailPoet lists array. Format differs by plugin verison.
* @param WYSIJA|null $mailpoet The MailPoet object if using legacy. Null otherwise.
*/
return apply_filters( 'optin_monster_api_mailpoet_lists', $ret, $lists, $mailpoet );
}
/**
* Returns the available MailPoet subscriber fields.
*
* @see https://github.com/mailpoet/mailpoet/blob/c8fa9f007fd6fa39c17cd45e919566726a0578d7/doc/api_methods/GetSubscriberFields.md
*
* @since 1.9.8
*
* @return array An array of MailPoet subscriber fields.
*/
public function get_subscriber_fields() {
// Get lists. Check for MailPoet 3.
return class_exists( '\\MailPoet\\Config\\Initializer' )
? \MailPoet\API\API::MP( 'v1' )->getSubscriberFields()
: array();
}
/**
* Returns the available MailPoet custom fields formatted for dropdown.
*
* @since 1.9.8
*
* @return array An array of MailPoet custom fields.
*/
public function get_custom_fields_dropdown_values() {
// Prepare variables.
$ret = array();
$default_fields = array( 'email', 'first_name', 'last_name' );
// Add default option.
$ret[] = array(
'name' => esc_html__( 'Select the custom field...', 'optin-monster-api' ),
'value' => '',
);
$subscriber_fields = $this->get_subscriber_fields();
// Loop through the list data and add to array.
foreach ( (array) $subscriber_fields as $subscriber_field ) {
if ( in_array( $subscriber_field['id'], $default_fields, true ) ) {
continue;
}
$ret[] = array(
'name' => $subscriber_field['name'],
'value' => $subscriber_field['id'],
);
}
/**
* Filters the MailPoet custom fields.
*
* @param array. $ret The MailPoet custom fields array, except
* first name, last name and email
* @param array. $subscriber_fields The raw MailPoet subscriber fields array.
* Format differs by plugin verson.
*/
return apply_filters( 'optin_monster_api_mailpoet_custom_fields', $ret, $subscriber_fields );
}
/**
* Opts the user into MailPoet.
*
* @since 1.0.0
*/
public function handle_ajax_call() {
/*
* Check the nonce is correct first.
*
* As this is a front end form to store the visitor's data in a mailing
* list no capability check is required.
*/
check_ajax_referer( 'omapi', 'nonce' );
// Prepare variables.
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$optin_data = ! empty( $_REQUEST['optinData'] ) && is_array( $_REQUEST['optinData'] ) ? wp_unslash( $_REQUEST['optinData'] ) : array();
$data = array_merge( $_REQUEST, $optin_data );
unset( $data['optinData'] );
$optin = OMAPI::get_instance()->get_optin_by_slug( stripslashes( $data['optin'] ) );
$list = get_post_meta( $optin->ID, '_omapi_mailpoet_list', true );
$user = $this->prepare_subscriber_data( $optin, $data );
// Store the data.
$data = array(
'user' => $user,
'user_list' => array( 'list_ids' => array( $list ) ),
);
/**
* Filters the data before saving to MailPoet.
*
* @param array $data The data to save.
* @param array $request Deprecated. Use $_REQUEST instead.
* @param string $list The list to add the lead.
*/
$data = apply_filters( 'optin_monster_pre_optin_mailpoet', $data, array(), $list );
// Save the subscriber. Check for MailPoet 3 first. Default to legacy.
if ( class_exists( 'MailPoet\\API\\API' ) ) {
// Customize the lead data for MailPoet 3.
if ( isset( $user['firstname'] ) ) {
$user['first_name'] = $user['firstname'];
unset( $user['firstname'] );
}
if ( isset( $user['lastname'] ) ) {
$user['last_name'] = $user['lastname'];
unset( $user['lastname'] );
}
try {
/**
* Try to find the subscriber by email.
*
* @see https://github.com/mailpoet/mailpoet/blob/c8fa9f007fd6fa39c17cd45e919566726a0578d7/doc/api_methods/GetSubscriber.md
*/
$subscriber = \MailPoet\API\API::MP( 'v1' )->getSubscriber( $user['email'] );
} catch ( Exception $e ) {
$subscriber = false;
}
try {
if ( $subscriber ) {
/**
* Subscribe the existing subscriber to the list.
*
* @see https://github.com/mailpoet/mailpoet/blob/c8fa9f007fd6fa39c17cd45e919566726a0578d7/doc/api_methods/SubscribeToList.md
*/
\MailPoet\API\API::MP( 'v1' )->subscribeToList( $subscriber['email'], $list );
} else {
/**
* Add a new subscriber.
*
* @see https://github.com/mailpoet/mailpoet/blob/c8fa9f007fd6fa39c17cd45e919566726a0578d7/doc/api_methods/AddSubscriber.md
*/
\MailPoet\API\API::MP( 'v1' )->addSubscriber( $user, array( $list ) );
}
} catch ( Exception $e ) {
return wp_send_json_error( $e->getMessage(), 400 );
}
} else {
$user_helper = WYSIJA::get( 'user', 'helper' );
$user_helper->addSubscriber( $data );
}
// Send back a response.
wp_send_json_success();
}
/**
* Prepares the subscriber data that will be inserted/updated into the Mailpoet's API.
*
* @since 2.16.3
*
* @param WP_Post $optin The optin object.
* @param array $data The lead data from the optin request.
*
* @return array The updated subscriber data.
*/
protected function prepare_subscriber_data( $optin, $data ) {
$email = ! empty( $data['email'] ) ? stripslashes( $data['email'] ) : false;
$name = ! empty( $data['name'] ) ? stripslashes( $data['name'] ) : false;
$user = array();
// Possibly split name into first and last.
if ( $name ) {
$names = explode( ' ', $name );
if ( isset( $names[0] ) ) {
$user['firstname'] = $names[0];
}
if ( isset( $names[1] ) ) {
$user['lastname'] = $names[1];
}
}
// Save the email address.
$user['email'] = $email;
// Save the custom fields data into user array.
$user += $this->prepare_lead_custom_fields( $data, $optin->ID );
return $user;
}
/**
* Prepares and returns the custom fields to be sent to Mailpoet.
*
* @since 2.16.3
*
* @param array $data The request data.
* @param int $optin_id The optin ID.
*
* @return array The updated user data containing the custom fields and values as they will be sent to Mailpoet.
*/
protected function prepare_lead_custom_fields( $data, $optin_id ) {
$custom_fields = $this->get_lead_custom_fields( $optin_id, $data );
if ( empty( $custom_fields ) ) {
// If there's nothing to map, return an empty array.
return array();
}
$parsed_custom_fields = array();
$mapped_custom_fields = get_post_meta( $optin_id, '_omapi_mailpoet_mapped_fields', true );
$should_auto_create_fields = get_post_meta( $optin_id, '_omapi_mailpoet_fields_auto_create', true );
// Save a copy of the mapped fields as they saved in the database.
$saved_mapped_fields = $mapped_custom_fields;
$mp_fields = $this->get_subscriber_fields();
$mp_fields_by_id = array();
foreach ( $mp_fields as $field ) {
$mp_fields_by_id[ $field['id'] ] = $field;
}
if ( empty( $mapped_custom_fields ) ) {
$mapped_custom_fields = array();
}
// Keep old phone field mapping for backward compatibility.
$legacy_phone_field_mapping = get_post_meta( $optin_id, '_omapi_mailpoet_phone_field', true );
if ( ! empty( $legacy_phone_field_mapping ) ) {
// If there's a mapping for the phone field that means we already set the legacy mapping or the user manually
// set a different mapping. That means we don't need to set the legacy mapping.
if ( empty( $mapped_custom_fields['lead.phoneInput'] ) ) {
$mapped_custom_fields['lead.phoneInput'] = $legacy_phone_field_mapping;
}
}
foreach ( $custom_fields as $field_id => $field ) {
if ( empty( $mapped_custom_fields[ $field_id ] ) && ! $should_auto_create_fields ) {
// If the field is not mapped and auto field creation is disabled, skip it.
continue;
}
$field_key = '';
if ( ! empty( $mapped_custom_fields[ $field_id ] ) && ! empty( $mp_fields_by_id[ $mapped_custom_fields[ $field_id ] ] ) ) {
// If the field is already mapped and the mapped field exists, use the mapped field.
$field_key = $mapped_custom_fields[ $field_id ];
} elseif ( $should_auto_create_fields ) {
// If the field is not mapped, but auto field creation is enabled, create and map the field.
// Create the custom field in MailPoet.
$created_field = $this->create_custom_field( $field['label'], $field_id );
$field_key = $created_field['id'];
// Add the new created custom field to the mapped fields meta.
$mapped_custom_fields[ $field_id ] = $field_key;
}
// If the field key is empty, skip it. Safety check.
if ( empty( $field_key ) ) {
continue;
}
// If the value is an array (e.g. for checkboxes), we are converting it to a string.
$parsed_custom_fields[ $field_key ] = is_array( $field['value'] ) ?
implode( ', ', $field['value'] ) :
$field['value'];
}
if ( $saved_mapped_fields !== $mapped_custom_fields ) {
// Updating the mapped fields meta if new fields are added.
update_post_meta( $optin_id, '_omapi_mailpoet_mapped_fields', $mapped_custom_fields );
}
return $parsed_custom_fields;
}
/**
* Returns the custom fields for the lead.
*
* @since 2.16.3
*
* @param int $optin_id The optin ID.
* @param array $data The request data.
*
* @return array The custom fields for the lead.
*/
protected function get_lead_custom_fields( $optin_id, $data ) {
$meta_fields = ! empty( $data['meta'] ) ? stripslashes_deep( $data['meta'] ) : array();
$smart_tags = ! empty( $data['tags'] ) ? stripslashes_deep( $data['tags'] ) : array();
$optin_fields_config = get_post_meta( $optin_id, '_omapi_mailpoet_optin_fields_config', true );
$optin_meta_fields_by_name = array();
if ( ! empty( $optin_fields_config['meta'] ) ) {
foreach ( $optin_fields_config['meta'] as $field_config ) {
$optin_meta_fields_by_name[ $field_config['name'] ] = $field_config;
}
}
$custom_fields = array();
foreach ( $meta_fields as $key => $value ) {
$field_config = ! empty( $optin_meta_fields_by_name[ $key ] ) ? $optin_meta_fields_by_name[ $key ] : array();
$custom_fields[ 'meta.' . $key ] = array(
'value' => $value,
'label' => ! empty( $field_config['label'] ) ? $field_config['label'] : $key,
);
}
// Add the coupon code and label to the meta fields, if exists.
if ( ! empty( $smart_tags['coupon_code'] ) ) {
$custom_fields['tags.couponCode'] = array(
'value' => $smart_tags['coupon_code'],
'label' => 'Coupon Code',
);
$custom_fields['tags.couponLabel'] = array(
'value' => $smart_tags['coupon_label'],
'label' => 'Coupon Label',
);
}
// Add the privacy consent to the meta fields, if exists.
if ( ! empty( $data['FieldsElement--privacyText-checkbox'] ) ) {
$custom_fields['lead.privacyText'] = array(
'value' => $data['FieldsElement--privacyText-checkbox'],
'label' => 'Privacy Consent',
);
}
// Add the phone number to the meta fields, if exists.
if ( ! empty( $data['phone'] ) ) {
$custom_fields['lead.phoneInput'] = array(
'value' => $data['phone'],
'label' => 'Phone Number',
);
}
return $custom_fields;
}
/**
* Create a custom field in MailPoet.
*
* @see https://github.com/mailpoet/mailpoet/blob/trunk/doc/api_methods/AddSubscriberField.md
*
* @since 2.16.3
*
* @param string $name The field name.
* @param string $label The field label.
*
* @return array The created custom field.
*/
protected function create_custom_field( $name, $label ) {
$data = array(
'name' => $name,
'type' => 'TEXT',
'label' => $label,
);
// We are creating the custom fields only for Mailpoet 3 and later.
return \MailPoet\API\API::MP( 'v1' )->addSubscriberField( $data );
}
}