Initial commit

This commit is contained in:
gustavooth
2026-07-23 22:56:30 -03:00
commit 22a1006598
1816 changed files with 410742 additions and 0 deletions
@@ -0,0 +1,381 @@
<?php
namespace FluentCrm\App\Hooks\Handlers;
use FluentCrm\App\Models\Subscriber;
use FluentCrm\App\Services\AutoSubscribe;
use FluentCrm\App\Services\Funnel\FunnelHelper;
use FluentCrm\App\Services\Helper;
use FluentCrm\Framework\Support\Arr;
/**
* AutoSubscribeHandler Class
*
* Used to handle the auto-subscribe functionality for different WordPress Events.
*
* @package FluentCrm\App\Hooks
*
* @version 1.0.0
*/
class AutoSubscribeHandler
{
public function register()
{
add_action('user_register', array($this, 'userRegistrationHandler'), 99, 1);
add_action('comment_post', array($this, 'handleCommentPost'), 99, 3);
add_action('profile_update', array($this, 'syncUserUpdate'), 10, 3);
add_action('delete_user', array($this, 'maybeDeleteContact'), 10, 3);
add_action('woocommerce_customer_save_address', array($this, 'syncWooAddressUpdate'), 10, 2);
add_action('wp_login', array($this, 'maybeAddCountryToProfile'), 99, 2);
}
public function userRegistrationHandler($userId)
{
if (is_multisite()) {
if (is_network_admin()) {
return false;
}
if (function_exists('WP_Ultimo')) {
return false;
}
}
$settings = (new AutoSubscribe())->getRegistrationSettings();
if (Arr::get($settings, 'status') != 'yes') {
$user = get_user_by('ID', $userId);
$contact = Subscriber::where('email', $user->user_email)->first();
if ($contact && $contact->user_id != $user->ID) {
fluentCrmDb()->table('fc_subscribers')
->where('id', $contact->id)
->update([
'user_id' => $user->ID
]);
}
return false;
}
$subscriberData = FunnelHelper::prepareUserData($userId);
if ($listId = Arr::get($settings, 'target_list')) {
$subscriberData['lists'] = [$listId];
}
if ($tags = Arr::get($settings, 'target_tags')) {
$subscriberData['tags'] = $tags;
}
$isDoubleOptin = Arr::get($settings, 'double_optin') == 'yes';
if ($isDoubleOptin) {
$subscriberData['status'] = 'pending';
} else {
$subscriberData['status'] = 'subscribed';
}
$contact = FunnelHelper::createOrUpdateContact($subscriberData);
if (!$contact) {
return false;
}
if ($contact->status == 'pending' && $subscriberData['status'] == 'pending') {
$contact->sendDoubleOptinEmail();
}
add_action('updated_user_meta', function ($meta_id, $userId, $meta_key, $_meta_value) use ($contact) {
if ($userId == $contact->user_id && ($meta_key == 'first_name' || $meta_key == 'last_name') && $_meta_value) {
if ($contact->{$meta_key} != $_meta_value) {
fluentCrmDb()->table('fc_subscribers')
->where('id', $contact->id)
->update([
$meta_key => $_meta_value
]);
}
}
}, 10, 4);
}
public function addSubscribeCheckbox($buttonHtml)
{
$settings = (new AutoSubscribe())->getCommentSettings();
/**
* Determine the settings for the comment form subscribe feature in FluentCRM.
*
* This filter allows modification of the settings used for the comment form subscribe feature in FluentCRM.
*
* @param array $settings The current settings for the comment form subscribe feature.
* @return array The modified settings for the comment form subscribe feature.
* @since 2.7.0
*
*/
$settings = apply_filters('fluent_crm/comment_form_subscribe_settings', $settings);
if (Arr::get($settings, 'status') != 'yes') {
return $buttonHtml;
}
if (Arr::get($settings, 'show_only_new') == 'yes') {
if ($userId = get_current_user_id()) {
$user = get_user_by('ID', $userId);
$contact = Subscriber::where('user_id', $userId)->orWhere('email', $user->user_email)->first();
if ($contact && $contact->status == 'subscribed') {
return $buttonHtml;
}
}
}
$label = Arr::get($settings, 'checkbox_label');
if (!$label) {
$label = __('Subscribe to newsletter', 'fluent-crm');
}
$checkedTag = '';
if (Arr::get($settings, 'auto_checked') == 'yes') {
$checkedTag = 'checked="true"';
}
$html = '<p class="comment-form-fc-consent comment-form-cookies-consent"><input ' . $checkedTag . ' id="wp-comment-fc-consent" name="wp-comment-fc-consent" type="checkbox" value="yes"><label for="wp-comment-fc-consent">' . $label . '</label></p>';
return $html . $buttonHtml;
}
public function handleCommentPost($commentId, $isApproved, $commentData)
{
// is this a spam comment?
if ($isApproved === 'spam') {
return false;
}
if (defined('WC_PLUGIN_FILE') && Arr::get($commentData, 'comment_type') == 'review') {
do_action('fluentcrm_woo_review_comment_post', $commentId, $isApproved, $commentData);
}
$isChecked = Arr::get($_REQUEST, 'wp-comment-fc-consent') == 'yes';
if (!$isChecked) {
return false;
}
$subscriberData = [
'full_name' => Arr::get($commentData, 'comment_author'),
'email' => Arr::get($commentData, 'comment_author_email'),
'ip_address' => Arr::get($commentData, 'comment_author_IP')
];
if ($userId = Arr::get($commentData, 'user_id')) {
$subscriberData['user_id'] = $userId;
}
$subscriberData = array_filter($subscriberData);
$settings = (new AutoSubscribe())->getCommentSettings();
if ($listId = Arr::get($settings, 'target_list')) {
$subscriberData['lists'] = [$listId];
}
if ($tags = Arr::get($settings, 'target_tags')) {
$subscriberData['tags'] = $tags;
}
$isDoubleOptin = Arr::get($settings, 'double_optin') == 'yes';
if ($isDoubleOptin) {
$subscriberData['status'] = 'pending';
}
$contact = FunnelHelper::createOrUpdateContact($subscriberData);
if (!$contact) {
return false;
}
if (!$contact->country) {
// get CF Country from request header: CF-IPCountry
$countryCode = sanitize_text_field($_SERVER['HTTP_CF_IPCOUNTRY'] ?? '');
if ($countryCode && preg_match('/^[A-Z]{2}$/', $countryCode) && $countryCode !== 'XX') {
$contact->country = $countryCode;
$contact->save();
}
}
if ($contact->status == 'pending') {
$contact->sendDoubleOptinEmail();
}
return true;
}
public function syncUserUpdate($userId, $oldData, $newData = [])
{
if (is_multisite() && is_network_admin()) {
return false;
}
if (!empty($newData['user_pass'])) {
$user = get_user_by('ID', $userId);
(new Cleanup())->handleUserPasswordChanged($user);
}
if (!Helper::isUserSyncEnabled()) {
return false;
}
// check if user email has been changed
$user = get_user_by('ID', $userId);
if ($user->user_email != $oldData->user_email) {
// email has been changed
$oldSubscriber = Subscriber::where('email', $oldData->user_email)->first();
// check if a contact is exist with the new email id
$newSubscriber = Subscriber::where('email', $user->user_email)->first();
if ($newSubscriber) {
fluentCrmDb()->table('fc_subscribers')
->where('id', $oldSubscriber->id)
->update([
'user_id' => ''
]);
$oldSubscriber = false;
}
if ($oldSubscriber) {
$updateData = [
'email' => $user->user_email,
'hash' => md5($user->user_email),
'updated_at' => current_time('mysql'),
'user_id' => $user->ID
];
if ($user->first_name) {
$updateData['first_name'] = $user->first_name;
}
if ($user->last_name) {
$updateData['last_name'] = $user->last_name;
}
return fluentCrmDb()->table('fc_subscribers')
->where('id', $oldSubscriber->id)
->update($updateData);
}
}
// we just have to change the first name and lastname
$updateData = Helper::getWPMapUserInfo($user);
unset($updateData['email']);
if (!$updateData) {
return false;
}
$updateData['updated_at'] = current_time('mysql');
return fluentCrmDb()->table('fc_subscribers')
->where('email', $user->user_email)
->update($updateData);
}
public function maybeDeleteContact($userId, $reassignId, $user)
{
if (is_multisite() && is_network_admin()) {
return false;
}
if (!Helper::isContactDeleteOnUserDeleteEnabled()) {
return false;
}
$subscriber = Subscriber::where('user_id', $userId)->first();
if (!$subscriber) {
$subscriber = Subscriber::where('email', $user->user_email)->first();
}
if (!$subscriber) {
return false;
}
return Helper::deleteContacts([$subscriber->id]);
}
public function syncWooAddressUpdate($userId, $addressType)
{
if ($addressType != 'billing') {
return;
}
$customer = new \WC_Customer($userId);
if (!$customer || !$customer->get_id()) {
return;
}
$user = get_user_by('ID', $userId);
$contact = Subscriber::where('email', $user->user_email)->first();
$addressData = $customer->get_billing();
$updateData = [
'user_id' => $userId,
'address_line_1' => $addressData['address_1'],
'address_line_2' => $addressData['address_2'],
'city' => $addressData['city'],
'state' => $addressData['state'],
'country' => $addressData['country'],
'postal_code' => $addressData['postcode']
];
if ($contact) {
$contact->fill($updateData);
$dirty = $contact->getDirty();
if ($dirty) {
fluentCrmDb()->table('fc_subscribers')
->where('id', $contact->id)
->update($dirty);
$contact = Subscriber::find($contact->id);
do_action('fluent_crm/contact_updated', $contact, $dirty);
}
} else {
FluentCrmApi('contacts')->createOrUpdate($updateData);
}
}
public function maybeAddCountryToProfile($userLogin, $wpUser)
{
// get CF Country from request header: CF-IPCountry
$countryCode = sanitize_text_field($_SERVER['HTTP_CF_IPCOUNTRY'] ?? '');
if (!$countryCode || !preg_match('/^[A-Z]{2}$/', $countryCode) || $countryCode === 'XX') {
return;
}
$contact = Subscriber::where('email', $wpUser->user_email)->first();
if (!$contact || $contact->country) {
return;
}
$updateData = [
'country' => $countryCode
];
if (empty($contact->user_id) || (int) $contact->user_id === (int) $wpUser->ID) {
$updateData['user_id'] = $wpUser->ID;
}
fluentCrmDb()->table('fc_subscribers')
->where('id', $contact->id)
->update($updateData);
}
}