That's a know issue with Sitecore WFFM action Add Contact to Contact List
.
If you use EXM, you can use code below to override the default action. Remember that your contact should have First Name
, Surname
and Email
set.
If you don't use EXM, contact with Sitecore Support. They can provide you a support dll appropriate for your Sitecore and WFFM versions.
using System;
using System.Linq;
using Sitecore.Analytics.Model;
using Sitecore.Analytics.Tracking;
using Sitecore.Data;
using Sitecore.Diagnostics;
using Sitecore.Modules.EmailCampaign;
using Sitecore.SecurityModel;
using Sitecore.WFFM.Abstractions.Actions;
using Sitecore.WFFM.Abstractions.Analytics;
using Sitecore.WFFM.Abstractions.Shared;
namespace WffmCustomization
{
public class AddContactToContactList : Sitecore.WFFM.Actions.SaveActions.AddContactToContactList
{
private const string RootListPath = "/sitecore/system/Modules/E-mail Campaign Manager/System/Root List";
private const string ManagerRootsFieldName = "Manager Roots";
private readonly IAnalyticsTracker _analyticsTracker;
public AddContactToContactList(IAnalyticsTracker analyticsTracker, IContactRepository contactRepository) : base(analyticsTracker, contactRepository)
{
_analyticsTracker = analyticsTracker;
}
public override void Execute(ID formId, AdaptedResultList adaptedFields, ActionCallContext actionCallContext = null, params object[] data)
{
Assert.ArgumentNotNull(adaptedFields, "adaptedFields");
Assert.IsNotNullOrEmpty(ContactsLists, "Empty contact list.");
Assert.IsNotNull(_analyticsTracker.CurrentContact, "Tracker.Current.Contact");
if (!adaptedFields.IsTrueStatement(ExecuteWhen))
return;
var lists = ContactsLists.Split(',').Select(x => ID.Parse(x).ToString()).ToArray();
using (new SecurityDisabler())
{
Contact currentContact = _analyticsTracker.CurrentContact;
if (currentContact.Identifiers.IdentificationLevel != ContactIdentificationLevel.Known)
{
var emailAddresses = currentContact.GetFacet<Sitecore.Analytics.Model.Entities.IContactEmailAddresses>("Emails");
if (emailAddresses.Entries.Contains("Preferred"))
{
var email = emailAddresses.Entries["Preferred"];
_analyticsTracker.Current.Session.Identify(email.SmtpAddress);
}
}
var recipientId = new Sitecore.Modules.EmailCampaign.Xdb.XdbContactId(currentContact.ContactId);
var rootList = (Sitecore.Context.ContentDatabase ?? Sitecore.Context.Database).GetItem(RootListPath);
Assert.IsNotNull(rootList, "Empty root list.");
var managerRootId = (rootList[ManagerRootsFieldName] ?? string.Empty).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
Assert.IsNotNullOrEmpty(managerRootId, "Empty manager root id.");
Log.Info($"AddContactToContactList [{currentContact.ContactId}, {ContactsLists}, {managerRootId}]", this);
ClientApi.UpdateSubscriptions(recipientId, lists, new string[] { }, managerRootId, false);
}
}
}
}
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:set="http://www.sitecore.net/xmlconfig/set/">
<sitecore>
<wffm>
<actions>
<addContactToContactList type="Sitecore.WFFM.Actions.SaveActions.AddContactToContactList, Sitecore.WFFM.Actions" >
<patch:attribute name="type">WffmCustomization.AddContactToContactList, WffmCustomization</patch:attribute>
</addContactToContactList>
</actions>
</wffm>
</sitecore>
</configuration>
EDIT
Below is the code I receive from Sitecore Support for fixing the number of recipients of all the contact lists in Sitecore. I received it for another Sitecore version but it should do the trick in your case as well:
ListManager<ContactList, ContactData> listManager = Factory.CreateObject("contactListManager", false) as ListManager<ContactList, ContactData>;
using (new SecurityDisabler())
{
using (IEnumerator<ContactList> enumerator = ((IEnumerable<ContactList>) listManager.GetAll((string) null, true)).GetEnumerator())
{
while (((IEnumerator) enumerator).MoveNext())
{
ContactList current = enumerator.Current;
Item obj = Factory.GetDatabase(ListManagementSettings.get_Database()).GetItem(current.get_Id());
this.Response.Write("List: " + current.get_DisplayName() + ", list id: (" + current.get_Id() + "), contacts in index: " + (object) listManager.GetContacts(current).Count<ContactData>() + ", contacts in field: " + ((BaseItem) obj).get_Item("Recipients"));
if (obj != null && listManager.GetContacts(current).Count<ContactData>() > int.Parse(((BaseItem) obj).get_Item("Recipients")))
{
obj.get_Editing().BeginEdit();
((BaseItem) obj).set_Item("Recipients", listManager.GetContacts(current).Count<ContactData>().ToString());
obj.get_Editing().EndEdit();
this.Response.Write("</br>List field was updated");
}
this.Response.Write("</br></br>");
}
}
}