Shipping Exceptions

How to disable shipping modules based on conditions

Most shipping modules have a zone configuration setting, which allows you to disable the shipping module if the customer is not in the specified zone.

What if instead, you want to disable a shipping module based on the cart contents?

Starting with Zen Cart 2.0.1, most shipping modules include a notifier in the update_status method (or a subordinate method) that allows you to set the enabled status.

If you are running an earlier version of Zen Cart, this change is easily backported.

Here’s an example observer that disables this module for product id 27. (Obviously you will want to customize this for your specifications.)

Create the file includes/classes/observers/auto.freeoptions.php as follows:


<?php
class zcObserverFreeoptions extends base
{
    public function __construct()
    {
        global $current_page_base;
        $this->attach(
            $this,
            [
                'NOTIFY_SHIPPING_FREEOPTIONS_UPDATE_STATUS',
            ]
        );
    }

    protected function update(&$class, $eventID, $not_used, &$enabled)
    {
        $products = $_SESSION['cart']->get_products();
        foreach($products as $product) {
            if ($product['id'] == 27) {

                $enabled = false; 
                return; 
            }
        }
    }
}

Backporting

If you are running an earlier version of Zen Cart than 2.0.1, this change is easily backported.

In the shipping method you want to update, copy the notification from the version of that file in 2.0.1. (The notifiers are distinct for each shipping module, and contain the shipping module’s name.)

For example, in the freeoptions module, the notifier is NOTIFY_SHIPPING_FREEOPTIONS_UPDATE_STATUS. To backport, modify includes/modules/shipping/freeoptions.php and copy this call to the end of the checkForFreeOptions function in Zen Cart 1.5.8 and Zen Cart 2.0.0, or the end of the update_status function in Zen Cart 1.5.7 and prior.

The notifier looks like this:

   if ($this->enabled) { 
       // -----
       // Give a watching observer the opportunity to disable the overall shipping module.
       //
       $this->notify('NOTIFY_SHIPPING_FREEOPTIONS_UPDATE_STATUS', [], $this->enabled);
   }

And be sure the shipping module extends base - some earlier versions of some shipping modules do not:

  class freeoptions extends base {



Still have questions? Use the Search box in the upper right, or try the full list of FAQs. If you can't find it there, head over to the Zen Cart support forum and ask there in the appropriate subforum. In your post, please include your Zen Cart and PHP versions, and a link to your site.

Is there an error or omission on this page? Please post to General Questions on the support forum. Or, if you'd like to open a pull request, just review the guidelines and get started. You can even PR right here.
Last modified May 16, 2024 by Scott Wilson (8e3fc439).