Dynamic Filter v1.2


OVERVIEW

Dynamic Filter will allow your customers to filter the products listed on any product listing page (including All Products, New Products, Featured Products, Specials and Search Results) in your store.
Customers can filter by manufacturer, category, price and any attribute.

The module allows you among other things, to control which pages the filter appears on, the filter style (links, checkboxes or dropdowns) and also allows you to include or exclude attributes.

The Stock by Attribute module is supported (tested on version 4.7 but should work with all versions) if installed; only items with stock will be shown in the list.

Google Event Tracking is supported and has been tested to work with Simple Google Analytics v1.2.5 but should work with all versions.

INSTALL/UNINSTALL

!!!!!BACKUP YOUR STORE BEFORE YOU BEGIN!!!!!

There are different versions of the Dynamic Filter depending on which version of Zen Cart you are using, so you will need to follow the relevant installation instructions.

Installation of the module has been made as simple as possible and shouldn't take long for any stores which have not already modified any of the core files which this module has to modify.

  1. Installation for Zen Cart version 1.3.9h
  2. Installation for Zen Cart version 1.5.0
  3. Installation for Zen Cart version 1.5.1
  4. Uninstall for all versions

Installation instructions for Zen Cart version 1.3.9h

Before you start you should rename all folders in the distribution named 'YOUR_TEMPLATE' to the template folder name you are using.

