PHPackages                             thelia/best-sellers-module - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. thelia/best-sellers-module

ActiveThelia-module

thelia/best-sellers-module
==========================

2.2.5(11mo ago)09875[1 PRs](https://github.com/thelia-modules/BestSellers/pulls)LGPL-3.0-or-laterPHPCI passing

Since Feb 9Pushed 11mo ago6 watchersCompare

[ Source](https://github.com/thelia-modules/BestSellers)[ Packagist](https://packagist.org/packages/thelia/best-sellers-module)[ RSS](/packages/thelia-best-sellers-module/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (9)Dependencies (1)Versions (12)Used By (0)

Best Sellers
============

[](#best-sellers)

en\_US
======

[](#en_us)

This modules provides a loop that returns the best (or the worst) sales, and another loop which returns the most purchased products with a given product.

Installation
------------

[](#installation)

Manually, or with composer :

```
composer require thelia/best-sellers-module:~2.0

```

Usage
-----

[](#usage)

This module shows the 4 best sales of your shop on the front page via the `home.body` hook.

You can also add where you want in your template (front or back-office), a loop `best_selling_products` to show your best or your worst sales.

In the back-office, you can see your best sales in the "Tools" menu.

Finally, the total number of sales of a product appears on the product sheet.

Update 1.2.0 : You can now choose which order statuses are taken into account to calculate your best sellers. A configuration page has been added to the module. Access it from the modules page.

Hook
----

[](#hook)

This module shows the 4 best sales of your shop on the front page via the `home.body` hook, and products purchased with te current product on the product page via the `product.bottom` hook (modern template) or `product.additional` hook (default template)

Loop
----

[](#loop)

### best\_selling\_product loop

[](#best_selling_product-loop)

The module provide the loop `best_selling_product`, which extend the loop `product`. All the arguments of the `product` loop are therefore available.

`best_selling_products` loop

#### Input parameters

[](#input-parameters)

All the arguments of the loop `product` are available.

A new argument `only_sold_products` (default false) is added to the loop parameters. If true, only the sold products will be returned. Products that were never sold will not be returned.

If false (the default), all products will be returned, even those that have never been sold.

The loop offers two new values for the parameter `order` of the loop `product``

- sold\_count\_reverse : sort by number of sales in decreasing order
- sold\_count : sort by number of sales in increasing order

ArgumentDescription**start-date**The period start date to be consider. By default, january 1st 1970.**end-date**The period end date to be consider. By default, today's date.#### Output variables

[](#output-variables)

All the variables of the loop `product`are available.

VariableDescription$SOLD\_QUANTITYThe quantity of sold product on the considered period$SOLD\_AMOUNTThe total amount untaxed of sales on the considered period$SALE\_RATIOThe percentage of sales on the considered period#### Example

[](#example)

To get your 10 best sales of all time:

```

    {loop type="best_selling_products" name="best-sellers" limit=10 order='sold_count_reverse'}
        {$REF} : {$TITLE} : {$SOLD_QUANTITY}
    {/loop}²²

```

To get your 5 best sales of the month :

```

    {loop type="best_selling_products" name="best-sellers-this-month" order='sold_count_reverse' start_date={$smarty.now|date_format:'%Y-%m-01'} limit=5}
        {$REF} : {$TITLE} : {$SOLD_QUANTITY}
    {/loop}

```

To get your 10 worst sales of all time :

```

    {loop type="best_selling_products" name="best-sellers" limit=10 order='sold_count'}
        {$REF} : {$TITLE} : {$SOLD_QUANTITY}
    {/loop}

```

### purchased\_with\_products loop

[](#purchased_with_products-loop)

This loop returns products purchased with a given product, based on past orders (paid or not)

#### Input parameters

[](#input-parameters-1)

ArgumentDescription**product\_ref**the reference of a product**order**sort order of loop results, `sold_count` ou `sold_count_reverse` (the default)#### Output parameters

[](#output-parameters)

VariableDescriptionPRODUCT\_REFThe reference of a product purchased with the given product$SOLD\_COUNTThe number of times this product was sold with the given product#### Exemple

[](#exemple)

Get the top 4 products sold along with a given product

```

        {loop name="purchased-with" type="purchased_with_products" product_ref=$REF limit="4"}
            {loop type="product" name="product_list" ref=$PRODUCT_REF}
                {$REF} : {$TITLE} : {$SOLD_COUNT}
            {/loop}
        {/loop}

```

fr\_FR
======

[](#fr_fr)

Ce module vous fournit une boucle qui retourne vos meilleures (ou vos pires) ventes, et une autre boucle qui permet d'afficher les produits les plus achetés avec un produit donné.

Installation
------------

[](#installation-1)

Manuellement, ou avec composer :

```
composer require thelia/best-sellers-module:~2.0

```

Usage
-----

[](#usage-1)

Ce module affiche les 4 meilleures ventes de votre boutique sur la page d'accueil, via le hook 'home.body'

Vous pouvez aussi ajouter où vous voulez dans votre template front office ou back-office une boucle `best_selling_products` pour afficher vos meilleures ou pires ventes.

Dans le back-office, vous pouvez voir vos meilleures ventes dans le menu "Outil".

Enfin, le nombre de ventes total d'un produit apparaît sur la fiche produit.

Update 1.2.0 : Le module permet désormais de choisir quels status de commande utiliser pour calculer vos best sellers. Une page de configuration à été ajoutée, accessible depuis la page "modules".

Hook
----

[](#hook-1)

Le module affiche les 4 meilleures ventes de votre boutique sur la page d'accueil, via le hook `home.body`. Il afficher sur la page produit les produits achetés avec le produit affiché via le hook `product.bottom` (template modern) ou le hook `product.additional` (template default)

Loop
----

[](#loop-1)

Le module vous propose la boucle `best_selling_products`, qui étend la boucle `product`. Tous les arguments de la boucle `product` sont donc disponibles. Il propose aussi la boucle `purchased_with_products`, qui permet d'afficher les articles qui ont été achetés avec un article donné.

### `best_selling_products` loop

[](#best_selling_products-loop)

#### Paramètres en entrée

[](#paramètres-en-entrée)

Tous les arguments de la boucle `product` sont disponibles.

Un nouvel argument `only_sold_products` (par défaut false) est ajouté aux paramètres de la boucle. Si true, seuls les produits vendus seront retournés. Les produits qui n'ont jamais été vendus ne seront pas retournés.

Si false (par défaut), tous les produits seront retournés, même ceux qui n'ont jamais été vendus.

La boucle propose deux valeurs supplémentaires pour le paramètre `order` de la boucle `product`:

- sold\_count\_reverse : trier par nombre de ventes décroissantes
- sold\_count : trier par nombre de ventes croissantes

ArgumentDescription**start-date**la date de début de période à prendre en compte. Par défaut, le 1er janvier 1970.**end-date**la date de fin de période à prendre en compte. Par défaut, la date du jour.#### Variables en sortie

[](#variables-en-sortie)

Toutes les variables de la boucle `product` sont disponibles.

VariableDescription$SOLD\_QUANTITYLa quantité de produit vendue sur la période considérée$SOLD\_AMOUNTLe montant total HT des ventes sur la période considérée$SALE\_RATIOLe pourcentage du CA sur la période considérée#### Exemple

[](#exemple-1)

Pour obtenir vos 10 meilleures ventes de tous les temps :

```

    {loop type="best_selling_products" name="best-sellers" limit=10 order='sold_count_reverse'}
        {$REF} : {$TITLE} : {$SOLD_QUANTITY}
    {/loop}

```

Pour obtenir les 5 meilleures ventes du mois :

```

    {loop type="best_selling_products" name="best-sellers-this-month" order='sold_count_reverse' start_date={$smarty.now|date_format:'%Y-%m-01'} limit=5}
        {$REF} : {$TITLE} : {$SOLD_QUANTITY}
    {/loop}

```

Pour obtenir vos 10 pires ventes de tous les temps :

```

    {loop type="best_selling_products" name="best-sellers" limit=10 order='sold_count'}
        {$REF} : {$TITLE} : {$SOLD_QUANTITY}
    {/loop}

```

### purchased\_with\_products loop

[](#purchased_with_products-loop-1)

Cette boucle permet de retourner les articles achetés avec un article donné, en se basant sur les commandes passées (payées ou non)

#### Paramètres en entrée

[](#paramètres-en-entrée-1)

ArgumentDescription**product\_ref**la référence du produit concerné**order**l'ordre des résultats, `sold_count` ou `sold_count_reverse` (le défault)#### Variables en sortie

[](#variables-en-sortie-1)

VariableDescriptionPRODUCT\_REFLa ref de l'article acheté avec l'article donné$SOLD\_COUNTLe nombre de fois ou cet article a été vendu avec l'article donné#### Exemple

[](#exemple-2)

Pour obtenir les 4 articles les plus vendus avec un article donné

```

        {loop name="purchased-with" type="purchased_with_products" product_ref=$REF limit="4"}
            {loop type="product" name="product_list" ref=$PRODUCT_REF}
                {$REF} : {$TITLE} : {$SOLD_COUNT}
            {/loop}
        {/loop}

```

###  Health Score

38

—

LowBetter than 85% of packages

Maintenance52

Moderate activity, may be stable

Popularity19

Limited adoption so far

Community20

Small or concentrated contributor base

Maturity55

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 53.8% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~151 days

Recently: every ~104 days

Total

9

Last Release

348d ago

Major Versions

1.2.4 → 2.0.02022-02-09

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/2196919?v=4)[thelia](/maintainers/thelia)[@thelia](https://github.com/thelia)

---

Top Contributors

[![roadster31](https://avatars.githubusercontent.com/u/2197734?v=4)](https://github.com/roadster31 "roadster31 (14 commits)")[![Lurivar](https://avatars.githubusercontent.com/u/33634597?v=4)](https://github.com/Lurivar "Lurivar (3 commits)")[![zawaze](https://avatars.githubusercontent.com/u/37273643?v=4)](https://github.com/zawaze "zawaze (2 commits)")[![ArthurLashermes](https://avatars.githubusercontent.com/u/76913541?v=4)](https://github.com/ArthurLashermes "ArthurLashermes (2 commits)")[![Lucanis](https://avatars.githubusercontent.com/u/6052481?v=4)](https://github.com/Lucanis "Lucanis (1 commits)")[![NicolasBarbey](https://avatars.githubusercontent.com/u/26166378?v=4)](https://github.com/NicolasBarbey "NicolasBarbey (1 commits)")[![gregorylss](https://avatars.githubusercontent.com/u/100703238?v=4)](https://github.com/gregorylss "gregorylss (1 commits)")[![ThomasDaSilva](https://avatars.githubusercontent.com/u/97163246?v=4)](https://github.com/ThomasDaSilva "ThomasDaSilva (1 commits)")[![anoziere](https://avatars.githubusercontent.com/u/118798868?v=4)](https://github.com/anoziere "anoziere (1 commits)")

### Embed Badge

![Health badge](/badges/thelia-best-sellers-module/health.svg)

```
[![Health](https://phpackages.com/badges/thelia-best-sellers-module/health.svg)](https://phpackages.com/packages/thelia-best-sellers-module)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
