In this article
On most affiliate sites the offer is a sentence. It sits inside a review page as text, a second copy sits on the homepage, and a third on the bonuses page. When the offer changes, somebody has to remember all three. When it ends, usually nobody does.
PokaTheme 5 made every offer a record instead: a Bonus, with eleven fields, an operator it belongs to, and a date it stops being true. One record feeds a card, a comparison table, a review page and an archive — and the theme takes the offer off the site on the day it ends, without being asked.
This post covers those fields, the three bonus blocks, the URLs a bonus type creates, and the screens that flag offers gone stale.
Why an offer needs to be a record
Text in a page cannot be queried. You cannot list this month’s free-spins offers, sort anything by expiry, show one offer twice and edit it once, or ask the site which offers have already ended — and on a bonus-led site, that last one quietly costs you.
Offers have codes, expiry dates, wagering terms and an operator they belong to. Until PokaTheme 5 there was nowhere in the theme to put any of that.
Coming from v4, nothing is taken away. Tools → PokaTheme v5 reports what it would do before touching anything, works in batches of 25, creates every bonus as a draft and deletes nothing, so your v4 bonus text stays where it is. The upgrade notes cover the rest.
The eleven fields on a bonus
Bonuses → Add New Bonus opens an ordinary WordPress editor — title, content, excerpt, featured image, revisions — with one extra box, Bonus details:
| Field | What goes in it |
|---|---|
| Operator | The review this bonus belongs to |
| Headline | The offer as the reader reads it, e.g. 100% up to 500 EUR + 50 spins |
| Promo code | Leave empty when no code is needed |
| Wagering | e.g. 35x bonus |
| Minimum deposit | The qualifying deposit |
| Maximum cashout | The most withdrawable from the bonus |
| Valid from | Start date |
| Valid until | Expiry date. Empty means it does not expire |
| Terms | Shown next to the value. Required in most regulated markets |
| CTA label | Falls back to the theme default when empty |
| Tracking URL | The affiliate link for this offer |
Two details there are deliberate. It is the theme’s own metabox rather than a block-editor panel, because PokaTheme still supports the Classic Editor and WordPress renders a classic metabox inside the block editor too. And every field is registered with register_post_meta() and exposed to REST, so it reaches the REST API and block bindings too.
Expiry is a date the site acts on
Valid until is the field that earns the record its keep. The theme reads expiry in the site’s own timezone and runs it to the end of the day, so an offer expiring today is still live today. One rule in one place, so nothing on the site disagrees about which day an offer dies on. Three things follow on their own:
- Ended offers drop off. Bonus lists, bonus tables and the bonus archives leave them out by default.
- The Bonuses list warns you first. The Expiry column shows the date,
No expirywhen the field is empty, a red Expired badge once it has passed, and a3 days leftbadge from a week out. It sorts, because that is the question the screen exists to answer. - You can still show them deliberately, with Show expired bonuses in a block or
show_expired="true"in a shortcode.
Terms, and the check for the ones missing them
An offer’s terms belong beside its value, and PokaTheme renders them that way in both the card and the table. The question is whether there are any terms to put there. A headline published with an empty Terms field satisfies that adjacency vacuously, so the theme looks for exactly that case and flags it in three places:
- a Terms column on the Bonuses list, showing Missing in red;
- a filter above that list, Offer with no terms;
- a line on Tools → PokaTheme compliance: either Every published offer has its terms with it, or the number of published offers that state a value with no terms beside them.
Drafts are left alone — a bonus without terms yet is somebody part way through writing one. And the check only flags: it does not invent terms, and it never prints “no terms provided” to a reader.
The bonus record holds the offer’s own conditions. The age shown on the site (18, or 19 in Ontario), the responsible-gambling page and the licence display come from your market’s compliance profile instead.
The three bonus blocks
Every PokaTheme block is also a shortcode, and the bonus ones are the clearest case: the block is the shortcode with a settings panel.
Single Bonus ([poka_bonus]) puts one offer on the page — choose it under Select Bonus. The shortcode takes the bonus’s ID or its slug, and a slug survives an export into another site.
Bonus List ([poka_bonus_list]) renders offers as cards: Filter by Operator, Filter by Bonus Type, Num (three by default, up to 100), Columns (one to four), Sort (newest first, title, or manual order), Show the bonus type and Show expired bonuses.
[poka_bonus_list type="free-spins" num="6" columns="3" show_type="true"]
Bonus Table ([poka_bonus_table]) is the comparison view: one row per offer, ten by default, with columns picked from Operator, Bonus, Wagering, Code, Min. deposit, Valid until and Button. The default set, written out:
[poka_bonus_table columns="operator,headline,wagering,code,expiry,cta"]
Show the bonus type on cards arrived in 5.0.1, off by default, so no existing page changed when you updated.
Bonus types, and the archives they create
Bonus Type is a hierarchical taxonomy on bonuses — welcome bonus, free spins, free bets, reload, cashback, whatever vocabulary your site uses. It appears in the Bonuses menu, as a column on the list, and in the menu editor.
Each type is also a URL: /bonus-type/free-spins/ lists that type’s live offers, /bonus/ lists all of them. Both used to fall through to the blog template and render as a list of posts; they have a template of their own now. Two details are worth knowing:
- The term description becomes the archive’s introduction, so a bonus type can carry a paragraph explaining what that kind of offer is — the copy above the list, and the copy a search engine reads.
- Ended offers stay off the archives, and the rule is added to whatever query another plugin already set rather than replacing it. For a reference page of offers that have ended, the
poka_bonus_archive_show_expiredfilter turns them back on.
The archive base comes from a theme setting, bonus-post-type-slug, so a child theme can move /bonus/ to /offers/. There is no Customizer control for it today.
Where bonuses turn up without a block
- On the review. Editing an operator, a read-only Bonuses box lists every bonus pointing at it, with an Expired badge where it applies and an Add a bonus button when there are none. It links out rather than offering a second place to edit the bonus.
- Inside ordinary blocks. Block bindings can pull an operator’s current live offer into a plain Heading or Paragraph.
- On Tools → PokaTheme freshness, which lists offers that have expired and offers nobody has touched inside their cadence, which defaults to seven days for bonuses and 120 for listicles.
Putting it on a site you already run
- Decide the types first, so every offer gets one and the archives fill from the start.
- Make one bonus properly — operator, headline, terms and tracking URL at a minimum, expiry if the offer has one. That record is the template for the rest.
- Put the table where the comparison happens, then sort the Bonuses list by expiry once a week. That is the whole maintenance routine.
The documentation has the field-by-field reference, and all five demos ship with bonuses wired to their reviews — Slots Dark has twelve. Still on v4? Start with PokaTheme 5 and the migration tool: it builds these records out of what you have already written.
Written by the PokaTheme team
PokaTheme is designed and built by Redshift web development, a small team in Thessaloniki, Greece, making WordPress themes for affiliate sites for more than ten years.
Questions about this post? Ask in the support forum or contact us.