# acymailing/11.0.0/back/dynamics/subscription/SubscriptionInsertion.php

AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress, version 11.0.0. 756 lines.

- Page: https://pluginprobe.com/plugins/acymailing/11.0.0/code/back/dynamics/subscription/SubscriptionInsertion.php
- Raw: https://pluginprobe.com/plugins/acymailing/11.0.0/raw/back/dynamics/subscription/SubscriptionInsertion.php
- Modified: 2026-08-03T10:18:54+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/acymailing/11.0.0/code/back/dynamics/subscription/SubscriptionInsertion.php#L10-L20`.

```php
<?php

use AcyMailing\Classes\CampaignClass;
use AcyMailing\Classes\MailClass;
use AcyMailing\Classes\UserClass;
use AcyMailing\Classes\ListClass;

trait SubscriptionInsertion
{
    //Set this variable to true once the list unsubscribe is added so we don't add it twice
    private $addedListUnsubscribe = [];
    //Keep all lists and IDs for users so we don't do the query twice
    private $lists = [];
    //Keep all listsowner information so we don't do the query again and again
    private $listsowner = [];
    //Keep the list information there
    private $listsinfo = [];
    //Used to know if we should add a List-Unsubscribe header
    private $unsubscribeLink = [];
    // Used for list-unsubscribe to store the mail's list ids
    private $mailLists = [];
    private $userClass = null;

    public function dynamicText(?int $mailId): ?object
    {
        return $this->pluginDescription;
    }

    public function textPopup(): void
    {
        $others = [];
        $others['unsubscribe'] = ['name' => acym_translation('ACYM_UNSUBSCRIBE_LINK'), 'default' => 'ACYM_UNSUBSCRIBE'];
        $others['unsubscribeall'] = ['name' => acym_translation('ACYM_UNSUBSCRIBE_ALL_LISTS_LINK'), 'default' => 'ACYM_UNSUBSCRIBE_ALL_LISTS'];
        $others['direct_unsubscribe'] = ['name' => acym_translation('ACYM_DIRECT_UNSUBSCRIBE_LINK'), 'default' => 'ACYM_UNSUBSCRIBE'];
        $others['disable_tracking'] = ['name' => acym_translation('ACYM_DISABLE_TRACKING_LINK'), 'default' => 'ACYM_DISABLE_TRACKING'];
        $others['confirm'] = ['name' => acym_translation('ACYM_CONFIRM_SUBSCRIPTION_LINK'), 'default' => 'ACYM_CONFIRM_SUBSCRIPTION'];
        $others['subscribe'] = ['name' => acym_translation('ACYM_SUBSCRIBE_LINK'), 'default' => 'ACYM_SUBSCRIBE'];

        ?>
		<script type="text/javascript">
            let openedLists = false;
            let openedDirectUnsubscribeRedirect = false;
            let openedUnsubscribeAllRedirect = false;
            let selectedSubscriptionDText = '';

            function changeSubscriptionTag(tagName) {
                selectedSubscriptionDText = tagName;
                let defaultText = [];
                <?php
                foreach ($others as $tagname => $tag) {
                    echo 'defaultText["'.esc_attr($tagname).'"] = '.json_encode(acym_translation($tag['default'])).';';
                }
                ?>
                jQuery('.selected_row').removeClass('selected_row');
                jQuery('#tr_' + tagName).addClass('selected_row');
                jQuery('#acym__popup__subscription__tagtext').val(defaultText[tagName]);
                setSubscriptionTag();
            }

            function setSubscriptionTag() {
                if (openedLists && selectedSubscriptionDText !== 'subscribe') {
                    jQuery('#acym__popup__plugin__subscription__lists__modal').slideUp();
                    jQuery('#select_lists_zone').hide();
                    openedLists = false;
                }
                if (openedDirectUnsubscribeRedirect && selectedSubscriptionDText !== 'direct_unsubscribe') {
                    jQuery('#acym__popup__plugin__direct_unsubscribe__modal').slideUp();
                    openedDirectUnsubscribeRedirect = false;
                }
                if (openedUnsubscribeAllRedirect && selectedSubscriptionDText !== 'unsubscribeall') {
                    jQuery('#acym__popup__plugin__unsubscribeall__modal').slideUp();
                    openedUnsubscribeAllRedirect = false;
                }

                let tag = '{' + selectedSubscriptionDText;
                let lists = jQuery('#acym__popup__subscription__listids');

                if ('subscribe' === selectedSubscriptionDText) {
                    tag += '|lists:' + lists.html();
                }

                if (selectedSubscriptionDText === 'direct_unsubscribe') {
                    let redirect = jQuery('#acym__popup__direct_unsubscribe__redirect').val();
                    if (redirect) tag += '|redirect:' + encodeURIComponent(redirect);
                } else if (selectedSubscriptionDText === 'unsubscribeall') {
                    let redirect = jQuery('#acym__popup__unsubscribeall__redirect').val();
                    if (redirect) tag += '|redirect:' + encodeURIComponent(redirect);
                }

                tag += '}' + jQuery('#acym__popup__subscription__tagtext').val() + '{/' + selectedSubscriptionDText + '}';
                setTag(tag, jQuery('#tr_' + selectedSubscriptionDText));
            }

            function displayLists() {
                if (openedLists) return;
                openedLists = true;

                jQuery.acymModal();
                jQuery('#acym__popup__plugin__subscription__lists__modal').slideDown();
                jQuery('#select_lists_zone').toggle();

                jQuery('#acym__popup__subscription__change').off('change').on('change', function () {
                    const lists = JSON.parse(jQuery('#acym__modal__lists-selected').val());
                    jQuery('#acym__popup__subscription__listids').html(lists.join());
                    changeSubscriptionTag('subscribe');
                });
            }

            function displayDirectUnsubscribeRedirect() {
                if (openedDirectUnsubscribeRedirect) return;
                openedDirectUnsubscribeRedirect = true;
                jQuery('#acym__popup__plugin__direct_unsubscribe__modal').slideDown();

                jQuery('#acym__popup__direct_unsubscribe__redirect').off('input').on('input', function () {
                    let redirectLink = jQuery(this).val();
                    jQuery('#acym__popup__direct_unsubscribe__preview').html(redirectLink);
                    changeSubscriptionTag('direct_unsubscribe');
                });
            }

            function displayUnsubscribeAllRedirect() {
                if (openedUnsubscribeAllRedirect) return;
                openedUnsubscribeAllRedirect = true;
                jQuery('#acym__popup__plugin__unsubscribeall__modal').slideDown();

                jQuery('#acym__popup__unsubscribeall__redirect').off('input').on('input', function () {
                    let redirectLink = jQuery(this).val();
                    jQuery('#acym__popup__unsubscribeall__preview').html(redirectLink);
                    changeSubscriptionTag('unsubscribeall');
                });
            }
		</script>
        <?php
        //Add an area where the user will be able to select another text to add
        echo '<div class="acym__popup__listing text-center grid-x">
				<h1 class="acym__title acym__title__secondary text-center cell">'.esc_html(acym_translation('ACYM_SUBSCRIPTION')).'</h1>
				<div class="grid-x medium-12 cell acym__row__no-listing text-left acym_vcenter">
					<div class="grid-x cell medium-5 small-12 acym__listing__title acym__listing__title__dynamics acym__subscription__subscription acym_vcenter">
						<label class="small-3 margin-bottom-0" for="acym__popup__subscription__tagtext">'.esc_html(acym_translation('ACYM_TEXT')).': </label>
						<input class="small-9" type="text" name="tagtext" id="acym__popup__subscription__tagtext" onchange="setSubscriptionTag();">
					</div>
					<div class="medium-1"></div>
					<div style="display: none;" id="select_lists_zone" class="grid-x cell medium-6 small-12 acym__listing__title acym__listing__title__dynamics">
						<p class="shrink" id="acym__popup__subscription__text__list">'.esc_html(acym_translation('ACYM_LISTS_SELECTED')).'</p>
						<p class="shrink" id="acym__popup__subscription__listids"></p>
					</div>
				</div>
				<div class="cell grid-x">';

        foreach ($others as $tagname => $tag) {
            $onclick = "changeSubscriptionTag('".$tagname."');";
            if ($tagname === 'subscribe') {
                $onclick .= 'displayLists();return false;';
            } elseif ($tagname === 'direct_unsubscribe') {
                $onclick .= 'displayDirectUnsubscribeRedirect();return false;';
            } elseif ($tagname === 'unsubscribeall') {
                $onclick .= 'displayUnsubscribeAllRedirect();return false;';
            }

            echo '<div class="grid-x small-12 cell acym__row__no-listing acym__listing__row__popup text-left"  onclick="'.esc_attr($onclick).'" id="tr_'.esc_attr(
                    $tagname
                ).'" >';
            echo '<div class="cell small-12 acym__listing__title acym__listing__title__dynamics">'.wp_kses(
                    $tag['name'],
                    [
                        'b' => [],
                    ]
                ).'</div>';
            echo '</div>';
        }
        echo '</div>
				<div class="medium-1"></div>
				<div class="medium-10 text-left">';
        acym_modalPaginationLists(
            'acym__popup__subscription__change',
            ''
        );
        echo '<div style="display: none;" id="acym__popup__plugin__direct_unsubscribe__modal" class="grid-x cell medium-6 small-12 acym__listing__title acym__listing__title__dynamics">
				<label>'.esc_html(acym_translation('ACYM_REDIRECTION_URL')).'</label>
				<input type="text" id="acym__popup__direct_unsubscribe__redirect" placeholder="https://example.com/unsubscribed" />
				<p id="acym__popup__direct_unsubscribe__preview" class="acym_smalltext text-gray"></p>
			</div>
			<div style="display: none;" id="acym__popup__plugin__unsubscribeall__modal" class="grid-x cell medium-6 small-12 acym__listing__title acym__listing__title__dynamics">
					<label>'.esc_html(acym_translation('ACYM_REDIRECTION_URL')).'</label>
					<input type="text" id="acym__popup__unsubscribeall__redirect" placeholder="https://example.com/all-unsubscribed" />
					<p id="acym__popup__unsubscribeall__preview" class="acym_smalltext text-gray"></p>
				</div>
			</div>
			<div class="medium-1"></div>
		</div>';

        // List tags
        $others = [];
        $others['name'] = acym_translation('ACYM_LIST_NAME');
        $others['description'] = acym_translation('ACYM_LIST_DESCRIPTION');
        $others['names'] = acym_translation('ACYM_LIST_NAMES');
        $others['descriptions'] = acym_translation('ACYM_LIST_DESCRIPTIONS');
        $others['id'] = acym_translation('ACYM_LIST_ID', true);

        echo '<div class="acym__popup__listing text-center grid-x">
				<h1 class="acym__title acym__title__secondary text-center cell">'.esc_html(acym_translation('ACYM_LIST')).'</h1>
				<div class="cell grid-x">';

        foreach ($others as $tagname => $tag) {
            echo '<div class="grid-x medium-12 cell acym__row__no-listing acym__listing__row__popup text-left" onclick="changeSubscriptionTag(\'list\');setTag(\'{list:'.esc_attr(
                    $tagname
                ).'}\', jQuery(this));" id="tr_'.esc_attr($tagname).'">
					<div class="cell medium-12 small-12 acym__listing__title acym__listing__title__dynamics">'.esc_html($tag).'</div>
				  </div>';
        }

        echo '</div></div>';

        // Newsletter tags
        echo '<div class="acym__popup__listing text-center grid-x">
				<span class="acym__title acym__title__secondary text-center cell">'.esc_html(acym_translation('ACYM_CAMPAIGN')).'</span>
				<div class="cell grid-x">';
        $othersMail = ['campaignid', 'subject'];

        foreach ($othersMail as $tag) {
            echo '<div class="grid-x medium-12 cell acym__row__no-listing acym__listing__row__popup text-left" onclick="changeSubscriptionTag(\'mail\');setTag(\'{mail:'.esc_attr(
                    $tag
                ).'}\', jQuery(this));" id="tr_'.esc_attr($tag).'">
					<div class="cell medium-12 small-12 acym__listing__title acym__listing__title__dynamics">'.esc_html($tag).'</div>
				  </div>';
        }
        echo '</div></div>';

        // Smart newsletter tags
        echo '<div class="acym__popup__listing text-center grid-x">
				<span class="acym__title acym__title__secondary text-center cell">'.esc_html(acym_translation('ACYM_AUTO').' '.acym_translation('ACYM_CAMPAIGNS')).'</span>
				<div class="cell grid-x">';

        $autoMail = [
            'number_generated' => [
                'name' => acym_translation('ACYM_ISSUE_NB'),
                'default' => '#1',
            ],
        ];

        foreach ($autoMail as $tag => $oneTag) {
            $tagInserted = $tag;
            if (!empty($oneTag['default'])) {
                $tagInserted = $tag.'|default:'.$oneTag['default'];
            }

            echo '<div class="grid-x medium-12 cell acym__row__no-listing acym__listing__row__popup text-left" onclick="changeSubscriptionTag(\'automail\');setTag(\'{automail:'.esc_attr(
                    $tagInserted
                ).'}\', jQuery(this));" id="tr_'.esc_attr($tag).'">
					<div class="cell medium-12 small-12 acym__listing__title acym__listing__title__dynamics">'.esc_html($oneTag['name']).'</div>
				  </div>';
        }
        echo '</div></div>';
    }

    public function replaceUserInformation(object &$email, ?object &$user, bool $send = true): void
    {
        if (empty($email->id)) {
            return;
        }
        $this->replacelisttags($email, $user, $send);

        // Check if we should add the List-Unsubscribe header
        if (empty($user->id) || !empty($this->addedListUnsubscribe[$email->id][$user->id])) return;
        if (empty($this->unsubscribeLink[$email->id]) || !method_exists($email, 'addCustomHeader')) return;


        $this->addedListUnsubscribe[$email->id][$user->id] = true;

        // Prepare the mailto parameters for the header
        $mailto = '';
        if ($this->config->get('auto_bounce', 0)) {
            $mailto = $this->config->get('bounce_email');
        }
        if (empty($mailto)) {
            $mailto = empty($email->replyemail) ? $this->config->get('replyto_email') : $email->replyemail;
        }

        // No bounce address, no reply-to address on the email or the configuration
        if (empty($mailto)) {
            return;
        }

        $body = 'Please%20unsubscribe%20user%20ID%20'.$user->id;

        if (!isset($this->mailLists[$email->id])) {
            $mailClass = new MailClass();
            $lists = $mailClass->getAllListsByMailId($email->id);
            $this->mailLists[$email->id] = empty($lists) ? null : array_keys($lists);
        }

        // Make sure we unsubscribe from the correct lists and not all the lists
        if (!empty($this->mailLists[$email->id])) {
            $userClass = $this->getUserClass();
            $userLists = $userClass->getSubscriptionStatus($user->id, [], UserClass::STATUS_SUBSCRIBED);
            if (!empty($userLists)) {
                $commonLists = array_intersect($this->mailLists[$email->id], array_keys($userLists));

                if (!empty($commonLists)) {
                    $body .= '%20from%20list(s)%20'.implode(',', $commonLists).'.';
                }
            }
        }

        $unsubscribeLink = str_replace(
            ['{subscriber:id}', '{subscriber:key|urlencode}'],
            [$user->id, urlencode($user->key)],
            $this->unsubscribeLink[$email->id]
        );
        $email->addCustomHeader('List-Unsubscribe', '<'.$unsubscribeLink.'&ajax=1>, <mailto:'.$mailto.'?subject=unsubscribe_user_'.$user->id.'&body='.$body.'>');
        $email->addCustomHeader('List-Unsubscribe-Post', 'List-Unsubscribe=One-Click');
    }

    public function replaceContent(object &$email): void
    {
        $this->replaceSubscriptionTags($email);
        $this->replacemailtags($email);
        $this->replaceAutomailTags($email);
    }

    private function replacemailtags(&$email)
    {
        $result = $this->pluginHelper->extractTags($email, 'mail');
        $tags = [];

        foreach ($result as $key => $oneTag) {
            if (isset($tags[$key])) {
                continue;
            }

            $field = $oneTag->id;
            if (!empty($email) && !empty($email->$field)) {
                $text = $email->$field;
                $this->pluginHelper->formatString($text, $oneTag);
                $tags[$key] = $text;
            } elseif (substr($field, 0, 8) == 'campaign') {
                $this->getCampaignTags($email, $tags, $oneTag, $key);
            } else {
                $tags[$key] = $oneTag->default;
            }
        }

        $this->pluginHelper->replaceTags($email, $tags);
    }

    private function getCampaignTags(&$email, &$tags, $oneTag, $key)
    {
        $campaignClass = new CampaignClass();
        $campaignFromMail = $campaignClass->getOneCampaignByMailId($email->id);
        $campaignField = substr($oneTag->id, 8);
        if (!empty($campaignFromMail) && !empty($campaignFromMail->$campaignField)) {
            $text = $campaignFromMail->$campaignField;
            $this->pluginHelper->formatString($text, $oneTag);
            $tags[$key] = $text;
        } else {
            $tags[$key] = $oneTag->default;
        }
    }

    // Available tags: {automail:number_generated}
    private function replaceAutomailTags(&$email)
    {
        $result = $this->pluginHelper->extractTags($email, 'automail');
        $tags = [];

        foreach ($result as $key => $oneTag) {
            if (isset($tags[$key])) {
                continue;
            }

            $field = $oneTag->id;

            $campaignClass = new CampaignClass();
            $autoCampaignFromMail = $campaignClass->getAutoCampaignFromGeneratedMailId($email->id);

            if (!empty($autoCampaignFromMail) && !empty($autoCampaignFromMail->sending_params[$field])) {
                $text = $autoCampaignFromMail->sending_params[$field];
                $this->pluginHelper->formatString($text, $oneTag);
                $tags[$key] = $text;
            } else {
                $tags[$key] = $oneTag->default;
            }
        }

        $this->pluginHelper->replaceTags($email, $tags);
    }

    //Available tags: {list:name} , {list:count} , {list:count|listid:0} (to count all users), {list:members}, {list:owner}
    private function replacelisttags(&$email, &$user, $send)
    {
        $tags = $this->pluginHelper->extractTags($email, 'list');
        if (empty($tags)) {
            return;
        }

        $replaceTags = [];
        foreach ($tags as $oneTag => $parameter) {
            $method = 'list'.trim(strtolower($parameter->id));

            if (method_exists($this, $method)) {
                $replaceTags[$oneTag] = $this->$method($email, $user, $parameter);
            } else {
                $replaceTags[$oneTag] = 'Method not found: '.$method;
            }
        }

        $this->pluginHelper->replaceTags($email, $replaceTags, true);
    }

    private function getAttachedListid($email, $subid)
    {
        $mailid = $email->id;

        if (isset($this->lists[$mailid][$subid])) {
            return $this->lists[$mailid][$subid];
        }

        $mailClass = new MailClass();
        $mailLists = array_keys($mailClass->getAllListsByMailId($mailid));
        $userLists = [];

        if (!empty($subid)) {
            $userClass = $this->getUserClass();
            $userLists = $userClass->getUserSubscriptionById($subid, 'id', false, false, false, true);

            $listid = null;
            foreach ($userLists as $id => $oneList) {
                if ($oneList->status == 1 && in_array($id, $mailLists)) {
                    $this->lists[$mailid][$subid] = $id;

                    return $this->lists[$mailid][$subid];
                }
            }

            if (!empty($listid)) {
                $this->lists[$mailid][$subid] = $listid;

                return $listid;
            }
        }

        //We could not find a list id there... maybe there is no subscription in which case we take the first one...
        if (!empty($mailLists)) {
            $this->lists[$mailid][$subid] = array_shift($mailLists);

            return $this->lists[$mailid][$subid];
        }

        if (!empty($subid) && !empty($email->type) && $email->type === MailClass::TYPE_WELCOME) {
            //Last list the user subscribed to...
            $listid = acym_loadResult(
                'SELECT list.id 
				FROM #__acym_list AS list 
				JOIN #__acym_user_has_list AS userlist ON list.id = userlist.list_id 
				WHERE list.welcome_id = '.intval($mailid).' AND userlist.user_id = '.intval($subid).' 
				ORDER BY userlist.subscription_date DESC'
            );
            if (!empty($listid)) {
                $this->lists[$mailid][$subid] = $listid;

                return $listid;
            }
        }

        if (!empty($subid) && !empty($email->type) && $email->type === MailClass::TYPE_UNSUBSCRIBE) {
            //Last list the user unsubscribed from...
            $listid = acym_loadResult(
                'SELECT list.id 
				FROM #__acym_list AS list 
				JOIN #__acym_user_has_list AS userlist ON list.id = userlist.list_id 
				WHERE list.unsubscribe_id = '.intval($mailid).' AND userlist.user_id = '.intval($subid).' 
				ORDER BY userlist.unsubscribe_date DESC'
            );
            if (!empty($listid)) {
                $this->lists[$mailid][$subid] = $listid;

                return $listid;
            }
        }

        //Still no list? well, lets load the first list the user is subscribed to then
        if (!empty($userLists)) {
            $listIds = array_keys($userLists);
            $this->lists[$mailid][$subid] = array_shift($listIds);

            return $this->lists[$mailid][$subid];
        }

        return 0;
    }

    private function listnames(&$email, &$user, &$parameter)
    {
        if (empty($user->id)) return '';

        $userClass = $this->getUserClass();
        $usersubscription = $userClass->getUserSubscriptionById($user->id, 'id', false, true);
        $lists = [];
        if (!empty($usersubscription)) {
            foreach ($usersubscription as $onesub) {
                if ($onesub->status < 1 || empty($onesub->active)) {
                    continue;
                }
                $lists[] = (!empty($onesub->display_name) ? $onesub->display_name : $onesub->name);
            }
        }

        return implode(isset($parameter->separator) ? $parameter->separator : ', ', $lists);
    }

    /**
     * Replace data about the list owner
     * Use the tag:  {list:owner|field:name} or {list:owner|field:username} or {list:owner|field:email}
     */
    private function listowner(&$email, &$user, &$parameter)
    {
        if (empty($user->id)) {
            return '';
        }

        if (!in_array($parameter->field, ['username', 'name', 'email'])) {
            return 'Field not found : '.$parameter->field;
        }

        $listid = $this->getAttachedListid($email, $user->id);
        if (empty($listid)) {
            return '';
        }

        global $acymCmsUserVars;
        if (!isset($this->listsowner[$listid])) {
            $this->listsowner[$listid] = acym_loadObject(
                'SELECT `user`.* FROM #__acym_list AS `list` 
				JOIN '.$acymCmsUserVars->table.' AS `user` 
					ON `user`.'.$acymCmsUserVars->id.' = `list`.cms_user_id 
				WHERE `list`.id = '.intval($listid)
            );
        }

        return @$this->listsowner[$listid]->{$acymCmsUserVars->{$parameter->field}};
    }

    private function listname(&$email, &$user, &$parameter)
    {
        if (empty($user->id)) {
            return '';
        }
        $listid = $this->getAttachedListid($email, $user->id);
        if (empty($listid)) {
            return '';
        }

        $this->loadlist($listid);

        return !empty($this->listsinfo[$listid]->display_name) ? $this->listsinfo[$listid]->display_name : @$this->listsinfo[$listid]->name;
    }

    private function listdescription(&$email, &$user, &$parameter)
    {
        if (empty($user->id)) {
            return '';
        }
        if (!empty($parameter->listid)) $listid = $parameter->listid;
        if (empty($listid)) $listid = $this->getAttachedListid($email, $user->id);
        if (empty($listid)) {
            return '';
        }

        $this->loadlist($listid);

        return @$this->listsinfo[$listid]->description;
    }

    private function loadlist($listid)
    {
        if (isset($this->listsinfo[$listid])) {
            return;
        }

        $listClass = new ListClass();
        $this->listsinfo[$listid] = $listClass->getOneById(intval($listid));
    }

    private function listdescriptions(&$email, &$user, &$parameter)
    {
        if (empty($user->id)) return '';

        $userClass = $this->getUserClass();
        $usersubscription = $userClass->getUserSubscriptionById($user->id);
        $listids = [];
        if (!empty($parameter->listids)) $listids = explode(',', $parameter->listids);
        $lists = [];
        if (!empty($usersubscription)) {
            foreach ($usersubscription as $onesub) {
                if (empty($onesub->description) || $onesub->status < 1 || empty($onesub->active) || (!empty($listids) && !in_array($onesub->id, $listids))) {
                    continue;
                }
                $lists[] = $onesub->description;
            }
        }

        return implode(isset($parameter->separator) ? $parameter->separator : ', ', $lists);
    }

    private function listid(&$email, &$user, &$parameter)
    {
        if (empty($user->id)) {
            return '';
        }
        $listid = $this->getAttachedListid($email, $user->id);
        if (empty($listid)) {
            return '';
        }

        return $listid;
    }

    private function replaceSubscriptionTags(&$email)
    {
        $match = '#(?:{|%7B)(confirm|unsubscribe(?:\|[^}]+)*|unsubscribeall(?:\|[^}]+)*|direct_unsubscribe(?:\|[^}]+)*|disable_tracking(?:\|[^}]+)*|subscribe(?:\|[^}]+)*)(?:}|%7D)(.*)(?:{|%7B)/(confirm|unsubscribe|direct_unsubscribe|unsubscribeall|disable_tracking|subscribe)(?:}|%7D)#Uis';
        $variables = ['subject', 'body'];
        $found = false;
        $results = [];
        foreach ($variables as $var) {
            if (empty($email->$var)) continue;

            $found = preg_match_all($match, $email->$var, $results[$var]) || $found;
            //we unset the results so that we won't handle it later... it will save some memory and processing
            if (empty($results[$var][0])) unset($results[$var]);
        }

        //If we didn't find anything...
        if (!$found) return;

        $tags = [];
        $this->addedListUnsubscribe[$email->id] = [];
        foreach ($results as $var => $allresults) {
            foreach ($allresults[0] as $i => $oneTag) {
                //Don't need to process twice a tag we already have!
                if (isset($tags[$oneTag])) continue;

                $tags[$oneTag] = $this->replaceSubscriptionTag($allresults, $i, $email);
            }
        }

        $this->pluginHelper->replaceTags($email, $tags);
    }

    private function replaceSubscriptionTag(&$allresults, $i, &$email)
    {
        $parameters = $this->pluginHelper->extractTag($allresults[1][$i]);

        $lang = $this->getLanguage($email->links_language);

        if ($parameters->id === 'confirm') {
            // subscription confirmation link
            $myLink = acym_frontendLink('frontusers&task=confirm&userId={subscriber:id}&userKey={subscriber:key|urlencode}'.$lang);
            if (empty($allresults[2][$i])) {
                return $myLink;
            }

            return '<a target="_blank" href="'.$myLink.'"><span class="acym_confirm acym_link">'.$allresults[2][$i].'</span></a>';
        } elseif ($parameters->id === 'subscribe') {
            // direct subscription link
            if (empty($parameters->lists)) {
                return acym_translation('ACYM_EXPORT_SELECT_LIST');
            }
            $lists = explode(',', $parameters->lists);
            acym_arrayToInteger($lists);
            $captchaKey = $this->config->get('captcha', 'none') !== 'none' ? '&seckey='.$this->config->get('security_key', '') : '';
            $myLink = acym_frontendLink(
                'frontusers&task=subscribe&hiddenlists='.implode(',', $lists).'&userId={subscriber:id}&userKey={subscriber:key|urlencode}'.$lang.$captchaKey
            );
            if (empty($allresults[2][$i])) {
                return $myLink;
            }

            return '<a style="text-decoration:none;" target="_blank" href="'.$myLink.'"><span class="acym_subscribe acym_link">'.$allresults[2][$i].'</span></a>';
        } elseif ($parameters->id === 'direct_unsubscribe') {
            $mailId = $email->id;
            $myLink = acym_frontendLink(
                'frontusers&task=unsubscribe'
                .'&userId={subscriber:id}'
                .'&userKey={subscriber:key|urlencode}'
                .'&direct=1'
                .'&mail_id='.$mailId
                .$lang
            );
            if (!empty($parameters->redirect)) {
                $myLink .= '&redirectunsub='.urlencode($parameters->redirect);
            }

            if (empty($allresults[2][$i])) {
                return $myLink;
            }

            return '<a style="text-decoration:none;" target="_blank" href="'.$myLink.'"><span class="acym_unsubscribe_direct acym_link">'.$allresults[2][$i].'</span></a>';
        } elseif ($parameters->id === 'disable_tracking') {
            $myLink = acym_frontendLink(
                'frontusers&task=disableTracking'
                .'&userId={subscriber:id}'
                .'&userKey={subscriber:key|urlencode}'
                .'&mail_id='.$email->id
                .$lang
            );

            if (empty($allresults[2][$i])) {
                return $myLink;
            }

            return '<a style="text-decoration:none;" target="_blank" href="'.$myLink.'"><span class="acym_disable_tracking acym_link">'.$allresults[2][$i].'</span></a>';
        } else {
            $baseLink = 'frontusers'.$lang.'&mail_id='.$email->id;
            if ($parameters->id === 'unsubscribe') {
                $unsubscribeLink = $baseLink.'&task=unsubscribe&userId={subscriber:id}&userKey={subscriber:key|urlencode}';
                if (ACYM_CMS !== 'wordpress') {
                    $unsubscribeLink .= '&'.acym_noTemplate();
                }
                $unsubClass = 'acym_unsubscribe';
            } else {
                $unsubscribeLink = $baseLink.'&task=unsubscribeAll&user_id={subscriber:id}&user_key={subscriber:key|urlencode}';
                $unsubClass = 'acym_unsubscribe_all_lists';
            }

            $needToCompleteLink = true;
            if (!empty($parameters->baseUrl)) {
                $unsubscribeLink = $parameters->baseUrl.$unsubscribeLink;
                $needToCompleteLink = false;
            }

            $unsubscribeLink = acym_frontendLink($unsubscribeLink, $needToCompleteLink);

            if ($parameters->id === 'unsubscribeall' && !empty($parameters->redirect)) {
                $unsubscribeLink .= (strpos($unsubscribeLink, '?') === false ? '?' : '&').'redirectunsub='.urlencode($parameters->redirect);
            }

            $this->unsubscribeLink[$email->id] = $unsubscribeLink;

            if (empty($allresults[2][$i])) {
                return $unsubscribeLink;
            }

            return '<a style="text-decoration:none;" target="_blank" href="'.$unsubscribeLink.'"><span class="'.$unsubClass.' acym_link">'.$allresults[2][$i].'</span></a>';
        }
    }

    private function getUserClass()
    {
        if ($this->userClass === null) {
            $this->userClass = new UserClass();
        }

        return $this->userClass;
    }
}

```
