The obligation starts on 1 October 2026, in 9 days.

Publishing a price list: XML and CSV, every day

The Croatian decision on publishing price lists requires XML ili CSV on your website, refreshed daily and kept for 30 days. The plugin does it on a permanent address, with an archive.

About the plugin

What gets published

Every day, right after the price snapshot, the whole catalogue is exported to the chosen formats at a permanent address. The dated file stays as an archive and an undated file always points at the newest list.

https://your-store.com/cjenik/
https://your-store.com/cjenik/cjenik.csv
https://your-store.com/cjenik/cjenik-2026-09-21.csv
https://your-store.com/cjenik/index.json

Three formats, the same content

CSV is semicolon separated, the notation Croatian ERPs and localised Excel produce. Numbers use a decimal point and no thousands separator.

XML carries one element per product; JSON adds a product count at the end so a truncated file is obvious.

Archive and JSON index

index.json lists every available day and address per format, plus the store name, export date, product count and column list.

Retention is a setting, ninety days by default.

Why it is served through PHP

A file in uploads is public on both Apache and nginx, while an .htaccess rule only applies to Apache. Serving through WordPress honours the visibility setting on any web server and keeps the headers correct.

Large catalogues

The export runs in batches, writing to a temporary file and renaming only once the whole catalogue is in. Anyone fetching mid-export gets yesterday's complete list rather than today's half one.

Customising the content

Each row passes through a filter before it is written, so values can be changed from a theme or your own plugin.

add_filter( 'klikoteka_cjenik_red', function ( $red, $product ) {
	$red['kategorija'] = strtoupper( $red['kategorija'] );
	return $red;
}, 10, 2 );

Export columns

ColumnWhat it holds
sifraProduct SKU; the WooCommerce id when there is none
nazivProduct name as shown in the store
barkodGTIN/EAN from the WooCommerce field, when filled
kategorijaFull categories, separated by a slash
cijenaSelling price including tax, as the buyer sees it
cijena_bez_pdvThe same price excluding tax
valutaStore currency, e.g. EUR
sidrena_cijenaAnchor price, when one exists
sidrena_na_danWhich day that is
najniza_30_danaLowest price in the window, when covered
na_snizenjuda or ne
stanjeStock quantity, when enabled in settings
urlProduct address in the store
Questions

Frequently asked

  • How long does exporting a few thousand products take?

    It runs in batches and each batch schedules the next. Typically a few minutes, and the previous list stays fully available throughout.

  • Can I export only some categories?

    The export covers the whole published catalogue. Row content can be changed through the klikoteka_cjenik_red filter.

  • Are variations included?

    Yes, each variation is its own row. Variable parents have no price of their own and are skipped.

  • Is the price list indexed by Google?

    The index page carries noindex, and the files themselves are data, not search content.

  • What if I already have a Google Shopping feed?

    Different job. An advertising feed has its own fields and rules; this is a full catalogue export with pricing and historical values.

Next

Also in the same plugin

Sidrena cijena i cjenik za WooCommerce

All three features, a one-off €20 + VAT.