Can you Exclude the Price Block from Public Cache for Only the Logged-in Users?

You might have a situation where pricing varies per logged-in user and is fetched via API from an external ERP system. Under this system, logged-out users would see no pricing at all.

What a non-logged-in user would see:

What a logged-in user would see:

Here's how it should work: When a user clicks login, that customer's discounted prices would be fetched directly from an external API solution. We would set this up through two customer groups: group ID 1, which would be for logged-in users, and group ID 2, for everyone else. The API update would happen for everyone in group 1 and store 1, but not group 2.

Caching pages with this kind of setup is tricky. LiteMage is able to cache different prices per customer group, but not per individual customers. We cannot punch a hole for the price block, however, we can simply make the whole page either not cached, or privately cached. For this example, we would like to make customer group ID 1 (logged-in users) and store ID 1 to be privately cached.

To enable private cache, you will need to add CacheLookup private on in .htaccess after LiteMage on, as follows:

<IfModule Litespeed> 
LiteMage on 
CacheLookup private on
</IfModule>

Also you will need to modify LiteMage's app/code/community/Litespeed/Litemage/Helper/Esi.php. In protected function _getDefaultEnvCookieValue(), line 1160 - 1164 within if ($diffGrp = $this→_config→getConf(Litespeed_Litemage_Helper_Data::CFG_DIFFCUSTGRP)) add the following:

/* customized code added by for case 1 */
        if ($currCustomerGroup == 1 && $currStoreId == 1) {
                  $this->_cacheVars['flag'] |= self::CHBM_PRIVATE;
        }
/* end of customized code change */

The final code looks like so:

 protected function _getDefaultEnvCookieValue()
  {
  ...
  ...
               if ($diffGrp = $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_DIFFCUSTGRP)) {
                      // diff cache copy per customer group
                      $currCustomerGroup = Mage::getSingleton('customer/session')->getCustomerGroupId() ;
                      if ( Mage_Customer_Model_Group::NOT_LOGGED_IN_ID != $currCustomerGroup ) {
                              if ($diffGrp == 1) // diff copy per group
                                      $default['cgrp'] = $currCustomerGroup ;
                              elseif ($diffGrp == 2)    // diff copy for logged in user
                                      $default['cgrp'] = 'in' ;
                              elseif ($diffGrp == 3) {
                                      $cgset = $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_DIFFCUSTGRP_SET);
                                      if (isset($cgset[$currCustomerGroup]))
                                              $default['cgrp'] = $cgset[$currCustomerGroup];
                              }
              /* customized code added for case 1 */
                              if ($currCustomerGroup == 1 && $currStoreId == 1) {
                                      $this->_cacheVars['flag'] |= self::CHBM_PRIVATE;
                              }
              /* end of customized code change */
                      }
              }
...
...
}

So for the logged-in user in customer group 1 and store 1, product pages will be served from private cache and private ESI blocks. All other users will be served from public cache with private ESI blocks.

Update the LiteMage configuration:

Separate Cache Copy per Customer Group -> Yes

After the above change, you should be able to see that the pages are being served from LiteMage private cache.

  • Admin
  • Last modified: 2017/12/18 19:37
  • by Lisa Clarke