Përshkrim
Events & Tickets runs the evening from the first booking to the last guest
through the door. It was built for clubs, bars and party promoters — the people
for whom an event is a door, a list, and a queue outside — and it has since been
used for seated dinners, concerts, conferences and weddings, because they are
the same problem wearing different clothes.
Nothing is capped and nothing is metered. There is no per-ticket fee, no
external service to sign up for, no account to create, and no telemetry. Your
guest list lives in your own database, on your own server.
It speaks six languages, and it brought them with it
English, French, Spanish, Portuguese, German and Arabic — not a promise that
somebody will translate it one day, but six finished catalogues in the download.
Install it and it is already in your language.
It works the language out for itself. Whatever WordPress is set to, the
plugin follows — and it follows by language rather than by locale, so pt_BR,
pt_PT and pt all land on Portuguese and ar_DZ, ar_MA and ar_SA all land
on Arabic. A site in a language it does not have falls back to French rather than
serving a screen that is half one language and half another. If you would rather
say it outright, there is one setting: Settings Language.
Everything is translated, not just the buttons. The booking form the guest
fills in, the emails they receive, the words printed on the ticket itself, the
door station held at the entrance, and the admin screens you work in. Dates too —
the month and the weekday come out of the plugin’s own catalogue rather than
WordPress’s, so a French ticket does not print September under a French
heading on an English site.
Arabic really is Arabic. The screens, the emails and the booking form read
right to left. And the ticket — which is a drawn image, not a web page — is drawn
with an Arabic typeface that travels with the plugin, with the letters joined the
way Arabic joins them and the line put in reading order. A time, a price, a table
number or a ticket reference still runs the other way inside the sentence, as it
should. Most plugins that claim Arabic print a row of disconnected letters
backwards on the one thing the guest actually holds.
The language travels with the booking. A guest who booked in Spanish gets
their ticket in Spanish — including a ticket re-sent months later, from a screen
you are reading in French. And your own words stay yours: event titles, venue
names, payment instructions and the success message are your text, and the plugin
will not rewrite them.
Who it is for
- Clubs, bars and late-night venues
- Party and concert promoters
- Seated dinners, galas and weddings
- Conferences, seminars and school evenings
- Associations and community groups
- Anyone taking bookings by card, by transfer, by WhatsApp or in cash
Set an event up by answering questions
Creating an event opens an assistant, and the assistant is the shortest way to
describe a night that exists. It starts with a drawing rather than a form:
fifteen kinds of event, from a standing club night to a banquet, a theatre, a
podium in I or in T, a stadium, a classroom. You point at the one that looks
like your room.
From there every answer decides the next question, and nothing is asked twice.
Are seats numbered? Then how is the room laid out — tables in rows, rows of
chairs, or no order at all? How many rows, how many tables to a row, how many
chairs to a table? Are there levels — a balcony, a terrace, a gallery? Which
parts are sold at which price? How are you paid, and what should somebody who
pays by transfer be told? Does the ticket leave immediately, or once you have
assigned the places yourself? Who chooses the place — the guest, or you?
The panel on the right draws the room while you answer, and shows the prices as
the booking page will show them and the line the ticket will print. When you
finish, the event is ready to sell: places, zones, prices, payment, delivery.
The assistant owns nothing. It adds no setting of its own and keeps no
column of its own — it fills in the panels that already held each answer, and
every one of them stays editable field by field afterwards. An assistant that
knows something the editor does not is a second source of truth, and this
plugin has already paid that bill. For the same reason it refuses to rebuild
the room of an event that already has bookings: it will not renumber a table
somebody has already been sold.
The room is an inventory, and a zone is an interval of it
Say the room once — six rows of eight tables, ten chairs a table, plus a
balcony — and the plugin numbers every place in it. A zone then claims a slice
of that inventory: tables 1 to 5, rows A to C, the whole balcony. It
invents nothing, so nothing can be sold twice and nothing is quietly lost:
whatever no zone claims is named on screen as unclaimed rather than forgotten.
A price category is not a zone. A category has a name and a price, and several
zones can share it — Premium is Premium on the left balcony and on the right.
The booking page sells the categories; the ticket prints the zone, because
the zone is what somebody reads at the door.
Each zone also says what it controls: access only — a standing area where
nobody has a seat — or exactly where each person sits. One event can hold all
three at once: a standing floor, a seated balcony, and a numbered block.
And if you want to draw the room instead of describing it, the builder is
there: drag tables and rows onto a plan, rectangle-select or shift-click,
align, space evenly, nudge with the arrow keys, place a stage, a bar, a door.
The plan you draw is the plan the guest picks from, and the plan you watch on
the night.
Every guest is a person, not a number
A booking for five asks for five names, and each one gets their own ticket with
its own QR code. One code cannot let five people in, and the door knows who is
standing in front of it.
The booking form also knows what is left while it is being filled in —
counted against what the page was rendered with, what the lines above it have
already taken, and what somebody else is taking in another browser at the same
moment. An option with nothing left is greyed out rather than removed, so
nobody’s choice is ever changed behind their back. The real guarantee is not in
the browser, where it could never be: the event is locked, the places are
recounted and the booking is refused at the moment of writing.
Tickets that look like tickets
Each one is drawn at 100 x 250 mm, 300 dpi, with the QR engraved into the
artwork, and delivered as a PDF by email. Mail servers strip attachments more
often than they admit, so every message also carries a download link for each
guest.
The ticket studio takes your own artwork if you have some — upload it, generate
colour variations, and move every printed field where you want it on a visual
field map — and generates a design for you in the colour of your choice if you
would rather not think about it.
The door works
Open the check-in station on any phone — no app to install. Point it at a
ticket and it answers in one screen: valid, already used, or not for tonight.
Counters update live, several phones can scan the same event at once, and when
the venue’s wifi gives up — it will — there is a printable roll-call list with
every guest and every ticket number on it.
The plan says who is actually in the room. A place that has been sold and a
place whose guest has walked through the door are two different facts, and only
one of them moves all evening: a guest who has scanned turns green, carries a
tick and pulses, and a table whose whole party has arrived wears a green ring.
Payment on your terms
Two ways, and neither is the lesser one.
Take the money yourself: a booking arrives pending, you confirm it however you
actually get paid — bank transfer, WhatsApp, cash at the office — and the
tickets go out the moment you do. Nothing is ever issued for money you have not
received. What the guest is told about paying is your own text, written per
event, because offline that text is the payment.
Or let the card do it: add your own Stripe key and the guest pays on Stripe’s
page, comes back confirmed, and gets their tickets without you touching
anything. Their places are held while they pay and released on their own if
they walk away, so the same seat is never sold twice. The money goes straight
from the guest to your own Stripe account — this plugin is never in between,
and takes nothing.
What the free plugin does
Everything below is in this plugin. There is nothing to unlock.
- Unlimited events and unlimited tickets. No cap, no per-ticket fee.
- Six languages in the box — English, French, Spanish, Portuguese, German
and Arabic, detected from your site or chosen in one setting, covering the
admin, the booking form, the emails, the ticket artwork and the door station,
with right-to-left layout and real Arabic shaping on the printed ticket. - Event assistant — fifteen drawn archetypes, one question at a time, and a
live preview of the room, the prices and the printed line. - Event editor — three steps to create one, then panels to refine it:
information and details, prices and places, registration window, description,
artwork. - Room builder — describe the room in numbers or draw it: tables, rows,
levels, a stage, multi-selection, alignment, even spacing, arrow-key nudging. - Zones and price categories — a zone is an interval of the room, a category
is a name and a price that several zones can share. - Organizers library — name, logo, colours, contact. Reused across events.
- Venues library — address, capacity, notes. Reused across events.
- Public booking page — one shortcode,
[bitforgenet_registration]. Asks
for the name of every person coming, shows what is still available as the
form is filled in, respects capacity and the registration window, and
confirms on screen. If no page carries the shortcode, the plugin shows the
form itself rather than leaving a dead link. - Bookings screen — search, filter by event and status, confirm payment,
add an internal note, resend an email, cancel, or enter a booking by hand. - Seating and the floor — every zone on one screen while the evening fills,
a booking seated by hand or placed for you, sold against arrived, and a
ticket that will not print until every guest on it has a place. - Moving somebody who already holds a ticket — the screen states the three
consequences, the buttons stay dead until you typeedit place, the old
ticket stops working at the door and a second email goes out. - Personal QR tickets — one per guest, rendered as a PDF, sent by email
with a download link alongside. - Ticket studio — your own artwork, colour variations, and a visual field
map for every printed field. - Door check-in station for any phone, opened with a per-event door code,
with live counters and multi-station scanning. - Printable roll-call list for the evenings the network fails.
- Discount codes, with their own limits.
- Card payment with Stripe — the guest pays on Stripe’s own page and comes
back with their booking confirmed. Their places are held while they pay and
released on their own if they never finish. The money goes straight from the
guest to your own Stripe account — this plugin is never in between and takes
nothing. - Team notifications — a new booking can be copied to as many colleagues as
you like, not just one address. - CSV export with a column picker — bookings or guests, one event or all,
every field the plugin holds, and it remembers what you ticked. - Tools and data — a system check that tells you why a ticket or an email
did not arrive, a test-ticket email, a database check, and an
archive-and-clear that copies every booking into archive tables before
emptying the live ones, behind a one-time code sent to an address you
nominate. - Searchable archive of everything that has been cleared.
- Activity log — who did what, and when.
- A Help screen inside the plugin — the whole guide, on the screen where
you are stuck, linking to the screens it talks about. Open to anyone who can
see the plugin at all, because the person who most needs it is the one on the
door at midnight. - Delete-all-data on uninstall, if you tick it. Off by default.
Nothing is held back
There is no paid edition of this plugin. The assistant, the room builder, the
ticket studio, the price categories, the discount codes and card payment are
all here, in the plugin you just installed. Nothing is capped, nothing is
metered, and no screen ends in an offer.
Reporting a security issue
If you find something, write to the address on
https://bitforgenet.dev/ and it will be looked at, fixed and credited here by
name unless you would rather not be. Please test against your own installation
rather than somebody else’s.
Thank you to Alik for the two issues fixed in 1.2.1.
Privacy
The plugin stores what a booking needs — names, email address, phone number —
in your own database, on your own server. Email goes out through WordPress,
which means through whatever mail service your site already uses. There is no
account to create with us and no telemetry: nothing is ever sent to BitForge
Network.
External services
The plugin uses one external service, and only if you set it up yourself.
Stripe — used only when you enter a Stripe secret key under Settings
Payments and turn card payment on for an event. Until then no connection to
Stripe is ever made.
When a guest chooses to pay by card, the plugin asks Stripe to open a payment
page and …
Foto ekrani









