WooCommerce UPC, EAN, and ISBN plugin closed? Your GTINs are still in the database
Product GTIN for WooCommerce is closed too, and neither plugin gets updates from WordPress.org anymore. The numbers you typed into them have not gone anywhere, but WooCommerce does not read them, because it now has its own GTIN field. This page shows how to check the numbers and move them into that field (tested on WooCommerce 11.2.1).
This page is about two plugins that added a GTIN field to WooCommerce before WooCommerce had one: WooCommerce UPC, EAN, and ISBN and Product GTIN (EAN, UPC, ISBN) for WooCommerce. If your store used either of them, your numbers are still in that plugin’s own field, but WooCommerce now uses a field of its own.
What happened to the two plugins
- WooCommerce UPC, EAN, and ISBN, last version 0.5.1: closed on October 23, 2025 at the author’s
request, and its WordPress.org page says “This closure is
permanent”. It kept the numbers in
hwp_product_gtinon products and inhwp_var_gtinon variations. - Product GTIN (EAN, UPC, ISBN) for WooCommerce, last version 1.1.1: closed on January 5, 2023, and the
reason on its WordPress.org page
is “Security Issue”. It kept the numbers in
_wpm_gtin_code, on products and on variations.
A closed plugin can no longer be downloaded or updated from WordPress.org. A copy that is already installed keeps working as it is. The numbers survive even if you delete the plugin: neither of the two removes its data when it is uninstalled (we checked their source code).
Product GTIN for WooCommerce was closed on WordPress.org for a security issue and has had no update there since. If it is still active in your store, deactivate it now. Nothing below needs it: the numbers stay in the database, and WooCommerce’s export reads them without the plugin.
This is the site of Merchlint, a separate catalog audit plugin. Merchlint is not affiliated with or endorsed by the authors of either plugin; the plugin names are used here only to identify where your numbers are stored. Merchlint does not replace either plugin: the GTIN field they added is now built into WooCommerce.
Where WooCommerce wants the number now
WooCommerce has had its own field since version 9.2. Open a product and go to Product data →
Inventory: the field under SKU is GTIN, UPC, EAN, or ISBN. Each variation has the same field on the
Variations tab. WooCommerce stores it as _global_unique_id, its product CSV calls the column
“GTIN, UPC, EAN, or ISBN”, and from 9.3 it adds the number to the product page’s structured data for
Google. More about the field: WooCommerce product with no GTIN.
WooCommerce does not read the old plugins’ fields: their numbers do not appear in its field, its export column or its structured data. While an old plugin is active, the plugin itself puts its own number into the product page’s structured data (more under After the move). Once the plugin is gone, the number reaches Google only through a feed plugin that was set to read the old field.
To count the numbers still in the old fields, run this in WP-CLI:
wp db query "SELECT meta_key, COUNT(*) FROM wp_postmeta \
WHERE meta_key IN ('hwp_product_gtin','hwp_var_gtin','_wpm_gtin_code') \
AND TRIM(meta_value) <> '' GROUP BY meta_key"
Replace wp_ with your table prefix.
What WooCommerce accepts and what it rejects
The old plugins saved a number exactly as it was typed. WooCommerce’s field catches one problem but not another. We checked both on WooCommerce 11.2.1 on October 19, 2026:
- A number another product already has is rejected with Invalid or duplicated GTIN, UPC, EAN or ISBN. In an import, the whole row fails and that product keeps an empty field. Two products sharing a number usually means one of them has the wrong one.
- A wrong check digit is accepted. WooCommerce does not verify it, so a mistyped number goes in without a warning. Google Merchant Center flags it later.
When you save, WooCommerce also strips everything except digits, hyphens and a final X, and Google gets the number only if it has 8, 12, 13 or 14 digits (which numbers reach Google). So check the numbers before you move them, not after.
Moving the numbers: export, check, import
This uses WooCommerce’s own export and import; there is nothing to install.
- Export. In Products, click Export at the top of the list, check Yes, export all custom meta next to Export custom meta? and click Generate CSV. The old numbers come out in the columns Meta: hwp_product_gtin and Meta: hwp_var_gtin (WooCommerce UPC, EAN, and ISBN) or Meta: _wpm_gtin_code (Product GTIN for WooCommerce). The old plugin does not have to be active.
- Open the file so the codes stay text. If you open the file with a double click, Excel shows a 13-digit code as 5.90123E+12 and drops the leading zero of a UPC; once the file is saved again, those digits are gone. In Excel, use Data → From Text/CSV and set Data Type Detection to Do not detect data types. In Google Sheets, use File → Import and uncheck Convert text to numbers, dates, and formulas.
- Build the import file: two columns, only the rows with a number. The first column is ID. The second is named GTIN, UPC, EAN, or ISBN and holds the old number. With Product GTIN for WooCommerce, that is the Meta: _wpm_gtin_code column renamed. With WooCommerce UPC, EAN, and ISBN, products have their numbers in one Meta column and variations in the other: copy the numbers from both into this one column, each next to its own ID. Leave out every row without a number: in an import that updates existing products, an empty cell erases the number already in WooCommerce’s field, and we saw it happen. Also leave out products that already have a number in WooCommerce’s own field (the GTIN, UPC, EAN, or ISBN column of the export), unless you want the old number to replace it.
- Check the file. Save it as CSV and open it in the GTIN validator. It finds the column by its name and lists wrong check digits, wrong lengths and duplicates, with their row numbers. Copy each wrong number again from the packaging; if two products share a number, check both against their packaging. The file never leaves your browser.
- Import. In Products, click Import, choose the file, check Update existing products and click Continue. On the Column mapping screen, map the GTIN, UPC, EAN, or ISBN column to the field of the same name yourself: WooCommerce 11.2 does not map its own column automatically (woocommerce#68736). ID maps itself. Then click Run the importer.
- Read the import log. The last screen says how many products failed to import; View import log lists them. A product with Invalid or duplicated GTIN, UPC, EAN or ISBN. under Reason for failure is one whose number WooCommerce turned down, so its field is still empty. More about the log: WooCommerce CSV import: what to check afterwards.
We ran an import like this on WooCommerce 11.2.1 with simple products and variations: the numbers went in, the variations stayed with their parent products although the file had no Parent column, and the duplicate failed as described above.
After the move
- Point your feed at WooCommerce’s field. If a feed plugin was set to read the old field, it keeps
sending the old numbers, including the wrong ones you have just corrected. WooCommerce’s field is
_global_unique_id. - Finally, deactivate and delete the old plugin if it is still active. While it is active, it puts its own number into the product page’s structured data in place of WooCommerce’s. We reproduced this with the source code of both plugins on WooCommerce 11.2.1: a number corrected in WooCommerce did not reach the page, and once the old field was empty, the page’s structured data had an empty GTIN.
- The old fields can stay in the database. Once the plugin is gone, they matter only to a feed plugin still set to read them.
Checking the whole catalog afterwards
Without another export, Merchlint shows what the import left behind:
products and variations with no GTIN in WooCommerce’s field, including the ones the
importer turned down, and numbers used by more than one product. Both checks
are in the free Merchlint plugin for WooCommerce. If some numbers stayed behind in
the old fields, the no-GTIN check says so in a note: how many products hold their number only in
hwp_product_gtin, hwp_var_gtin or _wpm_gtin_code, and which field it is (the two hwp_
fields since version 0.3.9).