{"id":366791,"date":"2026-09-18T03:24:48","date_gmt":"2026-09-18T03:24:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/dox-pos\/"},"modified":"2026-10-28T21:34:35","modified_gmt":"2026-10-28T21:34:35","slug":"dox-pos","status":"publish","type":"plugin","link":"https:\/\/de-ch.wordpress.org\/plugins\/dox-pos\/","author":23488075,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.60.0","stable_tag":"0.60.0","tested":"7.1.4","requires":"6.5","requires_php":"8.0","requires_plugins":null,"header_name":"Dox POS","header_author":"Dox Studio","header_description":"The register for a shop that sells on WhatsApp and Instagram: record sales, layaways and incoming stock from the frontend (\/pos), without wp-admin, with orders, products, history, a stock ledger and Excel files. Every sale is a WooCommerce order, so stock goes down on its own. With Dox POS Pro, the business assistant.","assets_banners_color":"eeeae3","last_updated":"2026-10-28 21:34:35","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/doxstudio.com\/dox-pos\/","header_author_uri":"https:\/\/doxstudio.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":1276,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.37.2":{"tag":"0.37.2","author":"davidzoque","date":"2026-09-18 03:24:20","revision":3701238},"0.37.3":{"tag":"0.37.3","author":"davidzoque","date":"2026-09-18 03:48:58","revision":3701264},"0.37.4":{"tag":"0.37.4","author":"davidzoque","date":"2026-09-18 04:08:24","revision":3701276},"0.38.0":{"tag":"0.38.0","author":"davidzoque","date":"2026-09-18 10:55:00","revision":3701838},"0.38.1":{"tag":"0.38.1","author":"davidzoque","date":"2026-09-18 13:32:27","revision":3702070},"0.41.0":{"tag":"0.41.0","author":"davidzoque","date":"2026-09-21 14:42:24","revision":3705793},"0.41.1":{"tag":"0.41.1","author":"davidzoque","date":"2026-09-27 06:14:55","revision":3715045},"0.42.0":{"tag":"0.42.0","author":"davidzoque","date":"2026-09-28 16:28:01","revision":3717581},"0.43.0":{"tag":"0.43.0","author":"davidzoque","date":"2026-10-04 09:17:36","revision":3727226},"0.44.0":{"tag":"0.44.0","author":"davidzoque","date":"2026-10-04 18:41:17","revision":3727715},"0.46.0":{"tag":"0.46.0","author":"davidzoque","date":"2026-10-06 00:17:08","revision":3729785},"0.47.0":{"tag":"0.47.0","author":"davidzoque","date":"2026-10-06 03:49:26","revision":3729957},"0.47.1":{"tag":"0.47.1","author":"davidzoque","date":"2026-10-06 14:56:09","revision":3731086},"0.48.0":{"tag":"0.48.0","author":"davidzoque","date":"2026-10-08 14:16:46","revision":3734815},"0.48.1":{"tag":"0.48.1","author":"davidzoque","date":"2026-10-12 03:14:31","revision":3740406},"0.49.0":{"tag":"0.49.0","author":"davidzoque","date":"2026-10-12 20:04:10","revision":3742449},"0.49.1":{"tag":"0.49.1","author":"davidzoque","date":"2026-10-12 23:32:49","revision":3742618},"0.50.0":{"tag":"0.50.0","author":"davidzoque","date":"2026-10-13 03:22:41","revision":3742828},"0.51.0":{"tag":"0.51.0","author":"davidzoque","date":"2026-10-13 19:53:10","revision":3744822},"0.52.0":{"tag":"0.52.0","author":"davidzoque","date":"2026-10-13 22:17:48","revision":3744975},"0.53.0":{"tag":"0.53.0","author":"davidzoque","date":"2026-10-14 00:40:49","revision":3745110},"0.54.0":{"tag":"0.54.0","author":"davidzoque","date":"2026-10-14 05:38:28","revision":3745393},"0.54.1":{"tag":"0.54.1","author":"davidzoque","date":"2026-10-14 18:09:37","revision":3746902},"0.55.0":{"tag":"0.55.0","author":"davidzoque","date":"2026-10-14 23:34:02","revision":3747337},"0.57.0":{"tag":"0.57.0","author":"davidzoque","date":"2026-10-15 20:27:46","revision":3749266},"0.58.0":{"tag":"0.58.0","author":"davidzoque","date":"2026-10-19 00:36:27","revision":3753761},"0.58.1":{"tag":"0.58.1","author":"davidzoque","date":"2026-10-24 15:31:15","revision":3763463},"0.58.2":{"tag":"0.58.2","author":"davidzoque","date":"2026-10-25 02:04:22","revision":3763869},"0.59.0":{"tag":"0.59.0","author":"davidzoque","date":"2026-10-27 15:10:31","revision":3768872},"0.59.1":{"tag":"0.59.1","author":"davidzoque","date":"2026-10-27 15:20:29","revision":3768880},"0.60.0":{"tag":"0.60.0","author":"davidzoque","date":"2026-10-28 21:34:35","revision":3771707}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3701238,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3701238,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3734815,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3734815,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.37.2","0.37.3","0.37.4","0.38.0","0.38.1","0.41.0","0.41.1","0.42.0","0.43.0","0.44.0","0.46.0","0.47.0","0.47.1","0.48.0","0.48.1","0.49.0","0.49.1","0.50.0","0.51.0","0.52.0","0.53.0","0.54.0","0.54.1","0.55.0","0.57.0","0.58.0","0.58.1","0.58.2","0.59.0","0.59.1","0.60.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3701238,"resolution":"1","location":"assets","locale":"","width":1600,"height":1146},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3701238,"resolution":"2","location":"assets","locale":"","width":1600,"height":1146},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3701238,"resolution":"3","location":"assets","locale":"","width":1600,"height":1146},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3701238,"resolution":"4","location":"assets","locale":"","width":1600,"height":1784},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3701238,"resolution":"5","location":"assets","locale":"","width":1600,"height":1146},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3701238,"resolution":"6","location":"assets","locale":"","width":1600,"height":1059},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3734815,"resolution":"7","location":"assets","locale":"","width":2560,"height":1720},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3734815,"resolution":"8","location":"assets","locale":"","width":2560,"height":1720},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3734815,"resolution":"9","location":"assets","locale":"","width":1308,"height":1370}},"screenshots":{"1":"Recording a sale: search on the left, the order on the right, with the channel it came in through, the customer and how they pay.","2":"Inventory, with the supplier, the invoice and the cost of each unit.","3":"Orders from the register and from the website, with their status and the WhatsApp message ready.","4":"Creating a product from the phone: photos, sizes, colors and units.","5":"History: sales, daily cash and the stock ledger, with the profit of each sale.","6":"The settings, with a live preview of the register.","7":"The Counter for a physical store: scan a barcode and the product goes into the sale.","8":"Charging cash at the Counter, with suggested bills and the change in large type.","9":"The receipt editor, with its live preview."}},"plugin_section":[],"plugin_tags":[273903,6601,26270,10229,286],"plugin_category":[45],"plugin_contributors":[271078],"plugin_business_model":[],"class_list":["post-366791","plugin","type-plugin","status-publish","hentry","plugin_tags-barcode-scanner","plugin_tags-inventory","plugin_tags-point-of-sale","plugin_tags-pos","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-davidzoque","plugin_committers-davidzoque"],"banners":{"banner":"https:\/\/ps.w.org\/dox-pos\/assets\/banner-772x250.png?rev=3734815","banner_2x":"https:\/\/ps.w.org\/dox-pos\/assets\/banner-1544x500.png?rev=3734815","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/dox-pos\/assets\/icon-128x128.png?rev=3701238","icon_2x":"https:\/\/ps.w.org\/dox-pos\/assets\/icon-256x256.png?rev=3701238","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/dox-pos\/assets\/screenshot-1.png?rev=3701238","caption":"Recording a sale: search on the left, the order on the right, with the channel it came in through, the customer and how they pay."},{"src":"https:\/\/ps.w.org\/dox-pos\/assets\/screenshot-2.png?rev=3701238","caption":"Inventory, with the supplier, the invoice and the cost of each unit."},{"src":"https:\/\/ps.w.org\/dox-pos\/assets\/screenshot-3.png?rev=3701238","caption":"Orders from the register and from the website, with their status and the WhatsApp message ready."},{"src":"https:\/\/ps.w.org\/dox-pos\/assets\/screenshot-4.png?rev=3701238","caption":"Creating a product from the phone: photos, sizes, colors and units."},{"src":"https:\/\/ps.w.org\/dox-pos\/assets\/screenshot-5.png?rev=3701238","caption":"History: sales, daily cash and the stock ledger, with the profit of each sale."},{"src":"https:\/\/ps.w.org\/dox-pos\/assets\/screenshot-6.png?rev=3701238","caption":"The settings, with a live preview of the register."},{"src":"https:\/\/ps.w.org\/dox-pos\/assets\/screenshot-7.png?rev=3734815","caption":"The Counter for a physical store: scan a barcode and the product goes into the sale."},{"src":"https:\/\/ps.w.org\/dox-pos\/assets\/screenshot-8.png?rev=3734815","caption":"Charging cash at the Counter, with suggested bills and the change in large type."},{"src":"https:\/\/ps.w.org\/dox-pos\/assets\/screenshot-9.png?rev=3734815","caption":"The receipt editor, with its live preview."}],"raw_content":"<!--section=description-->\n<p>Dox POS adds a <code>\/pos<\/code> page (<code>\/caja<\/code> on a Spanish site) with its own sign-in screen. From there you search products with their photo and stock, record the sales that come in through WhatsApp or Instagram (each one is a WooCommerce order, so stock goes down on its own), put products on layaway while the customer pays, record the stock that arrives and keep the list of what has to be shipped.<\/p>\n\n<p>It was born for the shop that sells through chat and ships by courier, where a phone is enough. If you also have a physical store, turn on the <strong>Counter<\/strong>: a till screen for a computer or a tablet with a barcode scanner, cash with the change worked out, receipts on any printer and opening and closing the till.<\/p>\n\n<p>It follows the country of the store (WooCommerce &gt; Settings &gt; General): the payment methods it offers, the carriers it suggests and the default sales channels are the ones of that country, and where WhatsApp is not the norm (the United States, for instance) the messages to the customer open as text messages in the phone's Messages app instead. Everything can be renamed, turned off or added to in WooCommerce &gt; Dox POS &gt; Sales.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li><strong>Sell and put on layaway.<\/strong> Channel, customer, city, shipping, discount and payment method. A sale becomes a WooCommerce order, so the stock, the reports and the emails are the ones the store already had. A layaway holds the stock until its deadline (or with no deadline), takes deposits that count as sales on the day the money comes in, and cancels itself if it is not paid in time, unless it already has deposits.<\/li>\n<li><strong>Inventory.<\/strong> Record what arrives with supplier, invoice and cost. It adds to the stock and warns you if the same invoice was already recorded from another phone.<\/li>\n<li><strong>Orders.<\/strong> The ones from the register and, if you want, the ones from the website, with their status and the WhatsApp message ready. Mark them shipped with a carrier and a tracking number, and the customer gets an email with the tracking link, using the store's own email design.<\/li>\n<li><strong>Products.<\/strong> Create and edit products from the phone: photos (iPhone HEIC included, stored as WebP), sizes and colors or whatever each category varies by (capacity, model, material), units of each one, weight and size for shipping, and an automatic SKU that follows the one the store already uses.<\/li>\n<li><strong>Stores in several languages.<\/strong> With Polylang or WPML each product exists once per language; the register shows it once, in the main language, in Sell, Inventory, the search, the counts and the Excel files. A product created in the register is created in the main language, and what sells on the website in another language counts toward its main product.<\/li>\n<li><strong>Shipping costs.<\/strong> Set what shipping costs without opening wp-admin: a fixed price, by weight, free from an amount or store pickup, for the whole country or for some of its regions. They are saved as WooCommerce shipping zones, so the web checkout and the register charge the same.<\/li>\n<li><strong>History.<\/strong> Sales, the daily cash, the stock ledger and, with costs on, what each product leaves. Everything downloads as a real Excel file.<\/li>\n<li><strong>Costs and profit.<\/strong> A cost per unit for each product, stored in the WooCommerce cost field. Every purchase recalculates the weighted average cost, and every sale freezes the cost in the order, so raising a cost later does not rewrite past sales.<\/li>\n<li><strong>The Counter, for a physical store.<\/strong> Scan barcodes with any USB or Bluetooth scanner, or with the phone camera. Quick buttons for products without a barcode, keyboard shortcuts, sales on hold, a discount, and cash with suggested bills and the change in large type, card or several payment methods in one sale.<\/li>\n<li><strong>Till and receipts.<\/strong> Open the till with its float and close it counting the drawer: the register tells you whether it matches. Every sale has a receipt for 58 or 80 mm paper, printed from the browser on any printer, with a barcode that opens its return. Returns put the pieces back in stock.<\/li>\n<li><strong>Roles for the store.<\/strong> A Cashier role that sells and never sees the WordPress dashboard, and a Counter cashier role that only reaches the Counter. Discounts can be capped for them, and they close the till blind.<\/li>\n<li><strong>No signal, no problem.<\/strong> A sale recorded with the screen open and no connection is kept on the phone and goes in on its own when the connection is back, without duplicating.<\/li>\n<\/ul>\n\n<p>The business assistant (today's pending work, a store review, a chat, a forecast and a daily summary by email), the extras for a busy store (cashiers with a PIN, several tills, a Stripe card reader, a customer screen, direct printing to Star and Epson receipt printers with the cash drawer, and a fuller receipt editor) and the tools for international stores (writing each language's text and creating products in every language from the register with Polylang, and selling in the currency and with the prices of a Price Based on Country zone) live in a separate add-on, Dox POS Pro. The register works fully without it.<\/p>\n\n<h4>Third-party libraries<\/h4>\n\n<p>The Counter's camera scanner uses <strong>ZXing<\/strong> (zxing-js\/library 0.21.3, Apache License 2.0) on browsers that cannot read barcodes on their own, such as Safari on the iPhone. It is bundled in <code>assets\/vendor\/zxing<\/code> with its license, loaded only when someone taps Camera, and never loaded from outside the site. Source code: https:\/\/github.com\/zxing-js\/library<\/p>\n\n<h4>External services<\/h4>\n\n<p>The register can load its two fonts from <strong>Google Fonts<\/strong> (fonts.googleapis.com and fonts.gstatic.com). This is off by default: a fresh install uses the fonts of the phone or the computer and the plugin does not connect to any outside service.<\/p>\n\n<p>If you turn on the \"Load the fonts from Google Fonts\" switch in WooCommerce &gt; Dox POS &gt; Brand, the browser of whoever opens the register requests those fonts from Google, which receives their IP address and the usual data of a web request. With the switch on, the settings page loads the fonts the same way while you pick one, and when you type a font name the plugin asks Google whether a font by that name exists. No store, order or customer data is ever sent, and turning the switch off stops every request.<\/p>\n\n<p>Google terms: https:\/\/policies.google.com\/terms\nGoogle privacy: https:\/\/policies.google.com\/privacy<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>dox-pos<\/code> folder to <code>\/wp-content\/plugins\/<\/code> and activate the plugin.<\/li>\n<li>Open <code>\/pos<\/code> (<code>\/caja<\/code> on a Spanish site) and sign in with an administrator, a shop manager or a user with the \"Cashier\" role.<\/li>\n<li>Set the brand, the colors, the address of the screen, the sales channels and the payment methods in WooCommerce &gt; Dox POS. If you use other Dox Studio plugins, the same page is in their shared menu: Dox Plugins &gt; POS.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20barcode%20scanner%20or%20a%20receipt%20printer%3F\"><h3>Do I need a barcode scanner or a receipt printer?<\/h3><\/dt>\n<dd><p>No. For selling through chat a phone is enough: you search the product by name or SKU, record the sale and the order is in WooCommerce. In a physical store, the Counter works with any USB or Bluetooth barcode scanner (it types like a keyboard) or with the camera, and prints receipts from the browser on any printer.<\/p><\/dd>\n<dt id=\"does%20it%20change%20my%20stock%20twice%3F\"><h3>Does it change my stock twice?<\/h3><\/dt>\n<dd><p>No. The plugin never touches stock directly for a sale: it creates the WooCommerce order and WooCommerce discounts the stock, exactly as it does with an order from the website. Only stock entries add units, and voiding one takes them back.<\/p><\/dd>\n<dt id=\"can%20two%20people%20use%20it%20at%20the%20same%20time%3F\"><h3>Can two people use it at the same time?<\/h3><\/dt>\n<dd><p>Yes. When a sale is recorded, the order reserves its units with the same mechanism the WooCommerce checkout uses, so the last unit cannot be sold twice.<\/p><\/dd>\n<dt id=\"who%20can%20see%20the%20costs%20and%20the%20profit%3F\"><h3>Who can see the costs and the profit?<\/h3><\/dt>\n<dd><p>Administrators and shop managers. Someone with only the Cashier role sells and records stock without seeing any cost. Costs can be turned off entirely in WooCommerce &gt; Dox POS &gt; Products.<\/p><\/dd>\n<dt id=\"where%20does%20the%20cost%20of%20a%20product%20live%3F\"><h3>Where does the cost of a product live?<\/h3><\/dt>\n<dd><p>In the WooCommerce cost field (\"Cost of Goods Sold\"), so it also shows in the WooCommerce product editor and other plugins can read it. The plugin turns that feature on when you save the settings with the costs switch on.<\/p><\/dd>\n<dt id=\"how%20do%20i%20charge%20shipping%20by%20weight%3F\"><h3>How do I charge shipping by weight?<\/h3><\/dt>\n<dd><p>Open the register, tap the gear at the top and choose Shipping costs. Add a cost \"By weight\" and write the ranges (\"up to 1 lb, 6\", \"up to 5 lb, 10\") and what a heavier order pays. It is a regular WooCommerce shipping method, so the web checkout charges the same, with no table rate plugin. Each product gets its weight and its size in the Products tab of the register; a product with no weight counts as zero.<\/p><\/dd>\n<dt id=\"i%20am%20not%20in%20colombia.%20does%20it%20fit%20my%20shop%3F\"><h3>I am not in Colombia. Does it fit my shop?<\/h3><\/dt>\n<dd><p>Yes. The register reads the store country from WooCommerce. A Colombian store gets Nequi, the local carriers (Coordinadora, Servientrega, Interrapid\u00edsimo, TCC...) and WhatsApp; a US store gets Zelle and Venmo, USPS, UPS, FedEx and DHL, and text messages instead of WhatsApp; Mexico, Spain, Argentina, Chile, Peru and Ecuador have their own carriers, and any other country starts with DHL, UPS and FedEx. Card, cash, bank transfer and cash on delivery are there everywhere, and you can rename, turn off or add payment methods, carriers and channels in WooCommerce &gt; Dox POS &gt; Sales.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20a%20store%20in%20several%20languages%20%28polylang%2C%20wpml%29%3F\"><h3>Does it work with a store in several languages (Polylang, WPML)?<\/h3><\/dt>\n<dd><p>Yes. With Polylang or WPML each product exists once per language. Dox POS shows only the products in the store's default language (and the ones with no language), so each product appears once in Sell, Inventory, the Excel file and the counts. A web order placed in another language counts toward its main product in the best sellers and in Movements, and a product created from the register is created in the default language. Without Dox POS Pro, editing a product from the register changes only the main product. Dox POS Pro adds, with Polylang, a tab per language in the product form, creating a new product in every language at once and repairing a half-made translation. Dox POS changes stock only through WooCommerce, but it does not copy stock between translations: Polylang (free) does not do it either, so the store needs Polylang for WooCommerce, WooCommerce Multilingual (WPML) or a snippet that keeps the stock of the translations the same.<\/p><\/dd>\n<dt id=\"can%20it%20sell%20in%20several%20currencies%3F\"><h3>Can it sell in several currencies?<\/h3><\/dt>\n<dd><p>Dox POS sells in the store currency, also when Price Based on Country is installed and whoever opens the register is in another country. Dox POS Pro works with Price Based on Country zones: choose the zone of the register (for example Colombia in COP) and it sells in that currency with that zone's prices, with prices by zone in the product form, reports that show one currency at a time and store credit and layaways that keep their currency. Dox POS also detects CURCY, WOOCS and Aelia Currency Switcher to show a notice, but it does not sell in their currencies.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20block%20checkout%20and%20with%20hpos%3F\"><h3>Does it work with the block checkout and with HPOS?<\/h3><\/dt>\n<dd><p>Yes. Orders are created through the WooCommerce API, and the plugin declares compatibility with High-Performance Order Storage and with the cart and checkout blocks.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.60.0<\/h4>\n\n<ul>\n<li>Fix: in stores that keep orders as posts (without HPOS), a new sale could bring back an earlier order instead of being recorded. Every sale is recorded again.<\/li>\n<li>Fix: in stores that keep orders as posts (without HPOS), Orders no longer lists the deposits of a layaway as separate orders, and the layaways about to expire and the layaway payments in History show the right ones.<\/li>\n<li>Fix: with Price Based on Country, the register no longer sells with the prices and the currency of the country of whoever opens it. It always sells in the store currency, as its notice says. This only applies to the register (the \/pos page and its own API), never to the shop pages.<\/li>\n<li>New: an amount from an order in a currency that is not the register's shows its code next to it, like $39.00 USD, in Orders, the order detail and History. A store with one currency sees no change.<\/li>\n<li>New: when the customer has store credit only in another currency, the customer box shows it as information (\"Store credit in another currency: $35.10 USD\"); it cannot be used there.<\/li>\n<li>Fix: a deposit on a layaway is only recorded in the layaway's currency. If the register can no longer charge in it (Dox POS Pro turned off, or the zone of that currency turned off), it says so and nothing is charged, instead of giving the customer store credit in the store currency.<\/li>\n<li>Technical: the HPOS fixes use meta_key\/meta_value or filter in PHP instead of meta_query, which WooCommerce ignores without HPOS (the repeated-sale check, the Orders list, layaways due, layaway payments in History and the uninstall cleanup). New filter dox_pos_credit_lookup and action dox_pos_stop_visitor_prices (see README.md).<\/li>\n<li>Stores in several languages (Polylang or WPML): the register still shows each product once in Sell, Inventory, search, counts and Excel files, writes the stock log once on the main product and creates new products in the default language. Creating and editing the translations from the register (the language tabs, \"Also create in the other languages\", \"Missing in English\" and Create now) is now part of Dox POS Pro. Without it, editing a product changes only the main product and the translations are left as they are.<\/li>\n<li>New: if the store uses Polylang, WPML, Price Based on Country, CURCY, WOOCS or Aelia Currency Switcher and Dox POS Pro 0.42.0 or newer is not active, a short notice on the Dox POS settings and in the register says what Pro adds. It can be dismissed, once per user, and it never shows in the WordPress dashboard or on the website.<\/li>\n<li>Technical: new hooks for add-ons in the product form: the dox_pos_product_form_fields filter (slots name_before, name_after, price_after, short_before, short_after, description_after), the dox_pos_product_saved action, the dox_pos_product_response, dox_pos_product_edit_data and dox_pos_catalog_item filters, the dox_pos_products_settings and dox_pos_products_sanitize filters, the dox_pos_settings_products and dox_pos_rest_routes actions, and the productoListo, productoPayload, productoCargado... events of window.DoxPOS (see README.md).<\/li>\n<li>Technical: new hooks for add-ons that sell in another currency (Dox POS Pro does it with Price Based on Country zones). The plugin itself still sells in the store currency with the WooCommerce price: dox_pos_currency() (filter dox_pos_currency) replaces the scattered get_woocommerce_currency() calls; dox_pos_money_format() (filter dox_pos_money_format) gives the symbol, separators and decimals that dox_pos_money() and window.DoxPOS cfg.money use; dox_pos_product_price() (filter dox_pos_product_price, with the context sell, list or edit) is how the catalog, the cart, the order and shipping read a price; the dox_pos_order_problem filter lets an add-on refuse a sale, the dox_pos_order_before_totals action runs before the totals are calculated; reports skip other currencies when dox_pos_report_currency() says so; store credit keeps an optional currency per movement (the filter dox_pos_credit_currency); the dox_pos_shipping_rates, dox_pos_order_profit_pre, dox_pos_xlsx_money_format and dox_pos_history_response filters, the dox_pos_product_validate filter (an add-on can reject a product save with a WP_Error) and the historialConsulta and historialPintado events. Without an add-on every one of them returns exactly what it did before. See README.md.<\/li>\n<li>Technical: includes\/multilingual.php keeps dox_pos_lang_plugin(), dox_pos_lang_default(), dox_pos_lang_where(), dox_pos_lang_main_id(), dox_pos_lang_twin_variation(), dox_pos_lang_term_args(), dox_pos_lang_assign_term() and dox_pos_lang_assign(); the rest moved to the Pro.<\/li>\n<\/ul>\n\n<h4>0.59.1<\/h4>\n\n<ul>\n<li>Fix: with Polylang, saving a product from the register no longer replaces the photos of its translations when the photos of the main product did not change. A translation can have its own photos (uploaded apart, with the alt text in its language); they are kept, and the translation only takes the main product's photos when they change in the register.<\/li>\n<li>Technical: dox_pos_lang_copy_images() copies the photo and the gallery to a translation, each on its own, only when the main product's one differs from the last one it saw (_dox_pos_lang_imgs); the first time, a translation that already has a photo or a gallery keeps it.<\/li>\n<\/ul>\n\n<h4>0.59.0<\/h4>\n\n<ul>\n<li>New: stores in several languages with Polylang or WPML. Each product exists once per language, and the register showed it twice (or three times): in Sell, Inventory, Edit product, the Excel file, the stock counts and the codes the product form suggests. Now only the products in the store's default language show, plus the ones with no language; a variation follows its product. Searching by the name in another language still finds the product, scanning the code of a translation sells the main product, and a web order placed in another language counts toward its main product in the best sellers.<\/li>\n<li>New: in Movements, when the translations share their stock, a change is written once, on the main product (also for a variation, matched by its attributes). The tools that keep the stock of the translations the same save the other translation too, and that second save was written as a second movement. When each translation keeps its own stock, its movements stay on it.<\/li>\n<li>New: a product created from the register is saved in the default language, whatever language filter the dashboard has.<\/li>\n<li>New: with Polylang, a product created in the register is also created in every other language of the store, linked as its translation and published, so it sells in every language from day one: same price, cost, photos, units, sizes and colors, and the categories in their translation (one with no translation is left out, and the register says so). The SKU of each translation ends in its language (VE-0012-EN), because WooCommerce does not allow the same SKU twice; the dox_pos_translation_sku filter changes it. It can be turned off in Settings &gt; Products &gt; Languages (\"Also create in the other languages\").<\/li>\n<li>New: the product form (creating and \"Edit this product\") has a tab per language (ES, EN...) above the name and the descriptions. Each tab keeps the text of its language and saves it to its own translation; a dot marks a language that still has the main language's text. Everything else is shared: editing the price, cost, photos, categories, units, sizes or colors from the register writes them to every translation (the dox_pos_lang_sync_price filter can keep the price apart).<\/li>\n<li>New: a translation that was left half made (the connection dropped or the server stopped while it was being created) is finished the next time, never made twice: when the register sends the same product again, when the product is saved from the register, or when it is opened in Edit product. A product missing a translation shows \"The English version is missing\" in the form with a Create now button (with the setting on, it is created as soon as the product opens), and Inventory and Edit product mark it \"Missing in English\".<\/li>\n<li>New: the product form has a Short description, the line WooCommerce shows under the price.<\/li>\n<li>New: the categories in the product form are only the ones in the main language, and a category created from the register is saved in the main language.<\/li>\n<li>WPML: the register shows each product once and counts it once, as above. Creating the translations, the language tabs and the Missing marker are Polylang only: with WPML the translations are still made in WPML.<\/li>\n<li>Stock still changes only through WooCommerce, so whatever the store uses to copy stock between translations (Polylang for WooCommerce, WooCommerce Multilingual or a snippet) keeps working. Polylang (free) does not copy it.<\/li>\n<li>Technical: new includes\/multilingual.php with dox_pos_lang_plugin(), dox_pos_lang_where() (a NOT EXISTS on the language terms of Polylang or on icl_translations of WPML, for products and for variations through their parent), dox_pos_lang_main_id() (with Polylang, a variation of a translation maps to the variation of the main product: the one it was copied from, marked with _dox_pos_lang_of, or the one with the same attributes), dox_pos_lang_assign() and, for the translations, dox_pos_lang_sync() (WC_Admin_Duplicate_Product to create them, then the shared fields copied without writing to the kardex). Each copy is marked in the same save that creates it (_dox_pos_lang_of, _dox_pos_lang and _dox_pos_lang_pending until it is finished), so dox_pos_lang_sync() can adopt an unlinked copy (dox_pos_lang_orphan()) or finish a pending one instead of making another; dox_pos_lang_missing() feeds lang_missing in the edit data and nolang in the catalog and the edit list; POST \/products\/{id}\/translations creates what is missing. Creating or finishing a translation takes a lock per product and language (dox_pos_lang_lock()), so two requests at once never make two; a translation in the trash is left alone. WPML only filters the lists. Without Polylang or WPML they make no queries and leave every query as it was.<\/li>\n<\/ul>\n\n<h4>0.58.2<\/h4>\n\n<ul>\n<li>Fix: in History &gt; Sales, the By channel, By payment method and By salesperson lists no longer overlap. A long name, like a payment method called \"Daviplata o Bancolombia\", pushed its total over the next column; it now wraps onto a second line and the total stays in its own column.<\/li>\n<li>Technical: in assets\/css\/caja.css, .bl .chan can wrap and the first span of each .bl row takes min-width:0.<\/li>\n<\/ul>\n\n<h4>0.58.1<\/h4>\n\n<ul>\n<li>Fix: in Orders, the lines of an order placed on the website now show the size and color the customer chose (\"Ballet flats \u00b7 18-24 months\"), like the orders made in the register. Before, they showed only the product name, so whoever packed did not know which size to take. When the piece shares units, its actual size still shows next to it.<\/li>\n<li>Technical: new dox_pos_order_line_name() in includes\/orders.php, used by the order list and the order detail; it adds the attribute values of the variation that are not already in the line name (compared by segment, not as a substring).<\/li>\n<\/ul>\n\n<p>Full changelog: https:\/\/help.doxstudio.com\/dox-pos-changelog\/<\/p>","raw_excerpt":"A WooCommerce register for WhatsApp, Instagram and the store counter: barcode scanner, cash and change, receipts, till closing, stock.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/de-ch.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/366791","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/de-ch.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/de-ch.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/de-ch.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=366791"}],"author":[{"embeddable":true,"href":"https:\/\/de-ch.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/davidzoque"}],"wp:attachment":[{"href":"https:\/\/de-ch.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=366791"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/de-ch.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=366791"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/de-ch.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=366791"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/de-ch.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=366791"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/de-ch.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=366791"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/de-ch.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=366791"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}