2

I have written a custom Drupal 8 module that will send article notifications to our Mailchimp subscribers.

Problem

Currently, the module loops over each of the article 'tags' and sends out a separate campaign for each. Consequently, if someone is subscribed two of an article's tags, they will receive two emails.

Solution

Instead, I'd like each person to receive a maximum of one email notification. I think that the best way to achieve this is to create a dynamic segment. Similar to the query posted here. However, I have been getting various errors, and can't find much help here and here.

Code

<?php

function mailchimp_notification_process(EntityInterface $node)
{
    global $base_url;

    $settings = Settings::get('mailchimp_audience');
    $content = (object) array(
        'subject_line' => 'XXX',
        'title' => 'Notification',
        'from_name' => 'XXX',
        'reply_to' => 'noreply@gmail.com'
    );
    $template_content = [
        'html' => [
            'value' => '<table align="center" border="0" cellpadding="0" cellspacing="0" height="100%" width="100%" id="bodyTable">email content removed for brevity</table>',
            'format' => 'mailchimp_campaign'
        ]
    ];

    $mc_campaign = mailchimp_get_api_object('MailchimpCampaigns');
    $lists = mailchimp_campaign_get_list_segments($settings, NULL);

    if (
        $node->isPublished() &&
        ($node->bundle() == 'article' || $node->bundle() == 'resource') &&
        $node->field_send_notification->getString() == 1 &&
        isset($node->field_send_notification_to->entity)
    ) {
        $all_tags = [];

        // loop over each of the loops to send notifications to
        foreach ($node->field_send_notification_to as $category) {
            $tags = array_filter($lists, function ($list) use ($category) {
                return $list->name == $category->entity->getName();
            });

            if ($tags && is_array($tags)) {
                $tags = reset($tags);
                array_push($all_tags, $tags->id);
                \Drupal::logger('mailchimp_notification')->notice('all_tags: ' . json_encode($all_tags));
            }
        }

        $recipients = (object) [
            'list_id' => $settings,
            'segment_opts' => [
                'match' => 'all',
                'conditions' => [
                    [
                        'condition_type' => 'Tags',
                        'field' => 'tags-123',
                        'op' => 'interestcontainsall',
                        'value' => $all_tags,
                    ]
                ]
            ]
        ];

        \Drupal::logger('mailchimp_notification')->notice('recipients: ' . json_encode($recipients));

        $campaign_id = mailchimp_campaign_save_campaign($template_content, $recipients, $content, "", "");

        if ($campaign_id) {
            $mc_campaign->send($campaign_id);
        }
    }
}
baikho
  • 5,203
  • 4
  • 40
  • 47
Darcy
  • 575
  • 2
  • 8
  • 21
  • The term `saved_segment_id` does not appear in the code you've provided. – miken32 Nov 13 '20 at 00:03
  • Yes, although I'm not sure where it should be included. I used to include `saved_segment_id` when was sending to sending tag. However, based on the answers linked above, I removed it when trying to create a dynamic segment. I have updated my question above to reflect that :) – Darcy Nov 13 '20 at 00:34

0 Answers0