We are pleased to release a new VirtueMart generation, which adds compatibility with Joomla 4 and PHP8. VirtueMart 4 comes with a new overridable Bootstrap 3 frontend template (Bootstrap 5 will follow soon) and new backend template. Of course there are also new features for the product presentation, a lot of bugfixes and some new programming techniques. We originally had planned to release this on Christmas, but it was not possible to keep the date due to many changes applied to joomla 4 after it's initial release. We still have to iron out a few minor complications with it, but it already works for a number of early adopters..

The Backend Template

The new backend template uses VMUI-Kit. Unluckily this is not ideal for Joomla 4, but BS5 will be added soon. You can choose between four different color styles and it works well on mobiles. Updaters must install it manually, because it is handled as an installable template and is not part of the VirtueMart core installation package.

New backend features and tools

VirtueMart 4 not only has a new look, but also new functions in the backend. For example, Multivariants with children can now be autogenerated with permutating variants. Customfields can have their own SKU, GTIN, MPN. The order status was previously limited to a single character and is now extended to 3 chars. The category dropdown in the "product.edit" view now also lists unpublished categories. Original language flags (as we have already for other edits) now added to the payment and shipment edit views. RuposTel donated a google like search for products and orders. So for example use sku:mySkuToSearch to let VM search only within the SKUs.

Also there are two new maintenance tools. The first one is a synchronizer consisting of three buttons, which sets country 2, country 3 and country numerical code in the country list correctly according to ISO 3166. The second one is a converter button for changing old utf8mb3 tables to utf8mb4 tables.

New frontend template

Spyros Petrakis has generously donated his Horme3 template for the VirtueMart Core. Another new feature which you will find most useful is the the setting for different Bootstrap layouts, which was not fully implemented yet and therefore useless, ...until now! Selecting the Bootstrap 3 layouts in the configuration will load these layouts from the core. So we can now use any Bootstrap 3 template without overrides, because VirtueMart 4 loads the Horme3 ones. This also gives new users the possibility to use old override techniques. We are planning to extend this technique to modules and css. Work is already in progress to provide the same technique for Bootstrap 5.

The javascript also received a general overhaul, so it is more reliable, should work better on different browsers and is easier to handle for templaters (working relative or with classes instead of ids). The new fancybox is working with the new jQuery version now.


The payment plugin Paybox got a general overhaul and works now with 3Dsecure V2

Product Bundles

are a very mighty new feature. It can be used as typical bundle of different products for one price. This was also possible before by just creating a product which listed the included products. But this method required a lot maintenance. The inventory just listed a sold bundle, but did not update the inventory per product. If you sold a bundled product also as a bulk-version, then the system used two different products. If you updated the price of the bulk version, nothing changed on the bundles version. Not any longer! The new product bundles make real bundles of different existing VirtueMart products. They can be included for free or also as variants with an extra price. The prices can be a fixed amount or a percentage. So it can also be used for cross-selling and discounts.

Extra related product groups

are also used for cross-selling or presentation of complementary items. They are basically the same as the default related products, but can have another title and appear somewhere on product details page.

Better search with tags

Enhanced search using the customfield searchable tag system. Searching for more than 1 tag now displays only products fitting to any requested tag..

Keep cart content for guests

Added storing of carts for unregistered users as a cookie. This works only for SSL secured pages.

and more

  • really a lot work on caches (internal, external), table indexes and other optimisations.
  • additionally general work to please the JED Checker.
  • option to display thumbnails to select children of multivariants.
  • different email layouts by order status to enhance the customer communication.
  • you can create a category menu item which clears the cart by category.

Changes for developers

ATTENTION: Triggers are case sensitive in joomla 4!
Changed triggers:

  • plgVmOnStoreProduct($data, $plugin_param) changed to function plgVmOnStoreProduct($data, $plugin_param, $key)
  • plgVmonSelectedCalculatePrice to plgVmOnSelectedCalculatePrice (lower to upper case)
  • in calculation plgVmOnDisplayEdit to plgVmOnDisplayEditCalc

new triggers

  • product and order model, added new trigger plgVmMySortSearchListProductsQuery respectivly plgVmMySortSearchListOrdersQuery in exeSortSearchListQuery which is at begin and can takeover the whole function (for searchplugins)

Plugin Handler

  • Added vdispatcher.php as proxy for the joomla dispatcher
  • We can use now $results = vDispatcher::trigger('event', array(param1, param2,...));
  • the directTrigger can now execute a certain event of a plugin family, too.
  • added function reloadPlugins, which loads again the payment/shipment methods of the plugins. The cart unloads them, if they do not fit, 3rd party developer can reload them, that way.


  • setConvertDecimal for plugins, tables
  • set datefields for tables
  • $this->_genericVendorId = false prevents that the tables sets the virtuemart_vendor_id generically
  • added extra parameter to vmuploader so that it works also with other input names
  • the product model sortSearchListQuery is now working with an extra parameter, which can override an "Request" variables. So using old vRequests parameters is just used as fallback now.
  • function getProductListing is now using request params only for the group "products", not for the other groups like featured, recent, topten, and so on
  • vmecho again a bit enhanced, if debug is activated vmInfo are quequed as vmdebug (so the messages appear in the real order)
  • field products, added a category filter
  • changed ajax js for dynamic page reload, a ready script in the layout is not needed anylonger
  • added cart functions getCartWeight and getCartQuantity
  • removed the problem that a delivery note created an invoiceNumber
  • Time of the calculationHelper considers offset

DOWNLOAD VirtueMart 4