Instalim
Requirements
- WordPress 5.8 or later
- PHP 7.4 or later
- The GD extension, for rendering the tickets
- A working mail setup on the site — an SMTP plugin if your host’s mail is unreliable
Steps
- Plugins -> Add New, search for Events and Tickets, install and activate. Or upload the ZIP under Plugins -> Add New -> Upload Plugin.
- Open Events & Tickets -> Settings and set your currency, your From address and your payment instructions.
- Open Events & Tickets -> Tools & data, run the system check, then send yourself a test ticket. Do this before your first real booking, not after.
- Create your first event with Events & Tickets -> Events -> New event. The assistant opens on its own and asks what kind of night it is.
- Put the booking form on a page with the shortcode [bitforgenet_registration].
- On the night, open Events & Tickets -> Door scanner, note the door code, and give the link and the code to whoever is on the door.
PBR
-
The name keeps changing. Is it the same plugin?
-
Yes. Same plugin, same folder, same settings, same data, same updates — only
the name shown on screen has changed. It was BitForgeNet Guest Tickets and
Door Check-in, briefly Tickets & Events, and it is now Events and Tickets
with QR Check-in in the directory and Events & Tickets on your own
screens. Nothing to reinstall and nothing to reconfigure. It is still published
by BitForge Network, which is what the Author line says. -
Is there a limit on events, guests or tickets?
-
No. Nothing in this plugin is capped or metered, and there is no per-ticket
fee. What your server can hold is the limit. -
Is there a paid version?
-
Not today. Everything this plugin can do is in the plugin you installed — the
assistant, the room builder, the ticket studio, the price categories, the
discount codes and card payment included. No screen ends in an offer. -
Do guests need an account?
-
No. A guest fills in the form, receives their tickets by email, and shows the
QR code at the door. -
Does it need WooCommerce?
-
No. It has its own booking form and its own bookings screen, and it works on a
site with no shop on it. -
Do I have to use the assistant?
-
No. It opens when you create an event because that is the fastest way through,
and you can leave it at any point: every answer it writes is a field you can
open and change afterwards. It owns no setting of its own. -
How do I describe a room that is not a grid?
-
Two ways, and they end in the same place. Describe it in numbers — rows, tables
to a row, chairs to a table, levels — or draw it in the builder: drop tables,
rows, a stage and a bar on a plan, select several at once, align them, space
them evenly, nudge them with the arrow keys. Either way the plugin numbers
every place and hands them out. -
Can one event have standing room and numbered seats?
-
Yes. Each zone says for itself whether it controls access only or where each
person sits, so a standing floor, a seated balcony and a numbered block can all
belong to the same night. -
What is the difference between a zone and a price category?
-
A zone is a piece of the room — tables 1 to 5, the balcony. A category is a
name and a price, and several zones can share one: Premium is Premium on the
left balcony and on the right. The booking page sells the categories; the
ticket prints the zone, because that is what somebody reads at the door. -
Can I change the room after people have booked?
-
You can add to it and change prices. You cannot rebuild it: the assistant
refuses to renumber a room that already has bookings, because a table number
somebody has already been sold has to keep meaning the same table. -
Two people booked the last table at the same moment. What happens?
-
One of them gets it and the other is told, before anything is charged. The form
shows what is left while it is being filled in — including what somebody else
is taking in another browser — but the guarantee is not in the browser: the
event is locked, the places are recounted and the booking is refused at the
moment it is written. -
Can I move somebody who already has their ticket?
-
Yes, and the plugin treats it as what it is: a re-issue, not an edit. The
screen states the three consequences, the buttons stay dead until you type
edit place, and then the old ticket stops working at the door and a second
email goes out with the new one. -
Can I take payment online?
-
Yes, with Stripe. Put your own Stripe secret key in Settings Payments and
turn card payment on for the events you want it on. The guest pays on a page
hosted by Stripe, no card number touches your site, and the money goes straight
to your own Stripe account: this plugin is never in between and takes nothing
per ticket, ever.Until you enter a key, nothing changes and no connection to Stripe is made. A
booking arrives pending and you confirm it once you have been paid — by
transfer, by WhatsApp, or in cash — exactly as before. -
Do I have to make guests pay by card?
-
No. It is a choice per event, and you can also let a guest reserve now and pay
later: they get both buttons. If you would rather nothing be reserved until it
is paid for, there is a single setting for that. What a guest who pays offline
is told is your own text, written per event — offline, that text is the
payment. -
Does one booking give one QR code for everybody?
-
No, and that is the point. A booking for five produces five tickets with five
different codes, each carrying the name of the person it belongs to. -
Can more than one of us be told when a booking arrives?
-
Yes. The notification address takes a list, and every address on it is really
copied in. -
The tickets are not arriving.
-
The plugin sends through WordPress, so anything that fixes email for the rest
of your site fixes it here. Run Tools & data -> System check first: it says
whether the failure is in the rendering or in the sending. If your host’s mail
is unreliable, install an SMTP plugin and connect a real mailbox — it will be
picked up automatically. -
The email arrives but the PDF is missing.
-
Your mail server is stripping the attachment. Lower the attachment ceiling in
Settings; every email already carries a download link per guest, so the guest
still gets their ticket. -
Does the door scanner need internet?
-
It needs to reach your own website, the same as any other page. For the
evenings when the venue’s wifi is not to be trusted, print the roll-call list
first: it carries every guest and every ticket number, and it works on paper. -
Do I need to install an app on the door phone?
-
No. The station is a web page. Open the link in the phone’s browser, enter the
door code, and allow the camera. -
Can two people scan at once?
-
Yes. Every station checks the same database, so a ticket used at one door is
already used at the other. -
The camera stays black on the door phone.
-
The page must be served over HTTPS — browsers refuse the camera otherwise. If
the site is already on HTTPS, a security plugin or your CDN is probably sending
a blanket camera policy; the scanner screen re-states its own, so clearing the
CDN cache usually settles it. -
Can I use my own ticket artwork?
-
Yes. The plugin will generate a design for you in the colour you choose if you
would rather not think about it, and the ticket studio on the Ticket designs
screen takes your own artwork instead: upload it, generate colour variations of
it, and move every printed field where you want it on a visual field map. -
Can I clear the test bookings before going live?
-
Yes. Tools & data -> Archive and clear copies every booking, guest, ticket
and scan into archive tables and then empties the live ones. Events, venues,
organizers and designs are untouched. It asks for a one-time code sent to an
address you set, so it cannot be run by accident. -
What languages does it come in?
-
Six, finished and in the download: English, French, Spanish, Portuguese, German
and Arabic. Nothing to install and nothing to wait for. -
How does it know which one to use?
-
It reads the language WordPress is set to, and it reads it by language rather
than by locale — pt_BR, pt_PT and pt all get Portuguese; ar_DZ, ar_MA and ar_SA
all get Arabic. A site in a seventh language falls back to French rather than
showing you half a translation. You can also say it outright under Settings
Language, which is the answer when your site is in one language and your guests
read another. -
Does it change the language of my site?
-
No. It moves this plugin and nothing else. WordPress, your theme and every other
plugin keep the language they had. -
Is the ticket itself translated, or only the screens?
-
The ticket itself. A ticket is a drawn image rather than a web page, so it is the
piece that usually gets left behind — here the words on it, the date written out
in full, and the line that says which table or seat all come out in the guest’s
language. -
Does Arabic work properly, including on the ticket?
-
Yes, and that is a real question rather than a polite one. Arabic letters change
shape depending on what is beside them, and the line reads right to left; the
image library that draws tickets does neither by itself, which is why Arabic on a
ticket usually comes out as a row of disconnected letters in the wrong order. The
plugin joins the letters and orders the line before anything is drawn, and carries
an Arabic typeface to draw them with. Numbers inside the sentence — a time, a
price, a table number, a ticket reference — still run the other way, as they
should. The screens, the booking form, the emails and the door station are laid
out right to left too. -
A guest booked in one language and I work in another. Which one do they get?
-
Theirs. The language a guest booked in is kept with their booking, so their
ticket and their emails go out in it — including a ticket re-sent months later
from a screen you are reading in French. -
Are my own event titles translated?
-
No, and they should not be. Your event titles, venue names, payment instructions
and success message are your words; the plugin translates its own and leaves
yours alone. A venue selling to guests in two languages writes those lines in
both. -
Can I correct or add a translation?
-
Yes. The catalogues are ordinary .po files in the plugin’s
languagesfolder,
and the template is there beside them. Better still, put the correction on
https://translate.wordpress.org/projects/wp-plugins/bitforgenet-guest-tickets/ —
a language pack from there is loaded ahead of the plugin’s own files, so your
wording wins and everybody gets it. -
Where do I get help?
-
There is a Help screen in the plugin itself — the whole guide, one click from
wherever you are stuck. The same text is at
https://bitforgenet.dev/plugins/bitforgenet-guest-tickets/help/ — it walks
through a first event, the room, the door and the night itself. Beyond that,
the support forum on this page, or contact@bitforgenet.dev
Shqyrtime
Për këtë shtojcë s’ka shqyrtime.
Kontribues & Zhvillues
“Events and Tickets with QR Check-in” është software me burim të hapur. Në këtë shtojcë kanë dhënë ndihmesë personat vijues.
KontribuesPërkthejeni “Events and Tickets with QR Check-in” në gjuhën tuaj.
Ju intereson zhvillimi?
Shfletoni kodin, shkarkoni depon SVN, ose pajtohuni përmes RSS-je te regjistri i zhvillimeve.
Regjistër ndryshimesh
1.10.1
- Removed
admin/views/event/pricing.php, a tombstone left from the retired
Pricing tab that nothing has called since 1.9.0. - Refreshed the two brand images shipped with the plugin.
- Added a donate link to the directory listing. Nothing appears inside
WordPress: no screen in this plugin ends in an offer, and that has not
changed.
1.10.0
- Six languages, in the download. English, French, Spanish, Portuguese,
German and Arabic. Every screen, the booking form, the emails, the door
station and the words printed on the ticket. - The language is worked out from your site, by language rather than by
locale: pt_BR, pt_PT and pt all land on Portuguese, ar_DZ, ar_MA and ar_SA all
land on Arabic. A site in a language the plugin does not have falls back to
French rather than serving half a translation. - New setting: Settings Language. Leave it on Follow the site, or name
the language outright — for a site in one language selling to guests who read
another. The screen says what your site is set to and what the plugin will
speak, so there is nothing to guess at. - The language travels with the booking. A guest who booked in Spanish is
answered in Spanish, including a ticket re-sent months later from an admin
screen in another language, or issued by cron in the middle of the night. - Dates are translated too, out of the plugin’s own catalogue rather than
WordPress’s — so a French ticket does not print “September” under a French
heading on an English site, and a site that has never installed French still
gets French months. - Arabic is drawn properly on the ticket. The ticket is an image, and the
library that draws it neither joins Arabic letters nor puts the line in
reading order. The plugin now does both before drawing, and carries an Arabic
typeface to draw with. A time, a price, a table number or a ticket reference
still runs the other way inside the sentence. - Right-to-left layout for the admin screens, the booking form, the emails
and the door station — the plugin’s own containers only, so the rest of your
site is untouched. A seating plan is not mirrored: table 1 stays where table 1
actually is. - The plugin’s catalogues are loaded after any language pack from
translate.wordpress.org, so a translator’s work always wins over ours.
1.9.1
- Renamed, and this time for the search rather than for the branding. The
directory ranks the words of a title, so the title is now
Events and Tickets with QR Check-in — the words somebody actually types.
On your own screens and in the admin menu it is Events & Tickets, two
words that fit a sidebar. The brand leaves the title: the Author line already
says BitForge Network, and a name is not the place to sign your work twice. - The slug, the text domain, the shortcodes, the option keys, the database
tables and the update path are untouched, exactly as in 1.9.0. Nothing to
reinstall, nothing to reconfigure.
1.9.0
- Renamed on screen. The slug, the text domain, the shortcodes, the option
keys, the database tables and the update path were all untouched: a label,
not a new plugin. (1.9.1, the same day, renamed it again — see above.) - New icon and new directory banners: a ticket and a QR code, which is what the
plugin actually is. The QR in the artwork is a real one. - The directory page shows the screens again — eight of them, from the
assistant to the door station — and the description finally covers what was
added between 1.2.2 and 1.8.7: the assistant, the room builder, zones as
intervals of an inventory, price categories, live availability in the booking
form, arrivals on the plan, re-issuing a place, and team notifications. - The FAQ was rewritten around the questions the last two months produced.
- New: a Help screen inside the plugin. The whole guide — setup, the
assistant, the room and its zones, payment, tickets, seating, the door, and
what to do when something does not arrive — on the screen where somebody is
actually stuck, linking to the screens each sentence talks about. It reads
nothing and writes nothing, and it needs no capability beyond being able to
open the plugin: help only an administrator can read is help the person who
needed it could not reach. - Nothing else changes: no database change, no stored setting touched, and no
existing screen behaves differently.
1.8.7
The team notification field takes more than one address. A team is more than
one person. Separate them however you like — a comma, a semicolon, a space, one
per line — and everybody on the list is copied on guest emails and alerted on
every new booking. Before, only the first address was ever used.
An empty reply-to now follows WordPress. Left blank it means “whatever this
site uses” rather than “nobody”, so replies land in the site’s own
administration inbox without anybody having to think about it. The from address
behaves the same way, and both boxes show you the address they would fall back
to.
Fixed: typing an answer in the assistant left Continue greyed out. Every
keystroke repainted the panel, but only a full redraw ever drew the buttons — so
after typing the payment instructions the only way to move on was to step back
and forward again. The answer and the button are drawn together now.
The floor plan says who is actually in the room. A seat that is sold and a
seat whose guest has walked through the door are two different facts, and only
one of them changes all evening. A guest who has scanned their ticket turns
green, carries a tick, and breathes gently; a table whose whole party
has arrived wears a green ring. There is an Already in filter, a key under
the plan explaining every colour, and the same story in the simple list for
anyone who never opens the drawing. The movement stops for anyone whose system
asks for less motion — the colour and the tick still say everything.
Moving a guest who already has a ticket is no longer an ordinary save. It
is a reissue, and it does three things at once: the tickets they are holding are
voided — the door refuses those QR codes from that moment — new tickets are
drawn with the new places, and a second email goes out. If they have already
shown somebody the first one, that is the copy that stops working. So the screen
now says all of that in plain words, and the buttons stay dead until you type
edit place into the box beside them. Not a checkbox, which the hand ticks
before the eye reads; not a browser dialog, which is dismissed by reflex. The
same sentence is checked again on the server, because a rule that only lives in
a browser is not a rule.
1.8.6
The booking form now knows what is left while somebody is filling it in.
Three things have to agree, and until now only the first was ever asked: the
number the page was drawn with, the guest rows above this one, and whoever
else is booking at the same moment somewhere else. Choose VIP for five guests in
a room that has five, and the sixth row greys VIP out as you reach it — instead
of letting you type eight names and refusing the lot at the end.
It asks again at the moments a decision is being made: a menu opening, a
choice changing, the quantity changing, the tab coming back to the front — and
on a slow tick in between, never while the tab is hidden. One function answers,
for the page and for the live refresh alike, so the two can never disagree. It
is cached for five seconds and thrown away the instant a booking is written, so
the next person to open a menu sees the seat go.
The quantity stepper stops at what exists, and a line above the guest rows
says how many places are still for sale, counting down as they go.
A category that sells out under you is said out loud, on the row it affects,
and the booking cannot be sent until you have picked another. Your choice is
never changed behind your back — first come, first served, and being told so.
Fixed — and this was the hole underneath all of it: a booking held no place in
its category until somebody had been sat down. The seat count could only see
guests who already had a place written against them, and where the organizer
seats people by hand nobody has one until they do it — hours or days after the
guest paid. A VIP zone of forty still reported forty places left after forty
people had bought it. Every booking now holds its places from the moment it is
written, whether or not anybody has decided where those people are sitting.
None of this is the guarantee, and it does not pretend to be. The booking
itself is still taken under a lock on the event, counted again, and refused with
a plain sentence if the last place went a second ago. The live form exists so
that you are told before you have typed eight names rather than after.
1.8.5
Fixed: your event was not selling the price categories you gave the room.
Every event is handed a “Standard admission” ticket category the moment it is
created, and the room only spoke up when nothing else had — so you could name
three price categories in the assistant, see all three on every screen in the
admin, and have the booking page sell one. The room now decides what an event
sells whenever it describes it, because it is the thing that actually holds
the people. A room category you left at zero borrows the price of the ticket
category of the same name, so nothing silently drops to the base price.
The ticket-categories list stops competing. With a room in place it folds
away on Prices & places under Offers that are not places — early bird,
member, child: a price about when or who rather than where. That is the
job it is actually for.
Fixed: the WordPress footer printed across two tabs. One stray closing tag
at the foot of two templates closed WordPress’s own content wrapper early,
which dropped “Merci de faire de WordPress votre outil de création de contenu”
into the middle of the Ticket and Payment tabs. The test bench now counts
opening and closing tags in every template, because nobody reads a closing tag
at the foot of a 120-line file and a machine counts them in a millisecond.
The floor plan builder can select more than one thing. Drag a rectangle over
the floor and it picks up every part it touches; shift-click adds one;
Ctrl+A takes the lot. Then move them together, line them
up — left, centre, right, even gaps — duplicate them or remove them in one go.
Before this, the only rectangle gesture in the builder struck seats out: the
obvious way to grab a row of tables quietly crossed out every chair inside it.
A rectangle now means whatever the tool means, and striking seats out lives
with the strike-out tool where it belongs.
The stage is picked up like anything else. It needed its own tool before,
which is not something anybody guesses.
More of the builder: arrow keys nudge a selection by 10 cm, or a metre with
Shift. Ctrl+D duplicates,
Delete removes. The panel now opens on what you have selected
instead of on the template gallery, so clicking a table no longer scrolls its
own settings out of sight. A part has a Level field, and the room has a
name field in the builder.
The name of the room is asked at the top of the assistant, where you already
know it, instead of sitting in a box at the bottom of a tab.
Fixed: the Category column of a guest list showed a dash for every guest who
booked a part of the room, because it looked in one module’s own table instead
of asking the question properly.
1.8.4
The assistant describes a room the way you would describe it out loud. You
say how many rows of tables and how many tables to a row — that lays the hall
out once and numbers every table — and then each zone claims a stretch of it:
“the VIP zone runs from table 1 to table 5.” A zone no longer invents places
of its own, which is what makes the rest possible: the same table can never end
up in two zones, and a table you left out of every zone is named on screen
rather than quietly dropped off the sale.
A price category is no longer the same thing as a zone. A category has its
own name and its own price, and several zones can share one — Premium is
Premium whether it is the left balcony or the right. The booking page sells the
categories; the ticket prints the zone, because the zone is what somebody
actually reads at the door.
The payment question is now the whole story. As well as how people pay and
when the ticket goes out, the assistant asks what to tell a guest paying off the
site, how many places one booking may take, and whether you need a name for
every place or one name for the booking. All four are written into the event.
Prices & places shows the room instead of asking for it again. The four
buttons — no places, one gauge, zones, a plan — and the “What one person is
given” radio group are gone. Both asked what the assistant had just asked, and
the two screens could contradict each other: answer “tables” in the assistant,
tick “a chair” here, and the plugin starts selling chairs at a table nobody
booked. The tab now draws the room that exists, says in a sentence what a
ticket will print, and gives you the two ways back — run the assistant again, or
open the builder on what it built.
The capacity is counted, not typed. With a room in place, the capacity box
is replaced by the room’s own total. Two boxes for one number always ends the
same way: one of them is believed at the door.
Fixed: a balcony forgot it was a balcony. A block’s level and its control
were saved to the database and never read back, so both were lost the first time
the room was loaded again.
Fixed: a hall of tables came back sold chair by chair. The floor plan
builder never sent the room’s grain back when you saved, so a room built around
whole tables was rewritten as a room of single seats.
1.8.3
Fixed: finishing the assistant broke the site. It wrote its entry to the
activity log with the wrong number of arguments, which PHP answers with a fatal
error — so the last click of the assistant produced a white screen. The test
bench now reads every logging call in the plugin and checks it passes what the
log actually asks for.
The assistant walks you through it now. It showed every question at once and
left you to work out where the end was. It asks one question at a time, with
Back and Continue at the bottom and a row of steps along the top showing
where you are, what is behind you, and what is still to come. Continue stays
greyed out, with a reason, until the question in front of you has an answer — a
button that disappears just leaves you looking for it.
1.8.2
Fixed: finishing the assistant said “Security check failed”. Its form was
signed with the name of a different action, which is the same as not signing it
at all — so the one button that mattered died at the last step. Every form is now
checked against the action it posts, by the test bench, so this cannot come back
quietly.
1.8.1
The creation wizard stops asking what the assistant asks. It had a “Tickets”
step wanting a price and a capacity, and then the assistant wanted the same two
numbers again — with the zones and the room that give them meaning. One number
asked on two screens is how two screens end up disagreeing about it. Creating an
event is now three steps, and the last button says what happens next: Set up
places and prices.
1.8.0
An assistant that sets up an event by asking about it. Prices, zones,
capacity and the moment a ticket goes out are one decision described on four
screens, and nobody arriving for the first time can know that. So the assistant
has the conversation instead — starting from a picture of the kind of room you
are filling, not a word for it — and writes the answers into the tabs.
- It opens by itself after you create an event, and there is a button for it on
Prices & places whenever you want to run it again. - Every answer decides the next question, and the panel beside it shows the
consequence: the room being drawn, the prices a guest will see, and what the
ticket will actually print. - It tells you what each answer settles and why — “the ticket carries the table,
so the chair number is not asked: at a round table it tells nobody anything.” - It owns nothing. It adds no setting of its own; everything it decides is
still there, field by field, on the tab that always owned it. - It will not quietly rebuild a room for an event that already has bookings —
a place is printed on a ticket the moment it is given out.
1.7.0
One tab for money, capacity and places. The price and the capacity lived on
one screen and the room on another, so you could set a capacity of 500 and then
describe a room holding 380 — and nothing said so until somebody was turned away
at the door. They are one decision, so they are now one tab: Prices & places.
A place there is whatever your event hands out: a seat, a table, a row, or a
whole area.
- Pricing & capacity is gone. The price, the currency and the capacity moved
to Prices & places, along with the price categories and the zones. - When & where is now Information & details, and holds what a guest is told
before booking — including this event serves food or drinks and the sponsor
strip. - Old links to the removed tab land on Prices & places instead of dropping you
back at the start.
Fixed: the back button brought a finished booking form back to life. After
booking, pressing Back showed the form still filled in, with the submit button
still greyed out and the countdown frozen — a page that looked broken. A booking
could never have been made twice (the server has refused that since 1.3.0), but
the page now reloads itself, with an empty form, a live clock and a working
button.
1.6.1
Fixed: named zones were all sold at the price of the event. Give three zones
three prices and the booking page offered three zones — at one price. Worse, the
booking was charged that price too, so a zone priced higher than the event was
sold short and one priced lower was overcharged. The room hands the booking form
a zone carrying its own price; the form then asked a separate question — what
does this cost? — that nothing was answering for a zone. It answers now.
Fixed: deleting a zone moved the bookings of the one below it. Zone
references were rebuilt from their position on every save, so removing the first
zone renamed the second into it, and a booking already sold pointed at a zone its
guest never bought. Each zone now carries its own reference.
Fixed: a zone of 25 places sold 40. A capacity that did not divide evenly
into rows was rounded up to fill the last row, silently. The surplus places are
now held back, and a zone holds the number you typed.
1.6.0
Four capabilities that used to be withheld are now in the plugin.
- The ticket studio. Bring in your own artwork, generate colour variations
of it, and place every printed field yourself on a visual field map, on the
Designs screen. - The floor plan editor. Draw the room: the stage, curved rows, round
tables, standing areas and aisles, with numbering that runs whichever way
your venue counts — and a guest who picks their own seat on the plan. - Price categories. VIP, table, early bird, member: several prices on one
event instead of one. - Discount codes. Fixed or percentage, limited by date or by number of
uses.
Nothing was removed and nothing changed shape: existing events, designs, rooms
and settings are read exactly as before. If you never open these screens, the
plugin behaves as it did.
1.2.1
Two security fixes, both reported responsibly by Alik, who tested 1.0.9 in
an isolated environment and sent a clear, accurate write-up of each. Both were
real. Thank you.
Bookings for one event now happen one at a time. Counting the free seats
and taking one were two separate steps, and between two steps another request
fits: two people clicking at the same instant could both be told there was one
seat left, and both take it. The capacity check was never wrong — it was just
on the wrong side of a gap. That gap is now closed with a lock held for the
length of a booking, per event, so a busy night with four events does not queue
into one line. Every capacity rule is now inside it: the event’s own capacity,
each price category, and each area of the room. (CWE-362.)
Forwarding headers are no longer believed by default. The plugin recognises
a visitor by their address in order to count how often they book. It used to
read CF-Connecting-IP, X-Real-IP or X-Forwarded-For if they were present —
but those are written by whoever is making the request, so anybody could invent
one and get a fresh allowance. Only the address the connection actually came
from is used now. If your site really is behind Cloudflare or a reverse proxy,
say so under Settings Anti-abuse, and the panel shows you what your server is
actually sending so the choice is not a guess. Naming your proxies in
wp-config.php as BFNET_TRUSTED_PROXIES narrows it further. Where a list of
forwarded addresses is read, the plugin now takes the entry the nearest proxy
wrote rather than the one at the front, which is the one a visitor can invent.
(CWE-799.)
Also: a second booking limit counted per email address, so getting around
the per-connection one is no longer enough on its own.
1.2.0
Everything below arrived since 1.0.9. It was built and tested over several
internal builds; this is the first of them anyone is offered, because a version
that was superseded the same week is not a version worth installing.
Rooms and places. An event can now describe where people sit. Three levels,
and nobody is made to climb them: a plain capacity, named zones with a capacity
and a price each, or — with Pro — a drawn floor plan. Seats are worked out
from a rule rather than stored, so a four thousand seat auditorium is twenty
rows in your database and not four thousand. The numbering runs whichever way
your venue counts: left to right, right to left, odd and even out from the
centre, alternating by row. It can skip row I and O, skip 13, start anywhere,
and carry a prefix.
Card payment with Stripe. Set your own secret key and a guest can pay on
Stripe’s own page. No card number reaches your site. A payment is confirmed by
reading it back from Stripe and by a signed message Stripe sends your site —
never by the browser that came back. Your places are held for the length of the
payment session and released on their own if nobody finishes, so the same seat
cannot be sold twice. Card payment is optional, per event: an evening paid at
the door works exactly as it did before.
When the ticket goes out, per event. Acknowledge the booking now and send
the ticket once you have decided where somebody sits, or — when the event has
a room — send it straight away with the place printed on it.
The booking page no longer depends on a page. If a direct link to an event
has nowhere to open, the plugin renders the booking form itself inside your
theme. It also creates the booking page for you, once, rather than leaving a
link that opens nothing.
Fixed
- A booking link opened an empty page on sites that had never added the
shortcode themselves. - Guest rows two and after on the manual booking screen were greyed out instead
of hidden, because the plugin’s own stylesheet beat the browser’s rule. - The Reserve button was clipped by themes with their own line height.
- Sold-out categories were still offered for booking; a category is now closed
by the room as well as by its own capacity, and the last place is re-counted
at the moment the booking is written rather than only when the page was
drawn. - Reverting a booking to awaiting payment cleared the check-ins but kept them
in the history, named.
Also added
- Add a guest by hand, for the bookings that arrive by phone.
- A live floor view of the evening — what is taken, what has arrived, and what
is full — with the room drawn as the organizer drew it. - The confirmation screen says which address the email went to, and to look in
the spam folder. - Keyboard in the plan editor: undo, redo, delete, escape, shift to select
several, and a number beside every slider.
1.0.9
- The logo printed on the ticket, on the door’s code screen and beside an
organizer with no artwork of its own is the anvil alone. It had been the full
lockup, wordmark included, which the renderer fits inside its box: a wide
image with words in it shrank to a smudge nobody could read - The plugin’s page is rewritten. The feature list now says what this plugin
actually does — the organizer and venue libraries, the export column picker,
the system check and the archive were all shipped and none of them were
mentioned, while three of them were wrongly described as belonging to Pro.
The Pro section says what Pro adds instead of hinting at it, and the FAQ
answers fifteen questions rather than five. No code changed for this
1.0.8
- Every template under admin/views/ and public/views/ states once, at the top of
the file, that the PrefixAllGlobals naming rule does not apply to it. A
template is included from a method, never at file scope, so its variables
belong to that method’s scope rather than the global one, and PHPCS — reading
each file on its own — has no way to see where the include happens. No
variable was renamed and nothing behaves differently
1.0.7
- The plugin is renamed. It was submitted as “2KEvents”, and “2K” is a
registered trademark of Take-Two Interactive that we have no right to lead a
name with. The display name, the slug, the text domain, the shortcodes and
every PHP prefix now read BitForgeNet — the name of the site that publishes
it, bitforgenet.dev - Every stylesheet and script the plugin prints goes out through the enqueue
API. The door station and the two screens around it are their own HTML
documents, served on their own endpoint before the theme runs, so they had
carried their CSS and JS inside the page. They now register handles and print
them by name, the two runtime values arriving through wp_add_inline_style()
and wp_add_inline_script() - The admin menu icon is assembled from the mark at runtime and has no file
behind it, so it registers a style handle with no source rather than printing
a style tag into the head, and moves to admin_enqueue_scripts - The code prefix is five characters. It was three, which is under the four the
directory asks for
1.0.6
- Finished the tidy-up the last two releases started: every code-quality
suppression in the plugin is now either stated once for a whole file or
written on the single line it covers, and none of them can change the
meaning of another one elsewhere in the same file. No behaviour changes
1.0.5
- Fixed suppression comments that did not cover what they appeared to cover.
One kind switched every code-quality rule back on rather than the one it had
switched off, quietly undoing notes written elsewhere in the same file; the
other sat above a nine-line statement instead of around it. No behaviour
changes for anyone using the plugin
1.0.4
- Request input is now read the way it should be read: eight admin screens
applied the integer cast to the whole expression rather than to the …
