Files
roi-theme/wp-content/plugins/wp-marketing-automations/modules/utm/class-bwfan-unsubscribe.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

1088 lines
36 KiB
PHP
Executable File

<?php
class BWFAN_unsubscribe {
private static $ins = null;
protected $settings = null;
protected $recipient = '';
protected $uid = '';
protected $unsubscribe_lists = [];
protected $unsubscribe_all = false;
/** @var WooFunnels_Contact */
protected $contact = '';
/** @var BWFCRM_Contact */
protected $crm_contact = '';
protected $one_click = 0;
protected $unsubscribe_page = false;
protected $unsubscribe_redirect = null;
public function __construct() {
add_action( 'bwfan_db_1_0_tables_created', array( $this, 'create_unsubscribe_sample_page' ) );
add_action( 'wp', array( $this, 'unsubscribe_page_non_crawlable' ) );
add_action( 'wp', array( $this, 'unsubscribe_static_page' ), 100 );
/** Shortcodes for unsubscribe */
add_shortcode( 'bwfan_unsubscribe_button', array( $this, 'bwfan_unsubscribe_button' ) );
add_shortcode( 'wfan_unsubscribe_button', array( $this, 'bwfan_unsubscribe_button' ) );
add_shortcode( 'bwfan_subscriber_recipient', array( $this, 'bwfan_subscriber_recipient' ) );
add_shortcode( 'wfan_contact_email', array( $this, 'bwfan_subscriber_recipient' ) );
add_shortcode( 'bwfan_subscriber_name', array( $this, 'bwfan_subscriber_name' ) );
add_shortcode( 'wfan_contact_name', array( $this, 'bwfan_subscriber_name' ) );
add_shortcode( 'wfan_contact_firstname', array( $this, 'bwfan_subscriber_firstname' ) );
add_shortcode( 'wfan_contact_lastname', array( $this, 'bwfan_subscriber_lastname' ) );
/** Admin page selection call */
add_action( 'wp_ajax_bwfan_select_unsubscribe_page', array( $this, 'bwfan_select_unsubscribe_page' ) );
/** Front ajax call */
add_action( 'wp_ajax_bwfan_unsubscribe_user', array( $this, 'bwfan_unsubscribe_user' ) );
add_action( 'wp_ajax_nopriv_bwfan_unsubscribe_user', array( $this, 'bwfan_unsubscribe_user' ) );
/** Check if page built using elementor, delete the cache for the page */
if ( defined( 'ELEMENTOR_VERSION' ) && version_compare( ELEMENTOR_VERSION, '3.23.0', '>=' ) ) {
if ( ! ( ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) || ! is_admin() ) {
add_action( 'wp', array( $this, 'delete_elementor_cache' ) );
}
}
}
public static function get_instance() {
if ( null === self::$ins ) {
self::$ins = new self();
}
return self::$ins;
}
public function create_unsubscribe_sample_page() {
$global_settings = get_option( 'bwfan_global_settings', array() );
if ( isset( $global_settings['bwfan_unsubscribe_page'] ) && intval( $global_settings['bwfan_unsubscribe_page'] ) > 0 ) {
return;
}
$content = sprintf( __( "Hi %s \n\nHelp us to improve your experience with us through better communication. Please adjust your preferences for email %s. \n\n%s.", 'wp-marketing-automations' ), '[bwfan_subscriber_name]', '[bwfan_subscriber_recipient]', '[bwfan_unsubscribe_button label="Update my preference"]' ); // phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment, WordPress.WP.I18n.UnorderedPlaceholdersText
$new_page = array(
'post_title' => __( 'Let\'s Keep In Touch', 'wp-marketing-automations' ),
'post_content' => $content,
'post_status' => 'publish',
'post_type' => 'page',
);
$post_id = wp_insert_post( $new_page );
$global_settings['bwfan_unsubscribe_page'] = strval( $post_id );
update_option( 'bwfan_global_settings', $global_settings, true );
}
/**
* Adding noindex, nofollow meta tag for unsubscribe page
* Set data for execution
*
* @return void
*/
public function unsubscribe_page_non_crawlable() {
$global_settings = $this->get_global_settings();
$unsubscribe_page_id = isset( $global_settings['bwfan_unsubscribe_page'] ) ? $global_settings['bwfan_unsubscribe_page'] : 0;
if ( empty( $unsubscribe_page_id ) || ! is_page( $unsubscribe_page_id ) ) {
return;
}
$uid = filter_input( INPUT_GET, 'uid' );
if ( ! empty( $uid ) && ! headers_sent() ) {
BWFAN_Common::set_cookie( '_fk_contact_uid', $uid, time() + ( 10 * YEAR_IN_SECONDS ) );
}
$one_click = filter_input( INPUT_POST, 'List-Unsubscribe' );
if ( 'One-Click' === $one_click ) {
$this->bwfan_unsubscribe_user( true );
return;
}
$this->unsubscribe_page = true;
$one_click = filter_input( INPUT_GET, 'List-Unsubscribe' );
if ( 'One-Click' === $one_click ) {
$this->one_click = 1;
}
add_filter( 'bwfan_public_scripts_include', '__return_true' );
/** Set no cache header */
BWFAN_Common::nocache_headers();
add_action( 'wp_head', function () {
if ( 0 === $this->one_click ) {
return;
}
echo "<script>window.bwfan_unsubscribe_preference = 'one_click';</script>";
} );
}
/**
* Backward handling in case contact uid present and not an unsubscribe page
*
* @return void
*/
public function unsubscribe_static_page() {
if ( true === $this->unsubscribe_page ) {
return;
}
/** Not an unsubscribe page */
$uid = filter_input( INPUT_GET, 'uid' );
if ( empty( $uid ) ) {
return;
}
$action = filter_input( INPUT_GET, 'bwfan-action' );
if ( in_array( $action, [ 'subscribe', 'view_in_browser', 'incentive' ], true ) ) {
return;
}
$link_hash = filter_input( INPUT_GET, 'bwfan-link-trigger' );
if ( ! empty( $link_hash ) ) {
return;
}
$feed_id = filter_input( INPUT_GET, 'form_feed_id' );
if ( ! empty( $feed_id ) ) {
return;
}
$track_action = filter_input( INPUT_GET, 'bwfan-track-action' );
if ( 'unsubscribe' === $action && is_null( $track_action ) ) {
$this->set_data();
$this->display_unsubscribe_page();
return;
}
}
/**
* Display static unsubscribe page
*
* @return void
*/
protected function display_unsubscribe_page() {
if ( empty( $this->recipient ) ) {
return;
}
/** Mark contact unsubscribed */
$this->mark_unsubscribe( false );
$settings = BWFAN_Common::get_global_settings();
echo sprintf( "<h2>%s</h2>", esc_html__( 'Successfully Unsubscribed', 'wp-marketing-automations' ) );
if ( isset( $settings['bwfan_unsubscribe_data_success'] ) && ! empty( $settings['bwfan_unsubscribe_data_success'] ) ) {
echo sprintf( "<p>%s</p>", ( $settings['bwfan_unsubscribe_data_success'] ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
exit;
}
public function bwfan_unsubscribe_button( $attrs ) {
$attr = shortcode_atts( array(
'label' => __( 'Update my preference', 'wp-marketing-automations' ),
), $attrs );
ob_start();
echo "<style type='text/css'>
a#bwfan_unsubscribe {
text-shadow: none;
display: inline-block;
padding: 15px 20px;
cursor: pointer;
text-decoration: none !important;
}
.bwfan_loading{opacity: 1!important;position: relative;color: rgba(255,255,255,.05)!important;pointer-events: none!important;}
.bwfan_loading::-moz-selection {color: rgba(255, 255, 255, .05) !important;}
.bwfan_loading::selection {color: rgba(255, 255, 255, .05) !important;}
.bwfan_loading:after {animation: bwfan_spin 500ms infinite linear;border: 2px solid #fff;border-radius: 50%;border-right-color: transparent !important;border-top-color: transparent !important;content: '';display: block;width: 16px;height: 16px;top: 50%;left: 50%;margin-top: -8px;margin-left: -8px;position: absolute;}
@keyframes bwfan_spin { 0% {transform: rotate(0deg)}100% {transform: rotate(360deg)}}
</style>";
echo '<form id="bwfan_unsubscribe_fields">';
do_action( 'bwfan_print_custom_data', $this->contact );
$this->print_unsubscribe_lists();
echo '<a id="bwfan_unsubscribe" class="button-primary button" href="#">' . $attr['label'] . '</a>'; //phpcs:ignore WordPress.Security.EscapeOutput
$aid = filter_input( INPUT_GET, 'automation_id', FILTER_SANITIZE_NUMBER_INT );
if ( ! empty( $aid ) ) {
echo '<input type="hidden" id="bwfan_automation_id" value="' . esc_attr( $aid ) . '" name="automation_id">';
}
$bid = filter_input( INPUT_GET, 'bid', FILTER_SANITIZE_NUMBER_INT );
$bid = empty( $bid ) ? filter_input( INPUT_GET, 'broadcast_id', FILTER_SANITIZE_NUMBER_INT ) : $bid;
if ( ! empty( $bid ) ) {
echo '<input type="hidden" id="bwfan_broadcast_id" value="' . esc_attr( $bid ) . '" name="broadcast_id">';
}
$fid = filter_input( INPUT_GET, 'fid', FILTER_SANITIZE_NUMBER_INT );
$fid = empty( $fid ) ? filter_input( INPUT_GET, 'form_feed_id', FILTER_SANITIZE_NUMBER_INT ) : $fid;
if ( ! empty( $fid ) ) {
echo '<input type="hidden" id="bwfan_form_feed_id" value="' . esc_attr( $fid ) . '" name="form_feed_id">';
}
$uid = filter_input( INPUT_GET, 'uid' );
$uid = ! empty( $uid ) ? htmlspecialchars( $uid ) : '';
if ( empty( $uid ) && ! empty( $this->uid ) ) {
$uid = $this->uid;
}
if ( ! empty( $uid ) ) {
echo '<input type="hidden" id="bwfan_form_uid_id" value="' . esc_attr( $uid ) . '" name="uid">';
}
echo '<input type="hidden" id="bwfan_one_click" value="' . esc_attr( $this->one_click ) . '" name="one_click">';
$sid = filter_input( INPUT_GET, 'sid', FILTER_SANITIZE_NUMBER_INT );
if ( ! empty( $sid ) ) {
echo '<input type="hidden" id="bwfan_sid" value="' . esc_attr( $sid ) . '">';
}
echo '<input type="hidden" id="bwfan_unsubscribe_nonce" value="' . esc_attr( wp_create_nonce( 'bwfan-unsubscribe-nonce' ) ) . '" name="bwfan_unsubscribe_nonce">';
echo '</form>';
return ob_get_clean();
}
public function bwfan_subscriber_recipient( $attrs ) {
$attr = shortcode_atts( array(
'fallback' => 'john@example.com',
), $attrs );
$this->set_data();
$subscriber_details = $this->get_subscriber_details();
$mode = 1;
/** check if the mode 2 there then pass phone number instead of email */
if ( isset( $_GET['mode'] ) && 2 === absint( $_GET['mode'] ) ) {
$mode = 2;
}
if ( false !== $subscriber_details && 1 === absint( $mode ) && isset( $subscriber_details['subscriber_email'] ) ) { // WordPress.CSRF.NonceVerification.NoNonceVerification
$attr['fallback'] = sanitize_text_field( $subscriber_details['subscriber_email'] ); // WordPress.CSRF.NonceVerification.NoNonceVerification
} elseif ( false !== $subscriber_details && isset( $subscriber_details['subscriber_phone'] ) ) {
$attr['fallback'] = sanitize_text_field( $subscriber_details['subscriber_phone'] );
}
return '<span id="bwfan_unsubscribe_recipient">' . $attr['fallback'] . '</span>';
}
public function bwfan_subscriber_name( $attrs ) {
$attr = shortcode_atts( array(
'fallback' => 'John',
), $attrs );
$this->set_data();
$subscriber_details = $this->get_subscriber_details();
if ( false !== $subscriber_details && isset( $subscriber_details['subscriber_name'] ) ) { // WordPress.CSRF.NonceVerification.NoNonceVerification
$attr['fallback'] = sanitize_text_field( $subscriber_details['subscriber_name'] ); // WordPress.CSRF.NonceVerification.NoNonceVerification
}
return '<span id="bwfan_unsubscribe_name">' . $attr['fallback'] . '</span>';
}
public function bwfan_subscriber_firstname( $attrs ) {
$attr = shortcode_atts( array(
'fallback' => 'John',
), $attrs );
$this->set_data();
$subscriber_details = $this->get_subscriber_details();
if ( false !== $subscriber_details && isset( $subscriber_details['subscriber_firstname'] ) ) { // WordPress.CSRF.NonceVerification.NoNonceVerification
$attr['fallback'] = sanitize_text_field( $subscriber_details['subscriber_firstname'] ); // WordPress.CSRF.NonceVerification.NoNonceVerification
}
return '<span id="bwfan_unsubscribe_name">' . $attr['fallback'] . '</span>';
}
public function bwfan_subscriber_lastname( $attrs ) {
$attr = shortcode_atts( array(
'fallback' => 'Doe',
), $attrs );
$this->set_data();
$subscriber_details = $this->get_subscriber_details();
if ( false !== $subscriber_details && isset( $subscriber_details['subscriber_lastname'] ) ) { // WordPress.CSRF.NonceVerification.NoNonceVerification
$attr['fallback'] = sanitize_text_field( $subscriber_details['subscriber_lastname'] ); // WordPress.CSRF.NonceVerification.NoNonceVerification
}
return '<span id="bwfan_unsubscribe_name">' . $attr['fallback'] . '</span>';
}
public function print_unsubscribe_lists() {
/** If admin screen, return */
if ( is_admin() ) {
return false;
}
$this->set_data();
if ( ! bwfan_is_autonami_pro_active() ) {
$this->only_unsubscribe_from_all_lists_html();
return false;
}
$settings = $this->get_global_settings();
/** One click unsubscribe call via get request */
if ( 1 === $this->one_click ) {
$this->only_unsubscribe_from_all_lists_html();
return false;
}
$enabled = isset( $settings['bwfan_unsubscribe_lists_enable'] ) ? $settings['bwfan_unsubscribe_lists_enable'] : 0;
if ( 0 === absint( $enabled ) ) {
$this->only_unsubscribe_from_all_lists_html();
return false;
}
$lists = isset( $settings['bwfan_unsubscribe_public_lists'] ) ? $settings['bwfan_unsubscribe_public_lists'] : [];
if ( empty( $lists ) || ! is_array( $lists ) ) {
$this->only_unsubscribe_from_all_lists_html();
return false;
}
if ( ! $this->contact instanceof WooFunnels_Contact || 0 === $this->contact->get_id() ) {
$this->only_unsubscribe_from_all_lists_html();
return false;
}
$lists = array_map( 'absint', $lists );
$is_unsubscribed = false;
$subscribed_lists = array();
if ( $this->crm_contact instanceof BWFCRM_Contact ) {
/** Is Unsubscribed Flag */
$is_unsubscribed = BWFCRM_Contact::$DISPLAY_STATUS_UNSUBSCRIBED === $this->crm_contact->get_display_status();
$contact_lists = $this->get_contact_lists();
$subscribed_lists = $contact_lists['subscribed'];
$contact_lists = $contact_lists['all'];
/** Show contact their subscribed public lists only */
$visibility = isset( $settings['bwfan_unsubscribe_lists_visibility'] ) ? $settings['bwfan_unsubscribe_lists_visibility'] : 0;
if ( 1 === intval( $visibility ) || true === $visibility || 'true' === $visibility ) {
/** Common lists from public lists and contact lists */
$lists = array_values( array_intersect( $contact_lists, $lists ) );
}
if ( empty( $lists ) ) {
$this->only_unsubscribe_from_all_lists_html( $this->crm_contact );
return false;
}
}
$lists = BWFCRM_Lists::get_lists( $lists );
usort( $lists, function ( $l1, $l2 ) {
return strcmp( strtolower( $l1['name'] ), strtolower( $l2['name'] ) );
} );
$this->unsubscribe_lists_html( $lists, $subscribed_lists, $is_unsubscribed );
return true;
}
public function only_unsubscribe_from_all_lists_html( $contact = false ) {
if ( false === $contact && $this->crm_contact instanceof BWFCRM_Contact ) {
$contact = $this->crm_contact;
}
/** In case Pro is active and Contact is valid */
if ( bwfan_is_autonami_pro_active() && class_exists( 'BWFCRM_Contact' ) && $contact instanceof BWFCRM_Contact ) {
$is_unsubscribed = ( BWFCRM_Contact::$DISPLAY_STATUS_UNSUBSCRIBED === $contact->get_display_status() );
$this->unsubscribe_lists_html( array(), array(), $is_unsubscribed );
return;
}
/** If Pro is not active OR Contact is not valid */
$is_unsubscribed = false;
if ( $this->contact instanceof WooFunnels_Contact ) {
$data = array(
'recipient' => array( $this->contact->get_email(), $this->contact->get_contact_no() ),
);
$unsubscribed_rows = BWFAN_Model_Message_Unsubscribe::get_message_unsubscribe_row( $data, false );
if ( 0 < count( $unsubscribed_rows ) ) {
$is_unsubscribed = true;
}
}
$this->unsubscribe_lists_html( array(), array(), $is_unsubscribed );
}
public function unsubscribe_lists_html( $lists = array(), $subscribed_lists = array(), $is_unsubscribed = false ) {
$settings = $this->get_global_settings();
$label = isset( $settings['bwfan_unsubscribe_from_all_label'] ) && ! empty( $settings['bwfan_unsubscribe_from_all_label'] ) ? $settings['bwfan_unsubscribe_from_all_label'] : __( '"Unsubscribe From All" Label', 'wp-marketing-automations' );
$description = isset( $settings['bwfan_unsubscribe_from_all_description'] ) ? $settings['bwfan_unsubscribe_from_all_description'] : '';
?>
<style>
.bwfan-unsubscribe-single-list {
border-bottom: 1px solid #aaa;
padding: 20px;
}
.bwfan-unsubscribe-single-list:last-child {
border: none;
padding: 20px;
}
.bwfan-unsubscribe-single-list p {
margin-top: 3px;
margin-bottom: 0;
}
.bwfan-unsubscribe-single-list label {
margin-left: 10px;
}
p.bwfan-unsubscribe-list-description {
font-size: 14px;
}
.bwfan-unsubscribe-lists {
margin-bottom: 30px;
}
.bwfan-unsubscribe-from-all-lists label {
font-size: 16px;
font-weight: 500;
}
.bwfan_response {
margin-top: 12px;
}
</style>
<div class="bwfan-unsubscribe-lists" id="bwfan-unsubscribe-lists">
<?php
foreach ( $lists as $list ) {
$is_checked = in_array( absint( $list['ID'] ), $subscribed_lists ) && ! $is_unsubscribed;
?>
<div class="bwfan-unsubscribe-single-list">
<div class="bwfan-unsubscribe-list-checkbox">
<input
id="bwfan-list-<?php echo esc_attr( $list['ID'] ); ?>"
type="checkbox"
value="<?php echo esc_attr( $list['ID'] ); ?>"
<?php echo $is_checked ? 'checked="checked"' : ''; ?>
/>
<label for="bwfan-list-<?php echo esc_attr( $list['ID'] ); ?>"><?php echo $list['name']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></label>
</div>
<?php if ( isset( $list['description'] ) ) : ?>
<p class="bwfan-unsubscribe-list-description"><?php echo $list['description']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></p>
<?php endif; ?>
</div>
<?php
}
?>
<!-- Global Unsubscription option -->
<div class="bwfan-unsubscribe-single-list bwfan-unsubscribe-from-all-lists">
<div class="bwfan-unsubscribe-list-checkbox">
<input id="bwfan-list-unsubscribe-all" type="checkbox" value="unsubscribe_all" <?php echo esc_html( $is_unsubscribed ? 'checked="checked"' : '' ); ?> />
<label for="bwfan-list-unsubscribe-all"><?php echo $label; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></label>
</div>
<?php if ( ! empty( $description ) ) : ?>
<p class="bwfan-unsubscribe-list-description"><?php echo $description; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></p>
<?php endif; ?>
</div>
</div>
<?php
}
public function bwfan_select_unsubscribe_page() {
BWFAN_Common::nocache_headers();
global $wpdb;
$term = isset( $_POST['search_term']['term'] ) ? sanitize_text_field( $_POST['search_term']['term'] ) : ''; // WordPress.CSRF.NonceVerification.NoNonceVerification
$v2 = isset( $_POST['fromApp'] ) && $_POST['fromApp'] ? true : false;
$results = $wpdb->get_results( $wpdb->prepare( "SELECT ID,post_title FROM {$wpdb->prefix}posts WHERE post_title LIKE %s and post_type = %s and post_status =%s", '%' . $term . '%', 'page', 'publish' ) ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
if ( empty( $results ) || ! is_array( $results ) ) {
wp_send_json( array(
'results' => [],
) );
}
$response = array();
foreach ( $results as $result ) {
if ( $v2 ) {
$response[] = array(
'key' => $result->ID,
'value' => $result->post_title,
);
} else {
$response[] = array(
'id' => $result->ID,
'text' => $result->post_title,
'value' => $result->ID,
'label' => $result->post_title,
);
}
}
wp_send_json( array(
'results' => $response,
) );
}
public function bwfan_unsubscribe_user( $post = false ) {
BWFAN_Common::nocache_headers();
/** Security check */
$nonce = ( isset( $_POST['_nonce'] ) ) ? sanitize_text_field( $_POST['_nonce'] ) : ''; //phpcs:ignore WordPress.Security.NonceVerification
if ( ! isset( $_POST['form_not_exist'] ) && false === $post && ! wp_verify_nonce( $nonce, 'bwfan-unsubscribe-nonce' ) ) {
$this->return_message( 7 );
}
/** Set contact data */
$this->set_data();
/** If data is not present then return */
if ( empty( $this->contact ) ) {
$this->return_message( 1 );
}
do_action( 'bwfan_save_custom_field_data', $this->contact );
$one_click = filter_input( INPUT_POST, 'one_click' );
if ( true === $post || 1 === intval( $one_click ) ) {
$one_click_get = filter_input( INPUT_POST, 'one_click_get' );
if ( 1 === intval( $one_click_get ) ) {
/** remove list from contact */
$redirect_url = apply_filters( 'fka_redirect_confirm_unsubscribed', '', $this->contact );
if ( ! empty( $redirect_url ) ) {
$this->unsubscribe_redirect = $redirect_url;
}
}
$this->mark_unsubscribe();
return;
}
if ( false === $this->is_lists_display_active() ) {
/** Just Unsubscribe or resubscribe only */
$this->maybe_subscribe_or_unsubscribe();
/** Will return from the function itself */
}
/** Maybe complete unsubscribe - all case */
if ( true === $this->unsubscribe_all ) {
/** remove list from contact */
$redirect_url = apply_filters( 'fka_redirect_confirm_unsubscribed', '', $this->contact );
if ( ! empty( $redirect_url ) ) {
$this->unsubscribe_redirect = $redirect_url;
}
$this->unsubscribe_all_lists();
/** Will return from the function itself */
return;
}
/** Not an all case */
$this->handle_unsubscribe_lists();
}
/**
* Set contact data from the query arguments
*
* @return void
*/
protected function set_data() {
if ( ! empty( $this->contact ) ) {
return;
}
$uid = filter_input( INPUT_POST, 'uid' );
$uid = empty( $uid ) ? filter_input( INPUT_GET, 'uid' ) : $uid;
$uid = sanitize_text_field( $uid );
/** If none available then return */
if ( empty( $uid ) ) {
if ( ! is_user_logged_in() ) {
return;
}
$this->get_logged_in_contact();
if ( ! empty( $this->uid ) ) {
$uid = $this->uid;
}
}
if ( empty( $uid ) ) {
return;
}
$contact = new WooFunnels_Contact( '', '', '', '', $uid );
if ( $contact instanceof WooFunnels_Contact && $contact->get_id() > 0 ) {
$this->contact = $contact;
$this->recipient = $contact->get_email();
if ( class_exists( 'BWFCRM_Contact' ) ) {
$crm_contact = new BWFCRM_Contact( $contact );
if ( $crm_contact->is_contact_exists() ) {
$this->crm_contact = $crm_contact;
}
}
}
if ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) {
return;
}
/** Set up unsubscribe lists */
$lists = filter_input( INPUT_POST, 'unsubscribe_lists' );
if ( ! empty( $lists ) ) {
$lists = stripslashes_deep( $lists );
$lists = json_decode( $lists, true );
}
if ( ! empty( $lists ) ) {
$lists = array_map( 'sanitize_text_field', $lists );
$lists = array_map( 'strval', $lists );
}
$this->unsubscribe_all = ! empty( $lists ) && in_array( 'all', $lists, true ) ? true : false;
if ( true === $this->unsubscribe_all ) {
$lists = array_diff( $lists, [ 'all' ] );
sort( $lists );
}
$this->unsubscribe_lists = $lists;
}
/**
* Set global settings and return
*
* @return mixed|void
*/
protected function get_global_settings() {
if ( is_null( $this->settings ) ) {
$this->settings = BWFAN_Common::get_global_settings();
}
return $this->settings;
}
/**
* Check if lists visibility enabled
* @return bool
*/
protected function is_lists_display_active() {
/** checking for autonami pro plugin */
if ( ! bwfan_is_autonami_pro_active() ) {
return false;
}
$settings = $this->get_global_settings();
$active = ( isset( $settings['bwfan_unsubscribe_lists_enable'] ) && true === $settings['bwfan_unsubscribe_lists_enable'] ) ? true : false;
return $active;
}
/**
* Subscribe or Unsubscribe contact
*
* @return void
*/
protected function maybe_subscribe_or_unsubscribe() {
if ( true === $this->unsubscribe_all ) {
$redirect_url = apply_filters( 'fka_redirect_confirm_unsubscribed', '', $this->contact );
if ( ! empty( $redirect_url ) ) {
$this->unsubscribe_redirect = $redirect_url;
}
$this->mark_unsubscribe();
return;
}
$this->mark_subscribe();
}
/**
* Unsubscribe contact
* If assigned public lists then un-assign
*
* @return void
*/
public function unsubscribe_all_lists() {
$contact = $this->crm_contact;
$lists = $this->get_contact_lists();
$subscribed_lists = $lists['subscribed'];
$visible_lists = $this->get_visible_lists();
$lists_to_unsub = array_values( array_intersect( $visible_lists, $subscribed_lists ) );
sort( $lists_to_unsub );
if ( ! empty( $lists_to_unsub ) ) {
$contact->remove_lists( $lists_to_unsub );
}
$contact->contact->set_last_modified( current_time( 'mysql', 1 ) );
if ( method_exists( $contact, 'save' ) ) {
$contact->save();
} else {
$contact->contact->save();
}
/** Unsubscribe from lists which are unchecked, but are assigned to contact */
$this->update_unassigned_lists_field( $lists_to_unsub );
/** Mark unsubscribe */
$this->mark_unsubscribe();
}
/**
* Subscribe contact if not subscribed
* Assign or Un-assign lists
*
* @return void
*/
public function handle_unsubscribe_lists() {
$unsubscribe_lists = $this->unsubscribe_lists;
$visible_lists = $this->get_visible_lists();
/**
* Assign lists which are not checked and already not assigned
*/
$lists_to_sub = array_diff( $visible_lists, $unsubscribe_lists );
sort( $lists_to_sub );
if ( is_array( $lists_to_sub ) && count( $lists_to_sub ) > 0 ) {
$assigned_list = [];
foreach ( $lists_to_sub as $list ) {
$assigned_list[] = array( 'id' => $list, 'value' => '' );
}
$this->crm_contact->add_lists( $assigned_list );
$this->crm_contact->save();
}
/** Maybe subscribe the contact */
if ( BWFCRM_Contact::$DISPLAY_STATUS_UNSUBSCRIBED === $this->crm_contact->get_display_status() ) {
$this->crm_contact->resubscribe();
}
$contact_lists = $this->get_contact_lists();
$subscribe_lists = $contact_lists['subscribed'];
$lists_to_unsub = array_values( array_intersect( $unsubscribe_lists, $subscribe_lists ) );
sort( $lists_to_unsub );
if ( ! empty( $lists_to_unsub ) ) {
$this->crm_contact->remove_lists( $lists_to_unsub );
}
$this->crm_contact->contact->set_last_modified( current_time( 'mysql', 1 ) );
$this->crm_contact->save();
/** Unsubscribe from lists which are unchecked, but are assigned to contact */
$this->update_unassigned_lists_field( $lists_to_unsub );
$this->return_message( 3 );
}
/**
* Mark contact unsubscribe
*
* @param $return
*
* @return void
*/
protected function mark_unsubscribe( $return = true ) {
global $wpdb;
$automation_id = filter_input( INPUT_POST, 'automation_id', FILTER_SANITIZE_NUMBER_INT );
$broadcast_id = filter_input( INPUT_POST, 'broadcast_id', FILTER_SANITIZE_NUMBER_INT );
$form_feed_id = filter_input( INPUT_POST, 'form_feed_id', FILTER_SANITIZE_NUMBER_INT );
$sid = filter_input( INPUT_POST, 'sid', FILTER_SANITIZE_NUMBER_INT );
$automation_id = empty( $automation_id ) ? filter_input( INPUT_GET, 'automation_id', FILTER_SANITIZE_NUMBER_INT ) : $automation_id;
$broadcast_id = empty( $broadcast_id ) ? filter_input( INPUT_GET, 'broadcast_id', FILTER_SANITIZE_NUMBER_INT ) : $broadcast_id;
$form_feed_id = empty( $form_feed_id ) ? filter_input( INPUT_GET, 'form_feed_id', FILTER_SANITIZE_NUMBER_INT ) : $form_feed_id;
$sid = empty( $sid ) ? filter_input( INPUT_GET, 'sid', FILTER_SANITIZE_NUMBER_INT ) : $sid;
$sid = empty( $sid ) ? 0 : $sid;
$mode = 0;
if ( false !== filter_var( $this->recipient, FILTER_VALIDATE_EMAIL ) ) {
$mode = 1;
} elseif ( is_numeric( $this->recipient ) ) {
$mode = 2;
} else {
$this->return_message( 1 );
}
/**
* Checking if recipient already added to unsubscribe table
*/
$where = $wpdb->prepare( "WHERE `recipient` = %s and `mode` = %d", sanitize_text_field( $this->recipient ), $mode );
$unsubscribers = $wpdb->get_var( "SELECT ID FROM {$wpdb->prefix}bwfan_message_unsubscribe $where ORDER BY ID DESC LIMIT 0,1 " ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
if ( $unsubscribers > 0 ) {
$this->return_message( 6 );
}
/** Manual (Single Sending) */
$c_type = 3;
if ( ! empty( $automation_id ) ) {
$c_type = 1;
} elseif ( ! empty( $broadcast_id ) ) {
$c_type = 2;
} elseif ( ! empty( $form_feed_id ) ) {
$c_type = 4;
}
$oid = 0;
if ( ! empty( $automation_id ) ) {
$oid = absint( $automation_id );
} elseif ( ! empty( $broadcast_id ) ) {
$oid = absint( $broadcast_id );
} elseif ( ! empty( $form_feed_id ) ) {
$oid = absint( $form_feed_id );
}
$insert_data = array(
'recipient' => $this->recipient,
'c_date' => current_time( 'mysql' ),
'mode' => $mode,
'automation_id' => $oid,
'c_type' => $c_type,
'sid' => $sid,
);
BWFAN_Model_Message_Unsubscribe::insert( $insert_data );
/** hook when any contact unsubscribed */
do_action( 'bwfcrm_after_contact_unsubscribed', array( $insert_data ) );
if ( true === $return ) {
$this->return_message( 2 );
}
}
/**
* Mark contact subscribe
*
* @return void
*/
protected function mark_subscribe() {
global $wpdb;
if ( bwfan_is_autonami_pro_active() ) {
$this->crm_contact->resubscribe();
$this->return_message( 5 );
}
$mode = 1;
if ( false !== filter_var( $this->recipient, FILTER_VALIDATE_EMAIL ) ) {
$mode = 1;
} elseif ( is_numeric( $this->recipient ) ) {
$mode = 2;
} else {
$this->return_message( 1 );
}
$where = $wpdb->prepare( "WHERE `recipient` = %s and `mode` = %d", sanitize_text_field( $this->recipient ), $mode );
$unsubscribers = $wpdb->get_results( "SELECT ID,recipient FROM {$wpdb->prefix}bwfan_message_unsubscribe $where ORDER BY ID DESC", ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
if ( ! empty( $unsubscribers ) ) {
foreach ( $unsubscribers as $unsubscriber ) {
$id = $unsubscriber['ID'];
BWFAN_Model_Message_Unsubscribe::delete( $id );
}
$this->return_message( 5 );
}
$this->return_message( 6 );
}
/**
* Get contact subscribed and unsubscribed lists
*
* @return array
*/
protected function get_contact_lists() {
/** Get Unsubscribed Lists */
$unsubscribed_lists = $this->crm_contact->get_field_by_slug( 'unsubscribed-lists' );
$unsubscribed_lists = ( 'null' === $unsubscribed_lists || empty( $unsubscribed_lists ) ) ? array() : json_decode( $unsubscribed_lists, true );
$unsubscribed_lists = array_map( 'strval', $unsubscribed_lists );
/** Get Contact Lists (Include Unsubscribed Lists) */
$subscribed_lists = $this->crm_contact->get_lists();
$subscribed_lists = array_map( 'strval', $subscribed_lists );
$contact_lists = array_values( array_merge( $subscribed_lists, $unsubscribed_lists ) );
return array(
'subscribed' => $subscribed_lists,
'unsubscribed' => $unsubscribed_lists,
'all' => $contact_lists,
);
}
/**
* Get public lists for display
*
* @return array|mixed
*/
protected function get_visible_lists() {
$settings = $this->get_global_settings();
$public_lists = ! empty( $settings['bwfan_unsubscribe_public_lists'] ) ? $settings['bwfan_unsubscribe_public_lists'] : [];
$visibility = isset( $settings['bwfan_unsubscribe_lists_visibility'] ) ? $settings['bwfan_unsubscribe_lists_visibility'] : 0;
if ( 1 !== absint( $visibility ) ) {
return $public_lists;
}
/** Get Contact List */
$contact_lists = $this->get_contact_lists();
$subscribed_lists = $contact_lists['subscribed'];
/** Public Lists for Contact will consists of only which contact has been added to */
$public_lists = array_values( array_intersect( $subscribed_lists, $public_lists ) );
return $public_lists;
}
/**
* Get subscriber details using uid
*
* @return array|false
*/
protected function get_subscriber_details() {
if ( empty( $this->contact ) ) {
return false;
}
$contact_details = [];
$contact_details['subscriber_email'] = $this->contact->get_email();
$contact_details['subscriber_phone'] = $this->contact->get_contact_no();
$contact_details['subscriber_name'] = ucwords( $this->contact->get_f_name() . ' ' . $this->contact->get_l_name() );
$contact_details['subscriber_firstname'] = ucwords( $this->contact->get_f_name() );
$contact_details['subscriber_lastname'] = ucwords( $this->contact->get_l_name() );
return $contact_details;
}
public function get_logged_in_contact() {
if ( ! is_user_logged_in() ) {
return false;
}
$contact = new WooFunnels_Contact( get_current_user_id() );
if ( $contact instanceof WooFunnels_Contact && $contact->get_id() > 0 ) {
$this->contact = $contact;
$this->uid = $contact->get_uid();
$this->recipient = $contact->get_email();
}
}
/**
* Update contact unassigned list field
*
* @param $lists_to_unsub
*
* @return void
*/
protected function update_unassigned_lists_field( $lists_to_unsub ) {
if ( empty( $lists_to_unsub ) ) {
return;
}
$lists_to_unsub = array_map( 'intval', $lists_to_unsub );
$current_unsub_lists = $this->crm_contact->get_field_by_slug( 'unsubscribed-lists' );
$current_unsub_lists = ( 'null' === $current_unsub_lists || empty( $current_unsub_lists ) ) ? [] : json_decode( $current_unsub_lists, true );
$current_unsub_lists = array_merge( $current_unsub_lists, $lists_to_unsub );
$current_unsub_lists = array_unique( $current_unsub_lists );
sort( $current_unsub_lists );
$current_unsub_lists = array_map( 'intval', $current_unsub_lists );
$this->crm_contact->set_field_by_slug( 'unsubscribed-lists', wp_json_encode( $current_unsub_lists ) );
$this->crm_contact->save_fields();
}
/**
* Return messages compiled
*
* @param $type
*
* @return void
*/
protected function return_message( $type = 1 ) {
$page_exist = class_exists( 'BWFAN_Common' ) ? BWFAN_Common::is_unsubscribe_page_valid() : array();
if ( 1 === absint( $type ) ) {
wp_send_json( array(
'success' => 0,
'message' => __( 'Sorry! We are unable to update preferences as no contact found.', 'wp-marketing-automations' ),
) );
}
if ( in_array( intval( $type ), array( 2, 3, 4, 5, 6 ), true ) && ( isset( $page_exist ) && $page_exist['status'] !== 3 ) ) {
$global_settings = $this->get_global_settings();
$return_array = array(
'success' => 1,
'message' => $global_settings['bwfan_unsubscribe_data_success'],
);
if ( ! empty( $this->unsubscribe_redirect ) ) {
$return_array['redirect'] = true;
$return_array['redirect_url'] = esc_url_raw( $this->unsubscribe_redirect );
$this->unsubscribe_redirect = null;
}
wp_send_json( $return_array );
}
if ( 7 === absint( $type ) ) {
wp_send_json( array(
'success' => 0,
'message' => __( 'Security check failed', 'wp-marketing-automations' ),
) );
}
}
/**
* Delete elementor cache
*
* @return void
*/
public function delete_elementor_cache() {
if ( ! class_exists( 'Elementor\Core\Base\Document' ) || ! method_exists( 'Elementor\Core\Base\Document', 'is_built_with_elementor' ) ) {
return;
}
$setting = BWFAN_Common::get_global_settings();
$unsubscribe_page_id = isset( $setting['bwfan_unsubscribe_page'] ) ? $setting['bwfan_unsubscribe_page'] : 0;
if ( empty( $unsubscribe_page_id ) || ( intval( $unsubscribe_page_id ) !== intval( get_the_ID() ) ) ) {
return;
}
/**
* Check if it's a page built using elementor, delete the cache for the page
*/
$document = Elementor\Plugin::$instance->documents->get( $unsubscribe_page_id );
if ( empty( $document ) || empty( $document->is_built_with_elementor() ) ) {
return;
}
delete_post_meta( get_the_ID(), Elementor\Core\Base\Document::CACHE_META_KEY );
}
}
BWFAN_unsubscribe::get_instance();