Technische referentie POS-kortingen
Deze pagina documenteert hoe WCPOS door kassiers toegepaste prijsoverschrijvingen voor regelitems verwerkt — hoe ze worden opgeslagen, hoe ze samenwerken met WooCommerce-coupons en welke filters beschikbaar zijn. Voor documentatie gericht op gebruikers, zie Winkelwagenkortingen en Coupons.
Hoe POS-prijsoverschrijvingen worden opgeslagen
Wanneer een kassier de prijs van een regelitem instelt of wijzigt in de POS, worden de prijzen per eenheid opgeslagen in de _woocommerce_pos_data regelitem-meta als JSON:
{
"price": "16.00",
"regular_price": "18.00",
"tax_status": "taxable"
}
Voor diverse (aangepaste) producten kan deze meta ook de velden virtual, downloadable en categories bevatten die tijdens couponvalidatie worden gebruikt.
Deze meta is de gezaghebbende bron van prijzen per eenheid voor de regel. De door WooCommerce opgeslagen subtotal op het regelitem wordt afgeleid van price * qty (met belastingextractie en afronding toegepast). De opgeslagen total kan lager zijn wanneer couponkortingen worden toegepast, dus voor precisie per eenheid moet je altijd _woocommerce_pos_data.price en regular_price lezen.
Subtotaalmodel (v1.9.0+)
Vanaf v1.9.0 sluit WCPOS aan op de native sale-price-semantiek van WooCommerce:
line_item.subtotal = price * qtywaarbijpricede POS-prijs is (na een eventuele overschrijving).line_item.total = subtotal - coupon_discount_for_line.order.discount_totalweerspiegelt alleen couponkortingen, niet POS-prijsoverschrijvingen.
Dit komt overeen met hoe WooCommerce een product in de uitverkoop behandelt: de sale_price wordt het subtotaal, en discount_total is gereserveerd voor coupons. Er is geen aparte "POS-kortingsregel" op de bestelling.
Eerdere versies verzonden subtotal = regular_price * qty, waardoor WooCommerce discount_total = subtotal - total berekende en POS-prijsoverschrijvingen als korting opnam. Dit is gewijzigd omdat het in conflict kwam met de couponberekening: recalculate_coupons() gebruikt subtotal als basisprijs, dus coupons werden berekend op basis van de oorspronkelijke prijs en produceerden onjuiste totalen.
De vorige tijdelijke oplossing aan de serverkant — een woocommerce_order_item_get_subtotal-filter die actief was tijdens recalculate_coupons() — is verwijderd in v1.9.0. Zie de ADR voor de volledige geschiedenis.
Gedrag bij couponinteractie
Couponondersteuning is een WCPOS Pro-functie. Wanneer een coupon wordt toegepast op een bestelling die POS-gekorte items bevat:
- De coupon wordt berekend op basis van de POS-gekorte prijs (de waarde in
_woocommerce_pos_data.price), niet de oorspronkelijkeregular_price. - Wanneer een coupon wordt verwijderd, keert het regelitem terug naar zijn POS-gekorte prijs.
exclude_sale_items-gedrag
POS-gekorte items worden door WooCommerce als "in de uitverkoop" behandeld wanneer _woocommerce_pos_data.price < regular_price. Coupons met exclude_sale_items ingeschakeld slaan ze daarom over, consistent met hoe WooCommerce reguliere uitverkoopprijzen behandelt.
Als je ander gedrag nodig hebt, zie dan de woocommerce_pos_item_is_on_sale-filter hieronder.
Beschikbare filters
woocommerce_pos_item_is_on_sale
Overschrijf of een POS-gekort item als "in de uitverkoop" wordt beschouwd voor couponvalidatie.
add_filter( 'woocommerce_pos_item_is_on_sale', function ( $is_on_sale, $product, $item, $pos_data ) {
// Allow coupons with exclude_sale_items to apply to POS-discounted items
return false;
}, 10, 4 );
Parameters:
| Parameter | Type | Beschrijving |
|---|---|---|
$is_on_sale | bool | Of het item als in de uitverkoop wordt beschouwd (standaard: price < regular_price) |
$product | WC_Product | Het productobject |
$item | WC_Order_Item_Product | Het bestelregelitem |
$pos_data | array | De gedecodeerde _woocommerce_pos_data JSON |
REST API-endpoint
Het coupons-REST-endpoint bevindt zich in de gratis plug-in op /wp-json/wcpos/v1/coupons, zodat de POS-app nooit een 404 ontvangt bij het opvragen van coupons — zelfs op sites zonder WCPOS Pro geïnstalleerd. De couponfunctie voor gebruikers zelf vereist echter Pro.
De controller breidt WC_REST_Coupons_Controller uit met POS-specifieke aanvullingen:
- UUID-afhandeling voor offline-first-synchronisatie
access_woocommerce_pos-capability voor permissiecontroles- Geoptimaliseerd bulk-ID-querypad wanneer
posts_per_page=-1enfields=id(offields=id,date_modified_gmt) worden opgevraagd
Blootstelling van bongegevens
De bongegevensbouwer (Receipt_Data_Builder) stelt het volgende bloot:
lines[].discounts,lines[].discounts_incl,lines[].discounts_excl— kortingsbedrag per regel, berekend alssubtotal - total. Vanaf v1.9.0 weerspiegelt dit alleen couponkortingen voor POS-prijsoverschrijvingen, aangeziensubtotal === totalwanneer er geen coupon is toegepast.totals.discount_total,totals.discount_total_incl,totals.discount_total_excl— totaal van couponkortingen op bestelniveau vanWC_Order::get_discount_total().discounts[]— array van couponregelitems metlabel,codeentotal.
De meta met onderstreepvoorvoegsel van het regelitem (inclusief _woocommerce_pos_data) wordt uit lines[].meta gefilterd door Receipt_Data_Builder::get_item_meta_pairs(), dus regular_price is niet rechtstreeks beschikbaar voor sjablonen. Als je het verschil tussen de reguliere en POS-prijs op bonnen wilt tonen, vraag dit dan aan via support.
Gerelateerd
- Winkelwagenkortingen — handleiding voor gebruikers over door kassiers toegepaste kortingen
- Coupons — handleiding voor gebruikers over WooCommerce-coupons in de POS (Pro)