Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set subscriber status in Magento programmatically

I am trying to write a module that syncs my newsletter subscribers in Magento with a external database. I need to be able to update the subscription status in Magento programmatically but I am having diffuculty getting the "setStatus" method in Magento to work. It does not throw any errors but the code does not seem to have any effect. Below is the code where I call the method:

$collection = Mage::getResourceModel('newsletter/subscriber_collection')->showStoreInfo()->showCustomerInfo();

foreach ($collection as $cust) {
    $cust->setStatus(1);
}

In theory, this should set the status of all of my subscribers to "subscribed". I could optionally change the argument sent to "setStatus" to any of the below ints for a different status.

1: Subscribed 2: Status Not Active 3: Unsubscribed

How to best change the subscriber status or get this code working?

like image 767
Chuck D Avatar asked Feb 25 '11 04:02

Chuck D


3 Answers

Here an import script:

<?php
require_once("./app/Mage.php");
Mage::app();

$subscribers = array('[email protected]', '[email protected]');

foreach ($subscribers as $email) {
    # create new subscriber without send an confirmation email
    Mage::getModel('newsletter/subscriber')->setImportMode(true)->subscribe($email);

    # get just generated subscriber
    $subscriber = Mage::getModel('newsletter/subscriber')->loadByEmail($email);

    # change status to "subscribed" and save
    $subscriber->setStatus(Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED);
    $subscriber->save();
}
?>
like image 169
panticz Avatar answered Oct 23 '22 22:10

panticz


It seems that newsletter subscribers are also stored elsewhere. What you are setting is just a check in the customer base for some other use.

You need to do the following for each customer as well.

Mage::getModel('newsletter/subscriber')->subscribe($email);

See this link for a complete reference.

like image 5
Ozair Kafray Avatar answered Oct 23 '22 21:10

Ozair Kafray


Thanks to the link @Ozair shared I was able to figure out what I needed to do.

I was successfully setting the status of the subscriber in the Magento subscriber object but I was not saving the object. I needed to call Magento's save method so it would call the ORM and write it to the database. All I need to do was add

$cust->save();

in the for loop. Below is the whole code snippet.

$collection = Mage::getResourceModel('newsletter/subscriber_collection')->showStoreInfo()->showCustomerInfo();

foreach ($collection as $cust) {
    $cust->setStatus(1);
    $cust->save();
}

I Hope this helps someone in the future. I needed it for a Constant Contact - Magento Synchronization extension I was making: http://www.freelunchlabs.com/store/constant-contact-and-magento-sync.html

like image 3
Chuck D Avatar answered Oct 23 '22 20:10

Chuck D