You will find 3 folders beneath the folder named 'dynamic_filter_1.3.9h', one contains new files, one template override files and the other modified core files.

  1. New Files
    Copy the includes folder from the 'new files' folder into your store's main directory.
    The files are already in the correct directory structure, so a single drag-and-drop of the folder into the root directory for the store will put the files in the correct locations.
    Please do not copy the files individually - doing so often results in files being missed out!
    • includes/extra_datafiles/dynamic_filter_filenames.php
    • includes/languages/english/extra_definitions/YOUR_TEMPLATE/dynamic_filter_defines.php
    • includes/modules/pages/advanced_search_result/jscript_dynamic_filter.php
    • includes/modules/pages/featured_products/jscript_dynamic_filter.php
    • includes/modules/pages/index/jscript_dynamic_filter.php
    • includes/modules/pages/products_all/jscript_dynamic_filter.php
    • includes/modules/pages/products_new/jscript_dynamic_filter.php
    • includes/modules/pages/specials/jscript_dynamic_filter.php
    • includes/modules/sideboxes/YOUR_TEMPLATE/dynamic_filter.php
    • includes/modules/YOUR_TEMPLATE/dynamic_filter.php
    • includes/templates/YOUR_TEMPLATE/buttons/english/clear_all_filters.png
    • includes/templates/YOUR_TEMPLATE/buttons/english/filter.png
    • includes/templates/YOUR_TEMPLATE/css/style_dynamic_filter.css
    • includes/templates/YOUR_TEMPLATE/images/arrow_less.gif
    • includes/templates/YOUR_TEMPLATE/images/arrow_more.gif
    • includes/templates/YOUR_TEMPLATE/images/clear_filter.png
    • includes/templates/YOUR_TEMPLATE/jscript/dynamic_filter/jquery.dynamic_filter.js
    • includes/templates/YOUR_TEMPLATE/jscript/dynamic_filter/jquery.dynamic_filter.min.js
    • includes/templates/YOUR_TEMPLATE/sideboxes/tpl_dynamic_filter.php
  2. Template Override Files
    A single standard Zen Cart template file requires modifications.
    The sample template file can be found within the 'template file overrides' folder in the distribution as follows.
    • includes/index_filters/YOUR_TEMPLATE/default_filter.php
    • If this template file hasn't already been modified for your store, the sample file included in this distribution can be copied into the store's template directory and will then override the standard version of the file included in the Zen Cart distribution.

    • If this template file has already been modified for your store, then you will need to copy the code changes from the sample file across to your modified file. The changes are clearly marked within the sample files (with “// bof dynamic filter x of x” and “// eof dynamic filter x of x” comments) in the distribution and should be easy enough to copy across, especially if a “diff” software package (such as DiffMerge or WinMerge) is used.
      Do not make changes to your template files without taking a copy of them first so you can replace them later if needed!

  3. Modified Core Files
    A few core Zen Cart files must be modified to work with the Dynamic Filter module.
    If any of the core files this distribution uses have already been modified (because of another third party module being installed for example) then the changes for the respective files should be applied manually by copying across the appropriate sections of code required for the Dynamic Filter module. These sections are clearly marked (with “// bof dynamic filter x of x” and “// eof dynamic filter x of x” comments) within the sample files provided in this distribution and should be easy enough to copy across, especially if a “diff” software package (such as DiffMerge or WinMerge) is used.
    The modified files can be found within the 'core file overrides' folder in the distribution as follows.
    Do not make changes to your core files without taking a copy of them first so you can replace them later if needed!
    • includes/classes/split_page_results.php
    • includes/functions/functions_general.php
    • includes/modules/pages/advanced_search_result/header_php.php
    • includes/modules/pages/featured_products/header_php.php
    • includes/modules/pages/products_all/header_php.php
    • includes/modules/pages/products_new/header_php.php
    • includes/modules/pages/specials/header_php.php
    • includes/modules/pages/specials/main_template_vars.php
  4. Run the SQL patch and Configure the Dynamic Filter Settings
    Create a new configuration switch for the Dynamic Filter module by running the 'install.sql' via Admin->Tools->Install SQL Patches.
Canonical Support
Canonical support, which is built in to Zen Cart can be used to omit Dynamic Filter variables from the generated canonical tag by adding your filter variables to the $excludeParams array in the following file (not supplied in this distribution):
  • includes/init_includes/init_canonical.php
For example, if your store has the option 'Colour', add the following line of code shown in red, found around line 18:
  • // EXCLUDE certain parameters which should not be included in canonical links:
  • $excludeParams = array('zenid', 'action', 'main_page', 'currency', 'typefilter', 'gclid', 'search_in_description', 'pto', 'pfrom', 'dto', 'dfrom', 'inc_subcat');
  • $excludeParams[] = 'disp_order';
  • $excludeParams[] = 'page';
  • $excludeParams[] = 'sort';
  • $excludeParams[] = 'alpha_filter_id';
  • $excludeParams[] = 'filter_id';
  • $excludeParams[] = 'utm_source';
  • $excludeParams[] = 'utm_medium';
  • $excludeParams[] = 'utm_content';
  • $excludeParams[] = 'utm_campaign';
  • $excludeParams[] = 'language';
  • $excludeParams[] = DYNAMIC_FILTER_PREFIX . 'Colour';
A note about jQuery
Some functions of Dynamic Filter require the jQuery library to be available (see configuration section for details on which features require jQuery). If your store does not already have jQuery available you can download it here.
Once downloaded, rename it by prefixing with 'jscript_' so if the file you have downloaded is 'jquery-1.4.0.min.js', you would rename it to 'jscript_jquery-1.4.0.min.js'.
Now upload to includes/templates/YOUR_TEMPLATE/jscript in your store.

Back to top


Installation instructions for Zen Cart version 1.5.0

Before you start you should rename all folders in the distribution named 'YOUR_TEMPLATE' to the template folder name you are using, and rename the 'admin' folder in the distribution to the admin folder name you are using.

You will find 3 folders beneath the folder named 'dynamic_filter_1.5.0', one contains new files, one template override files and the other modified core files.

  1. New Files
    Copy the includes folder from the 'new files' folder into your store's main directory.
    The files are already in the correct directory structure, so a single drag-and-drop of the folder into the root directory for the store will put the files in the correct locations.
    Please do not copy the files individually - doing so often results in files being missed out!
    • admin/includes/extra_datafiles/dynamic_filter_filenames.php
    • includes/extra_datafiles/dynamic_filter_filenames.php
    • includes/languages/english/extra_definitions/YOUR_TEMPLATE/dynamic_filter_defines.php
    • includes/modules/pages/advanced_search_result/jscript_dynamic_filter.php
    • includes/modules/pages/featured_products/jscript_dynamic_filter.php
    • includes/modules/pages/index/jscript_dynamic_filter.php
    • includes/modules/pages/products_all/jscript_dynamic_filter.php
    • includes/modules/pages/products_new/jscript_dynamic_filter.php
    • includes/modules/pages/specials/jscript_dynamic_filter.php
    • includes/modules/sideboxes/YOUR_TEMPLATE/dynamic_filter.php
    • includes/modules/YOUR_TEMPLATE/dynamic_filter.php
    • includes/templates/YOUR_TEMPLATE/buttons/english/clear_all_filters.png
    • includes/templates/YOUR_TEMPLATE/buttons/english/filter.png
    • includes/templates/YOUR_TEMPLATE/css/style_dynamic_filter.css
    • includes/templates/YOUR_TEMPLATE/images/arrow_less.gif
    • includes/templates/YOUR_TEMPLATE/images/arrow_more.gif
    • includes/templates/YOUR_TEMPLATE/images/clear_filter.png
    • includes/templates/YOUR_TEMPLATE/jscript/dynamic_filter/jquery.dynamic_filter.js
    • includes/templates/YOUR_TEMPLATE/jscript/dynamic_filter/jquery.dynamic_filter.min.js
    • includes/templates/YOUR_TEMPLATE/sideboxes/tpl_dynamic_filter.php
  2. Template Override Files
    A single standard Zen Cart template file requires modifications.
    The sample template file can be found within the 'template file overrides' folder in the distribution as follows.
    • includes/index_filters/YOUR_TEMPLATE/default_filter.php
    • If this template file hasn't already been modified for your store, the sample file included in this distribution can be copied into the store's template directory and will then override the standard version of the file included in the Zen Cart distribution.

    • If this template file has already been modified for your store, then you will need to copy the code changes from the sample file across to your modified file. The changes are clearly marked within the sample files (with “// bof dynamic filter x of x” and “// eof dynamic filter x of x” comments) in the distribution and should be easy enough to copy across, especially if a “diff” software package (such as DiffMerge or WinMerge) is used.
      Do not make changes to your template files without taking a copy of them first so you can replace them later if needed!

  3. Modified Core Files
    A few core Zen Cart files must be modified to work with the Dynamic Filter module.
    If any of the core files this distribution uses have already been modified (because of another third party module being installed for example) then the changes for the respective files should be applied manually by copying across the appropriate sections of code required for the Dynamic Filter module. These sections are clearly marked (with “// bof dynamic filter x of x” and “// eof dynamic filter x of x” comments) within the sample files provided in this distribution and should be easy enough to copy across, especially if a “diff” software package (such as DiffMerge or WinMerge) is used.
    The modified files can be found within the 'core file overrides' folder in the distribution as follows.
    Do not make changes to your core files without taking a copy of them first so you can replace them later if needed!
    • includes/classes/split_page_results.php
    • includes/functions/functions_general.php
    • includes/modules/pages/advanced_search_result/header_php.php
    • includes/modules/pages/featured_products/header_php.php
    • includes/modules/pages/products_all/header_php.php
    • includes/modules/pages/products_new/header_php.php
    • includes/modules/pages/specials/header_php.php
    • includes/modules/pages/specials/main_template_vars.php
  4. Run the SQL patch and Configure the Dynamic Filter Settings
    Create a new configuration switch for the Dynamic Filter module by running the 'install.sql' via Admin->Tools->Install SQL Patches.
Canonical Support
Canonical support, which is built in to Zen Cart can be used to omit Dynamic Filter variables from the generated canonical tag by adding your filter variables to the $excludeParams array in the following file (not supplied in this distribution):
  • includes/init_includes/init_canonical.php
For example, if your store has the option 'Colour', add the following line of code shown in red, found around line 18:
  • // EXCLUDE certain parameters which should not be included in canonical links:
  • $excludeParams = array('zenid', 'action', 'main_page', 'currency', 'typefilter', 'gclid', 'search_in_description', 'pto', 'pfrom', 'dto', 'dfrom', 'inc_subcat');
  • $excludeParams[] = 'disp_order';
  • $excludeParams[] = 'page';
  • $excludeParams[] = 'sort';
  • $excludeParams[] = 'alpha_filter_id';
  • $excludeParams[] = 'filter_id';
  • $excludeParams[] = 'utm_source';
  • $excludeParams[] = 'utm_medium';
  • $excludeParams[] = 'utm_content';
  • $excludeParams[] = 'utm_campaign';
  • $excludeParams[] = 'language';
  • $excludeParams[] = DYNAMIC_FILTER_PREFIX . 'Colour';
A note about jQuery
Some functions of Dynamic Filter require the jQuery library to be available (see configuration section for details on which features require jQuery). If your store does not already have jQuery available you can download it here.
Once downloaded, rename it by prefixing with 'jscript_' so if the file you have downloaded is 'jquery-1.4.0.min.js', you would rename it to 'jscript_jquery-1.4.0.min.js'.
Now upload to includes/templates/YOUR_TEMPLATE/jscript in your store.

Back to top


Uninstall instructions for all Zen Cart versions

There is no need to remove the Dynamic Filter module, as it can be completely disabled in admin (see Configuration).
If you do wish to remove the module, simply delete all the New Files loaded in step 1, delete (or replace with your original if the file was already present) Template Override Files loaded in step 2, then replace all the Modified Core Files loaded in step 3 with your original files.

Finally, run 'uninstall.sql' to remove the configuration switch.

Back to top

CONFIGURATION

Switching On

After the install, the filter is enabled on all category pages as well as all products, new products, featured products, specials and the search results page. However, the filter will not be displayed in your store before you switch it on.
To switch the filter on, go to Admin -> Tools -> Layout Boxes Controller and switch on the sidebox named 'sideboxes/YOUR_TEMPLATE/dynamic_filter.php'.

Admin Options

This module includes an admin option to enable/disable the module and more.
All controls can be accessed via Admin -> Configuration -> Dynamic Filter. The image below shows the admin controls.

Admin controls

Enabling/Disabling the Filter The first 6 switches allow you to control which pages the Dynamic Filter will be available on; it can be enabled or disabled on all category pages, all products, new products, featured products, specials and search results pages.
Just set the relevant switch to True or False.

  • Enable on Category Pages
  • Enable on All Products Page
  • Enable on New Products Pages
  • Enable on Featured Products Pages
  • Enable on Specials Page
  • Enable on Search Page

Styling the Filter The Dynamic Filter can be rendered in different styles depending on your preference.
For example, if a section has too many options you can choose to display that section in a minimized format.The following section describes the function of the styling switches.

  • Filter Style
  • Disabled Options Method
  • Options Box Style
  • Maximum Number of Options
  • Maximum Number of Price Ranges
  • Minimum Price Range
  • Maximum Price Range
  • Include Options
  • Exclude Options
  1. Filter Style
    The Filter Style switch is used to control how the Dynamic Filter behaves.
    In 'Link' mode, each option is a text link; when you click one of the options the page is refreshed immediately before any other options can be clicked.
    When in 'Dropdown' mode, each option is an item in a dropdown list. There are two Dropdown modes to choose - Single and Multi.
    In 'Single' mode, when you choose an option the page is refreshed immediately before any other options can be chosen.
    In 'Multi' mode, you can choose as many options as you like before the page is refreshed. To refresh the page, you must click the 'Filter' button.
    When in 'Checkbox' mode, each option is a checkbox. Like Dropdown, there are two Checkbox modes to choose - Single and Multi.
    In 'Single' mode, when you check a box the page is refreshed immediately before any other boxes can be checked.
    In 'Multi' mode, you can check as many boxes as you like before the page is refreshed. To refresh the page, you must click the 'Filter' button.
    Single dropdown and single checkbox mode require javascript to be enabled.
    Filter Style 'Link'
    Filter Style 'Dropdown - Multi'
    Filter Style 'Checkbox - Multi'
  2. Disabled Options Method
    The Disabled Options Method switch is used to control how disabled options are handled.
    The available options are 'greyed' and 'hidden'.
    The greyed option leaves the options visible but greyed out so they cannot be clicked.
    The hidden option hides the options completely.
    In the examples shown below, the Price, Colour and Size attributes demonstrate this.
    Disabled Options Method 'Greyed'
    Disabled Options Method 'Hidden'
  3. Options Box Style & Maximum Number of Options
    The Options Box Style switch is used to control how options are displayed when the Maximum Number of Options has been reached.
    This switch has two possible settings, 'scroll' and 'expand'.
    The scroll method uses a scroll box to minimize the number of options on display.
    The expand method uses a more/less link to expand/contract the available space for the option. The expand method uses jQuery to achieve a smooth expand/contract effect, so requires you have the jQuery library available. See the Installation section for more information on this.
    Both methods are shown in the examples below.
    Expand mode requires javascript to be enabled.


  4. The Maximum Number of Options switch is used to control the number of options shown under each sub-heading.
    In the examples shown below, the 'Colour' attribute demonstrates the effect when the maximum number of options is triggered.
    Options Box Style 'Scroll'
    Options Box Style 'Expand'
  5. Maximum Number of Price Ranges
    The Maximum Number of Price Ranges controls how the Dynamic Filter price ranges will be calculated.
    The filter will attempt to generate no more price ranges than the number specified.
    This number can be overridden by the Maximum Price Range below.


  6. Minimum Price Range & Maximum Price Range
    The Minimum Price Range is used to control the minimum gap between prices shown in the Price section of the filter.
    The Maximum Price Range is used to control the maximum gap between prices shown in the Price section of the filter. This value can override the Maximum Number of Price Ranges control.


  7. Include Options
    The Include Options control allows you to specify a definitive list of attributes to display in the filter.
    The list should include the Option Name IDs (as found in Admin -> Catalog -> Option Name Manager) separated by a comma.
    Leave this option empty to include all attributes.


  8. Exclude Options
    The Exclude Options control allows you to specify a list of attributes to omit from the filter.
    The list should include the Option Name IDs (as found in Admin -> Catalog -> Option Name Manager) separated by a comma.
    Leave this option empty to exclude no attributes.

Additional Settings
Dynamic Filter allows for event tracking in Google Analytics if the 'Filter Style' is set to either 'Link' or 'Checkbox - Single'.
Both the traditional ga.js and new asyncronous methods are supported.
If you wish to switch this function on, set Google Event Tracking to the desired method.
This will generate code to track customers adding and removing filters to help you analyse what they are looking for.
To switch this feature off, set it to 'No'.
Google event tracking requires javascript to be enabled and Google Analytics code active in your store, such as Simple Google Analytics

  • Google Event Tracking

Optional (but recommended) Settings
Zen Cart comes as standard with a manufacturer/category shown at the top of category pages.
It is recommended that this is swithced off as the Dynamic Filter also has a manufacturer/category section.
To switch the standard Zen Cart filter off, go to Admin -> Configuration -> Product Listing and set 'Display Category/Manufacturer Filter' to off.

FAQs

  1. How can I change the filter sidebox heading?
  2. How can I change the filter sub-headings?
  3. How can I change the filter querystring prefix?
  4. How can I change the filter querystring names?
  5. I have URI mapping software installed in my store. Does this modification work with URI mapping?
  6. Is it possible to hook into Dynamic Filter, to redirect banner ads to a pre-filtered list for example?

How can I change the filter sidebox heading?

The Dynamic Filter sidebox heading is initially set to 'Narrow Your Results'. This can be changed if required.
To change it, open up file includes/languages/english/extra_definitions/YOUR_TEMPLATE/dynamic_filter_defines.php and change the following line to reflect the heading you require

  • define('BOX_HEADING_FILTER', 'Narrow Your Results');

Back to top


How can I change the filter sub-headings?

All sub-headings are prefixed with the word 'By' and suffixed with a colon (':'). If you need to change these, open up file includes/languages/english/extra_definitions/YOUR_TEMPLATE/dynamic_filter_defines.php and change the following lines as you require

  • define('DYNAMIC_FILTER_TEXT_PREFIX', 'By ');
  • define('DYNAMIC_FILTER_TEXT_SUFFIX', ':');

The manufacturer, category and price sub-headings are initially set to 'By Brand:', 'By Category:' and 'By Price:' respecitvely. These can also be changed if required.
To change them, open up file includes/languages/english/extra_definitions/YOUR_TEMPLATE/dynamic_filter_defines.php and change the following lines to reflect the sub-headings you require

  • define('DYNAMIC_FILTER_TEXT_MANUFACTURER','Brand');
  • define('DYNAMIC_FILTER_TEXT_CATEGORY','Category');
  • define('DYNAMIC_FILTER_TEXT_PRICE','Price');

All other sub-headings are generated by taking the name of the attribute (e.g, if your products have an attribute of colour, the heading would be 'By Colour:') so these can only be changed by changing the attribute name.

Back to top


How can I change the filter querystring prefix?

Each time a filter is applied it is added to the querystring in the URL. A prefix is used which is initially set to 'flt' e.g. when filtering by category you will see 'fltCategory[]=xx' in the querystring). This can be changed if required.
Open up file includes/languages/english/extra_definitions/YOUR_TEMPLATE/dynamic_filter_defines.php and change the following line to reflect the prefix you require

  • define('DYNAMIC_FILTER_PREFIX', 'flt');

Back to top


How can I change the filter querystring names?

The querystring names for manufacturer, category and price are initially set to 'Brand', 'Category' and 'Price' respectively (e.g. when filtering by manufacturer you will see 'fltBrand[]=xx' in the querystring). This can be changed if required.
Open up file includes/languages/english/extra_definitions/YOUR_TEMPLATE/dynamic_filter_defines.php and change the following lines to reflect the names you require

  • define('DYNAMIC_FILTER_MANUFACTURER_GROUP','Brand');
    define('DYNAMIC_FILTER_CATEGORY_GROUP','Category');
    define('DYNAMIC_FILTER_PRICE_GROUP','Price');

All other querystring names are generated by taking the name of the attribute (e.g, if your products have an attribute of size, the querystring name would be 'fltSize') so these can only be changed by changing the attribute name.

Back to top


I have URI mapping software installed in my store. Does this modification work with URI mapping?

Dynamic Filter has been tested and is fully working with Ceon URI mapping version 4.0.7 but should work with earlier versions of this software too.
It has not been tested but shouldn't be too hard to modify to work with any other mapping software.
Only the file below would need to be editted. Scanning this file for 'CEON' will show the specific code edits that allow Dynamic Filter to work with Ceon URI mapping.

  • includes/templates/YOUR_TEMPLATE/sideboxes/tpl_dynamic_filter.php

Back to top


Is it possible to hook into Dynamic Filter, to redirect banner ads to a pre-filtered list for example?

You can easily hook in to the Dynamic Filter by simply adding the required filters to the end of the querystring.
For example, if your store sells jackets and pants and you would like to direct a banner ad to New Jackets and Pants you could use the following in the Banner URL

  • /index.php?main_page=products_new&fltCategory[]=xx&fltCategory[]=yy

If you are using Ceon URI mapping software, you would (assuming your 'products_new' page is mapped to 'NewProducts') use

  • /NewProducts?fltCategory[]=xx&fltCategory[]=yy

You would just need to replace 'xx' with your Jackets category ID and 'yy' with your Pants category ID.

You can also hook in to the filter with php.
For example if you had a category called 'Jeans' and within that category you sold Levis jeans, you could add the link 'More Levis Jeans' to the product page to direct customers to view more Levis jeans as follows

  • echo '<a rel="nofollow" href="' . zen_href_link(FILENAME_DEFAULT, 'cPath=' . $cPath . '&' . DYNAMIC_FILTER_PREFIX . DYNAMIC_FILTER_MANUFACTURER_GROUP . '[]=' . zen_get_products_manufacturers_id($products_id_current), 'NONSSL') . '">' . 'More ' . $manufacturers_name . ' ' . $categories->fields['categories_name'] . '</a>';

Back to top

CREDITS & HISTORY


v1.2 by Design75
  • Fix by a_berezin: Multilangauge names for attributes are properly shown by language
Files changed:
v1.1 by Damian Taylor
  • Bug Fix: When the filter is rendered in 'scroll' mode, some div end tags are missing
  • Bug Fix: When option names contained spaces, no products appeared in the list
  • Bug Fix: When no manufacturers are defined or linked to products, the manufacturers section should not appear
  • Bug Fix: When multiple mixed options are filtered, some products appeared incorrectly in the list
Files changed:
  • new_files/includes/modules/YOUR_TEMPLATE/dynamic_filter.php
  • new_files/includes/templates/YOUR_TEMPLATE/sideboxes/tpl_dynamic_filter.php
v1.0 by Damian Taylor

Tested on:
  • Zen Cart 1.3.8a, Zen Cart 1.3.9h & Zen Cart 1.5.0
  • php 5.2.17 & php 5.3.8
  • MySQL 5.0.77
Tested with:
  • Ceon URI Mapping v4.0.7
  • Stock By Attribute v4.7
  • Simple Google Analytics v1.2.5

LICENSE

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

Always backup your shop and database before making changes.