Files
roi-theme/wp-content/plugins/wp-marketing-automations-pro/crm/includes/class-bwfcrm-forms.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

467 lines
16 KiB
PHP
Executable File

<?php
#[AllowDynamicProperties]
class BWFCRM_Form_Controller {
private $_forms = [];
/** Initialising names for fallback, in case form plugin not activated */
private $_nice_names = [
'elementor' => 'Elementor',
'gforms' => 'Gravity Forms',
'wpforms' => 'WP Forms',
'fluent' => 'Fluent Forms',
'funnel_optin' => 'FunnelKit Optin',
'divi_form' => 'Divi Forms',
'formidable' => 'Formidable',
'thrive' => 'Thrive Forms',
'ninja' => 'Ninja Forms',
'breakdance' => 'Breakdance Forms',
];
private $_autonami_events = [];
private static $ins = null;
public static function get_instance() {
if ( null === self::$ins ) {
self::$ins = new self;
}
return self::$ins;
}
public function __construct() {
add_action( 'plugins_loaded', [ $this, 'load_forms' ], 8 );
add_action( 'bwfan_capture_async_form_submission', array( $this, 'capture_async_form_submission' ) );
add_action( 'wp', array( $this, 'handle_incentive_email' ), 999 );
}
public function load_forms() {
$integration_dir = __DIR__ . '/forms';
foreach ( glob( $integration_dir . '/class-*.php' ) as $_field_filename ) {
$file_data = pathinfo( $_field_filename );
if ( isset( $file_data['basename'] ) && 'index.php' === $file_data['basename'] ) {
continue;
}
require_once( $_field_filename );
}
do_action( 'bwfcrm_forms_loaded' );
}
public function register( $slug, $class, $nice_name, $autonami_events ) {
if ( empty( $slug ) ) {
return;
}
$this->_forms[ $slug ] = $class;
$this->_nice_names[ $slug ] = ! empty( $nice_name ) ? $nice_name : ( ! empty( $this->_nice_names[ $slug ] ) ? $this->_nice_names[ $slug ] : $slug );
if ( is_array( $autonami_events ) && ! empty( $autonami_events ) ) {
foreach ( $autonami_events as $event ) {
$this->_autonami_events[ $event ] = $slug;
}
}
}
public function capture_async_form_submission() {
$form_data = BWFAN_Common::$events_async_data;
if ( ! isset( $form_data['event'] ) ) {
return;
}
$form = $this->get_form_slug_from_event( $form_data['event'] );
if ( false === $form ) {
return;
}
/** @var BWFCRM_Form_Base $form */
$form = $this->get_form( $form );
if ( is_null( $form ) ) {
return;
}
$form->capture_async_submission();
}
public function get_active_feeds_by_form( $slug ) {
$feeds = BWFAN_Model_Form_Feeds::get_feeds( array(
'source' => $slug,
'status' => BWFCRM_Form_Feed::$STATUS_ACTIVE
) );
if ( empty( $feeds ) ) {
return false;
}
return array_filter( array_map( function ( $feed ) {
if ( ! is_array( $feed ) || ! isset( $feed['ID'] ) || empty( $feed['ID'] ) ) {
return false;
}
$feed = new BWFCRM_Form_Feed( $feed['ID'] );
return $feed->is_feed_exists() ? $feed : false;
}, $feeds['feeds'] ) );
}
public function maybe_delete_contact_from_feed( $contact_id ) {
$contact = new BWFCRM_Contact( absint( $contact_id ) );
if ( ! $contact->is_contact_exists() ) {
return false;
}
$feed_id = $contact->get_field_by_slug( 'form-feed-id' );
$feed = new BWFCRM_Form_Feed( $feed_id );
if ( ! $feed->is_feed_exists() || 0 === $feed->get_contacts() ) {
return false;
}
$feed->decrement_contacts();
return ! ! $feed->save();
}
public function maybe_delete_contacts_from_feed( $contact_ids, $form_feed_field_id ) {
foreach ( $contact_ids as $id ) {
$contact = new BWFCRM_Contact( absint( $id ) );
if ( ! $contact->is_contact_exists() ) {
continue;
}
if ( ! isset( $contact->fields[ $form_feed_field_id ] ) || empty( $contact->fields[ $form_feed_field_id ] ) ) {
continue;
}
$feed_id = $contact->fields[ $form_feed_field_id ];
$feed = new BWFCRM_Form_Feed( $feed_id );
if ( ! $feed->is_feed_exists() || 0 === $feed->get_contacts() ) {
continue;
}
$feed->decrement_contacts();
$feed->save();
}
}
/**
* @param $slug
*
* @return |BWFCRM_Form_Base|null
*/
public function get_form( $slug ) {
if ( empty( $slug ) ) {
return null;
}
$form_class = isset( $this->_forms[ $slug ] ) ? $this->_forms[ $slug ] : '';
if ( empty( $form_class ) || ! class_exists( $form_class ) ) {
return null;
}
$form = new $form_class;
return $form instanceof BWFCRM_Form_Base ? $form : null;
}
public function get_form_slug_from_event( $event ) {
if ( ! is_array( $this->_autonami_events ) || empty( $this->_autonami_events ) || ! isset( $this->_autonami_events[ $event ] ) ) {
return false;
}
return $this->_autonami_events[ $event ];
}
public function get_forms_nice_names() {
return $this->_nice_names;
}
public function get_available_forms() {
return array_keys( $this->_forms );
}
public function get_feeds( $args = array() ) {
$feeds = BWFAN_Model_Form_Feeds::get_feeds( $args );
return array(
'feeds' => $this->get_feeds_array( $feeds['feeds'] ),
'total' => $feeds['total']
);
}
public function get_feeds_array( $feeds, $slim_data = true ) {
return array_filter( array_map( function ( $feed ) use ( $slim_data ) {
if ( ! is_array( $feed ) || ! isset( $feed['ID'] ) ) {
return false;
}
$feed_obj = new BWFCRM_Form_Feed();
$feed_obj->set_form_feed( $feed['ID'], $feed['title'], $feed['contacts'], $feed['source'], $feed['status'], $feed['data'] );
$feed_obj->set_db_row( $feed );
return $feed_obj->get_array( $slim_data );
}, $feeds ) );
}
public function sync_feed_selection( $feed_id, $form = '', $selection = array(), $return_all_options = false ) {
$feed = new BWFCRM_Form_Feed( $feed_id );
if ( ! $feed->is_feed_exists() ) {
return BWFCRM_Common::crm_error( __( 'Feed doesn\'t exists', 'wp-marketing-automations-pro' ) );
}
$source = empty( $form ) ? $feed->get_source() : $form;
$form = $this->get_form( $source );
if ( is_null( $form ) ) {
return BWFCRM_Common::crm_error( __( 'Form source invalid', 'wp-marketing-automations-pro' ) );
}
if ( ! is_array( $selection ) ) {
$selection = [];
}
$new_selection = $form->get_form_selection( $selection, $return_all_options );
$update = $form->update_form_selection( $selection, $feed->get_id() );
if ( is_wp_error( $update ) ) {
return $update;
}
return array( 'selection' => $new_selection, 'total' => $form->get_total_selection_steps() );
}
public function is_valid_status( $status ) {
$status = absint( $status );
return in_array( $status, array(
BWFCRM_Form_Feed::$STATUS_DRAFT,
BWFCRM_Form_Feed::$STATUS_ACTIVE,
BWFCRM_Form_Feed::$STATUS_INACTIVE,
) );
}
public function send_incentive_email( $contact, $feed ) {
if ( ! $contact instanceof BWFCRM_Contact || ! $contact->is_contact_exists() || ! is_email( $contact->contact->get_email() ) || ! $feed instanceof BWFCRM_Form_Feed ) {
return false;
}
$do_email = $feed->get_data( 'incentivize_email' );
if ( empty( $do_email ) ) {
return true;
}
/** Check if contacts status is bounced */
if ( BWFCRM_Contact::$DISPLAY_STATUS_BOUNCED === $contact->get_display_status() ) {
return false;
}
$email = $feed->get_data( 'incentive_email' );
if ( ! is_array( $email ) || ! isset( $email['content'] ) || ! is_array( $email['content'] ) || ! isset( $email['content'][0] ) || ! is_array( $email['content'][0] ) ) {
return false;
}
$email_content = $email['content'][0];
$is_transactional = isset( $email_content['isTransactional'] ) ? $email_content['isTransactional'] : 0;
/** Check if email is not transactional and contacts status is unsubscribed */
if ( empty( $is_transactional ) && BWFCRM_Contact::$DISPLAY_STATUS_UNSUBSCRIBED === $contact->get_display_status() ) {
return false;
}
if ( method_exists( 'BWFAN_Common', 'bwfan_before_send_mail' ) ) {
BWFAN_Common::bwfan_before_send_mail( isset( $email_content['type'] ) ? $email_content['type'] : '' );
}
/** Set Merge Tags Data */
BWFAN_Merge_Tag_Loader::set_data( array(
'contact_id' => $contact->contact->get_id(),
'form_feed_id' => $feed->get_id()
) );
$conversation = $this->create_incentive_email_conversation( $contact, $feed, $email['content'][0] );
if ( ! $conversation instanceof BWFAN_Engagement_Tracking ) {
return false;
}
$email_body = 'editor' === $email_content['type'] ? $email_content['editor']['body'] : $email_content['body'];
$email_subject = $email_content['subject'];
/** @var $global_email_settings BWFAN_Common settings */
$global_email_settings = BWFAN_Common::get_global_settings();
/** Email Subject */
$email_body = method_exists( 'BWFAN_Common', 'correct_shortcode_string' ) ? BWFAN_Common::correct_shortcode_string( $email_body, $email['content'][0]['type'] ) : $email_body;
$subject = BWFAN_Common::decode_merge_tags( $email_subject );
$merge_tags_data = [ 'contact_id' => $contact->contact->get_id(), 'form_feed_id' => $feed->get_id() ];
$merge_tags = BWFCRM_Core()->merge_tags->fetch_tags_from_string( $email_body, $merge_tags_data );
$email_body = BWFAN_Common::replace_merge_tags( $email_body, $merge_tags, $contact->contact->get_id() );
$email_body = BWFAN_Common::decode_merge_tags( $email_body );
/** Email Body */
$body = BWFAN_Common::bwfan_correct_protocol_url( $email_body );
$body = BWFCRM_Core()->conversation->apply_template_by_type( $body, $email_content['type'], $subject );
/** Apply Click tracking and UTM Params */
$utm_enabled = isset( $email_content['utmEnabled'] ) && 1 === absint( $email_content['utmEnabled'] );
$utm_data = $utm_enabled && isset( $email_content['utm'] ) && is_array( $email_content['utm'] ) ? $email_content['utm'] : array();
$uid = $contact->contact->get_uid();
/** Set contact object */
BWFCRM_Core()->conversation->contact = $contact;
BWFCRM_Core()->conversation->engagement_type = BWFAN_Email_Conversations::$TYPE_INCENTIVE;
BWFAN_Core()->conversation->broadcast_id = $feed->get_id();
$body = BWFCRM_Core()->conversation->append_to_email_body_links( $body, $utm_data, $conversation->get_hash(), $uid );
/** Apply Pre-Header and Hash ID (open pixel id) */
$pre_header = isset( $email_content['preheader'] ) && ! empty( $email_content['preheader'] ) ? $email_content['preheader'] : '';
$pre_header = BWFAN_Common::decode_merge_tags( $pre_header );
$body = BWFCRM_Core()->conversation->append_to_email_body( $body, $pre_header, $conversation->get_hash() );
/** Email Headers */
$reply_to_email = isset( $email['reply_to'] ) ? $email['reply_to'] : $global_email_settings['bwfan_email_reply_to'];
$from_email = isset( $email['from_email'] ) ? $email['from_email'] : $global_email_settings['bwfan_email_from'];
$from_name = isset( $email['from_name'] ) ? $email['from_name'] : $global_email_settings['bwfan_email_from_name'];
/** Setup Headers */
$header = array();
$header[] = 'MIME-Version: 1.0';
if ( ! empty( $from_email ) && ! empty( $from_name ) ) {
$header[] = 'From: ' . $from_name . ' <' . $from_email . '>';
}
if ( ! empty( $reply_to_email ) ) {
$header[] = 'Reply-To: ' . $reply_to_email;
}
$header[] = 'Content-type:text/html;charset=UTF-8';
/** Set unsubscribe link in header */
$unsubscribe_link = BWFAN_PRO_Common::get_unsubscribe_link( [ 'uid' => $contact->contact->get_uid(), 'form_feed_id' => $feed->get_id() ] );
if ( ! empty( $unsubscribe_link ) ) {
$header[] = "List-Unsubscribe: <$unsubscribe_link>";
$header[] = "List-Unsubscribe-Post: List-Unsubscribe=One-Click";
}
/** Removed wp mail filters */
BWFCRM_Common::bwf_remove_filter_before_wp_mail();
$header = apply_filters( 'bwfan_email_headers', $header );
BWFCRM_Common::$captured_email_failed_message = null;
/** Send the Email */
$email_status = wp_mail( $contact->contact->get_email(), $subject, $body, $header );
/** Set the status of Email */
if ( true === $email_status ) {
$conversation->set_status( BWFAN_Email_Conversations::$STATUS_SEND );
$conversation->save();
} else {
$conversation->fail_the_conversation();
}
return $email_status;
}
public function create_incentive_email_conversation( $contact, $feed, $email_content ) {
if ( ! $contact instanceof BWFCRM_Contact || ! $contact->is_contact_exists() || ! is_email( $contact->contact->get_email() ) || ! $feed instanceof BWFCRM_Form_Feed ) {
return false;
}
if ( ! isset( $email_content['type'] ) ) {
return false;
}
$email_body = 'editor' === $email_content['type'] ? $email_content['editor']['body'] : $email_content['body'];
$email_body = method_exists( 'BWFAN_Common', 'correct_shortcode_string' ) ? BWFAN_Common::correct_shortcode_string( $email_body, $email_content['type'] ) : $email_body;
$template_type = BWFAN_PRO_Common::get_email_template_type( $email_content['type'] );
$email_subject = $email_content['subject'];
$template_id = BWFCRM_Core()->conversation->get_or_create_template( BWFAN_Email_Conversations::$MODE_EMAIL, $email_subject, $email_body, 'id', [ 'template' => $template_type ] );
$merge_tags_data = [ 'contact_id' => $contact->contact->get_id(), 'form_feed_id' => $feed->get_id() ];
if ( property_exists( BWFAN_Core()->conversation, 'template_id' ) ) {
BWFAN_Core()->conversation->template_id = $template_id;
}
$conversation = new BWFAN_Engagement_Tracking();
$conversation->set_oid( $feed->get_id() );
$conversation->set_mode( BWFAN_Email_Conversations::$MODE_EMAIL );
$conversation->set_contact( $contact );
$conversation->set_send_to( $contact->contact->get_email() );
$conversation->enable_tracking();
$conversation->set_type( BWFAN_Email_Conversations::$TYPE_INCENTIVE );
$conversation->set_template_id( $template_id );
$conversation->set_status( BWFAN_Email_Conversations::$STATUS_DRAFT );
$conversation->add_merge_tags_from_string( $email_body, $merge_tags_data );
$conversation->add_merge_tags_from_string( $email_subject, $merge_tags_data );
if ( ! $conversation->save() ) {
return false;
}
return $conversation;
}
/**
* handling email incentive
*/
public function handle_incentive_email() {
if ( ! isset( $_GET['bwfan-uid'] ) || empty( $_GET['bwfan-uid'] ) ) {
return;
}
if ( ! isset( $_GET['bwfan-action'] ) || empty( $_GET['bwfan-action'] ) || 'incentive' !== sanitize_text_field( $_GET['bwfan-action'] ) ) {
return;
}
$uid = $_GET['bwfan-uid'];
$bwf_contacts = BWF_Contacts::get_instance();
$dbcontact = $bwf_contacts->get_contact_by( 'uid', $uid );
if ( empty( $dbcontact->db_contact ) ) {
$link = filter_input( INPUT_GET, 'bwfan-link' );
if ( ! empty( $link ) ) {
$url = BWFAN_Common::bwfan_correct_protocol_url( $link );
$url = BWFAN_PRO_Common::validate_target_link( $url );
if ( false !== wp_http_validate_url( $url ) ) {
BWFAN_PRO_Common::wp_redirect( $url );
exit;
}
}
// when no contact found with the uid then redirect to the home url
wp_safe_redirect( home_url() );
exit();
}
$contact = new BWFCRM_Contact( $dbcontact );
if ( isset( $_GET['feed-id'] ) && absint( $_GET['feed-id'] ) > 0 ) {
$feed = new BWFCRM_Form_Feed( absint( $_GET['feed-id'] ) );
if ( $feed->is_feed_exists() ) {
$tag_enabled = $feed->get_data( 'add_tag_enable' );
if ( $tag_enabled ) {
$tag_to_add = $feed->get_data( 'tag_to_add' );
if ( ! empty( $tag_to_add ) ) {
$contact->set_tags( $tag_to_add );
}
}
}
}
/** To mark the contact subscribe and remove the unsubscribe record */
$contact->resubscribe( false );
$contact->save();
/** Hook after confirmation link clicked */
do_action( 'bwfcrm_confirmation_link_clicked', $contact );
$link = filter_input( INPUT_GET, 'bwfan-link' );
if ( ! empty( $link ) ) {
$url = BWFAN_Common::bwfan_correct_protocol_url( $link );
$url = BWFAN_PRO_Common::validate_target_link( $url );
if ( false !== wp_http_validate_url( $url ) ) {
BWFAN_PRO_Common::wp_redirect( $url );
exit;
}
}
}
}
if ( class_exists( 'BWFCRM_Form_Controller' ) ) {
BWFCRM_Core::register( 'forms', 'BWFCRM_Form_Controller' );
}