{"id":361265,"date":"2026-09-02T13:56:18","date_gmt":"2026-09-02T13:56:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/2kevents-event-tickets-and-door-check-in\/"},"modified":"2026-09-05T15:12:40","modified_gmt":"2026-09-05T15:12:40","slug":"bitforgenet-guest-tickets","status":"publish","type":"plugin","link":"https:\/\/vec.wordpress.org\/plugins\/bitforgenet-guest-tickets\/","author":23537276,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.1","stable_tag":"1.2.1","tested":"7.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"BitForgeNet Guest Tickets and Door Check-in","header_author":"BitForge Network","header_description":"Professional event, registration, ticketing and door check-in system. Custom events with organizers, venues and line-ups, per-event registration, manual or automated payment validation, unique QR tickets rendered onto designer templates, PDF delivery by email, and live access control at the gate.","assets_banners_color":"12304a","last_updated":"2026-09-05 15:12:40","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/bitforgenet.dev\/plugins\/bitforgenet-guest-tickets\/","header_author_uri":"https:\/\/bitforgenet.dev\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":106,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.8":{"tag":"1.0.8","author":"bitforgenet","date":"2026-09-02 13:56:00","revision":3678117},"1.0.9":{"tag":"1.0.9","author":"bitforgenet","date":"2026-09-02 20:20:09","revision":3678620},"1.2.0":{"tag":"1.2.0","author":"bitforgenet","date":"2026-09-05 14:52:39","revision":3682551},"1.2.1":{"tag":"1.2.1","author":"bitforgenet","date":"2026-09-05 15:12:40","revision":3682567}},"upgrade_notice":{"1.2.1":"<p>Two security fixes, both found and reported by Alik. Forwarding headers such as\nX-Forwarded-For are no longer believed by default, so a visitor can no longer\nhand themselves a fresh rate limit by inventing an address; and bookings for\none event now happen one at a time, so two people clicking at the same instant\ncannot both take the last seat. If your site is behind Cloudflare or a reverse\nproxy, tell the plugin so under Settings \u2192 Anti-abuse.<\/p>","1.2.0":"<p>Rooms and places, card payment with Stripe, and the booking page no longer\ndepends on you having made one. Existing events are untouched and keep working\nexactly as before: a room is something you add when you want one, and card\npayment does nothing until you enter a Stripe key of your own.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3678116,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3678116,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3678116,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3678116,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.8","1.0.9","1.2.0","1.2.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[27702,1486,1373,4772,4771],"plugin_category":[40,58],"plugin_contributors":[278878],"plugin_business_model":[],"class_list":["post-361265","plugin","type-plugin","status-publish","hentry","plugin_tags-check-in","plugin_tags-events","plugin_tags-qr-code","plugin_tags-ticketing","plugin_tags-tickets","plugin_category-calendar-and-events","plugin_category-user-management","plugin_contributors-bitforgenet","plugin_committers-bitforgenet"],"banners":{"banner":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/banner-772x250.png?rev=3678116","banner_2x":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/banner-1544x500.png?rev=3678116","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/icon-128x128.png?rev=3678116","icon_2x":"https:\/\/ps.w.org\/bitforgenet-guest-tickets\/assets\/icon-256x256.png?rev=3678116","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>BitForgeNet Guest Tickets runs the evening from the first booking to the last\nguest through the door. It was built for clubs, bars and party promoters \u2014 the\npeople for whom an event is a door, a list, and a queue outside.<\/p>\n\n<p>Nothing is capped and nothing is metered. There is no per-ticket fee, no\nexternal service to sign up for, no account to create, and no telemetry. Your\nguest list lives in your own database, on your own server.<\/p>\n\n<h4>Who it is for<\/h4>\n\n<ul>\n<li>Clubs, bars and late-night venues<\/li>\n<li>Party and concert promoters<\/li>\n<li>Private events, galas and weddings<\/li>\n<li>Associations, schools and community evenings<\/li>\n<li>Anyone taking bookings by card, by transfer, by WhatsApp or in cash<\/li>\n<\/ul>\n\n<h4>Every guest is a person, not a number<\/h4>\n\n<p>A booking for five asks for five names, and each one gets their own ticket with\nits own QR code. One code cannot let five people in, and the door knows who is\nstanding in front of it.<\/p>\n\n<h4>Tickets that look like tickets<\/h4>\n\n<p>Each one is drawn at 100 x 250 mm, 300 dpi, with the QR engraved into the\nartwork, and delivered as a PDF by email. Mail servers strip attachments more\noften than they admit, so every message also carries a download link for each\nguest.<\/p>\n\n<h4>The door works<\/h4>\n\n<p>Open the check-in station on any phone \u2014 no app to install. Point it at a\nticket and it answers in one screen: valid, already used, or not for tonight.\nCounters update live, several phones can scan the same event at once, and when\nthe venue's wifi gives up \u2014 it will \u2014 there is a printable roll-call list with\nevery guest and every ticket number on it.<\/p>\n\n<h4>Payment on your terms<\/h4>\n\n<p>Two ways, and neither is the lesser one.<\/p>\n\n<p>Take the money yourself: a booking arrives pending, you confirm it however you\nactually get paid \u2014 bank transfer, WhatsApp, cash at the office \u2014 and the\ntickets go out the moment you do. Nothing is ever issued for money you have not\nreceived.<\/p>\n\n<p>Or let the card do it: add your own Stripe key and the guest pays on Stripe's\npage, comes back confirmed, and gets their tickets without you touching\nanything. Their places are held while they pay and released on their own if\nthey walk away, so the same seat is never sold twice. The money goes straight\nfrom the guest to your own Stripe account \u2014 this plugin is never in between,\nand takes nothing.<\/p>\n\n<h4>What the free plugin does<\/h4>\n\n<p>Everything below is in this plugin. There is nothing to unlock.<\/p>\n\n<ul>\n<li><strong>Unlimited events and unlimited tickets.<\/strong> No cap, no per-ticket fee.<\/li>\n<li><strong>Event editor<\/strong> \u2014 a four-step wizard to create one, six tabs to refine it:\ndates, capacity, price, registration window, description, artwork.<\/li>\n<li><strong>Organizers library<\/strong> \u2014 name, logo, colours, contact. Reused across events.<\/li>\n<li><strong>Venues library<\/strong> \u2014 address, capacity, notes. Reused across events.<\/li>\n<li><strong>Public booking page<\/strong> \u2014 one shortcode, <code>[bitforgenet_registration]<\/code>. Asks\nfor the name of every person coming, respects capacity and the registration\nwindow, and confirms on screen.<\/li>\n<li><strong>Bookings screen<\/strong> \u2014 search, filter by event and status, confirm payment,\nadd an internal note, resend an email, cancel.<\/li>\n<li><strong>Personal QR tickets<\/strong> \u2014 one per guest, rendered as a PDF, sent by email\nwith a download link alongside.<\/li>\n<li><strong>Built-in ticket design<\/strong>, generated in the colour of your choice and\npainted on demand at 300 dpi.<\/li>\n<li><strong>Door check-in station<\/strong> for any phone, opened with a per-event door code,\nwith live counters and multi-station scanning.<\/li>\n<li><strong>Printable roll-call list<\/strong> for the evenings the network fails.<\/li>\n<li><strong>CSV export with a column picker<\/strong> \u2014 bookings or guests, one event or all,\nevery field the plugin holds, and it remembers what you ticked.<\/li>\n<li><strong>Tools and data<\/strong> \u2014 a system check that tells you why a ticket or an email\ndid not arrive, a test-ticket email, a database check, and an\narchive-and-clear that copies every booking into archive tables before\nemptying the live ones, behind a one-time code sent to an address you\nnominate.<\/li>\n<li><strong>Rooms and places<\/strong> \u2014 describe the room once and the plugin hands out the\nplaces: a plain capacity, or named zones with a capacity and a price each\n(VIP, balcony, standing, whatever you call them). The seat a guest is given\nis printed on their ticket.<\/li>\n<li><strong>Card payment with Stripe<\/strong> \u2014 the guest pays on Stripe's own page and comes\nback with their booking confirmed. Their places are held while they pay and\nreleased on their own if they never finish, so the same seat is never sold\ntwice. Optional: an event paid at the door or by transfer works exactly as\nbefore, and the money goes straight from the guest to your own Stripe\naccount \u2014 this plugin is never in between and takes nothing.<\/li>\n<li><strong>Searchable archive<\/strong> of everything that has been cleared.<\/li>\n<li><strong>Activity log<\/strong> \u2014 who did what, and when.<\/li>\n<li><strong>Delete-all-data on uninstall<\/strong>, if you tick it. Off by default.<\/li>\n<\/ul>\n\n<h4>BitForgeNet Pro<\/h4>\n\n<p>Pro is a separate plugin, bought from us and installed alongside this one. It\ndoes not unlock anything here \u2014 this plugin is complete on its own. Pro adds\ncapabilities that are not in it at all:<\/p>\n\n<ul>\n<li><strong>Ticket studio<\/strong> \u2014 bring in your own artwork, generate colour variations of\nit, and move every printed field where you want it with a visual field map.<\/li>\n<li><strong>The floor plan editor<\/strong> \u2014 draw the room itself: the stage, curved rows,\nround tables, standing areas, aisles, and a seat numbering that runs whichever\nway your venue counts. Rooms described as a capacity or as named zones are in\nthe free plugin; what Pro adds is drawing one.<\/li>\n<li><strong>The floor, live<\/strong> \u2014 every table and row on one screen while the evening\nfills, and a booking placed at a table by hand or on the plan itself.<\/li>\n<li><strong>Price categories<\/strong> \u2014 VIP, table, early bird, member: several prices on one\nevent instead of one.<\/li>\n<li><strong>Discount codes<\/strong> \u2014 fixed or percentage, limited by date or by number of\nuses.\nPro is announced at https:\/\/bitforgenet.dev\/<\/li>\n<\/ul>\n\n<h4>Reporting a security issue<\/h4>\n\n<p>If you find something, write to the address on\nhttps:\/\/bitforgenet.dev\/ and it will be looked at, fixed and credited here by\nname unless you would rather not be. Please test against your own installation\nrather than somebody else's.<\/p>\n\n<p>Thank you to <strong>Alik<\/strong> for the two issues fixed in 1.2.1.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin stores what a booking needs \u2014 names, email address, phone number \u2014\nin your own database, on your own server. Email goes out through WordPress,\nwhich means through whatever mail service your site already uses. There is no\naccount to create with us and no telemetry: nothing is ever sent to BitForgeNet.<\/p>\n\n<h4>External services<\/h4>\n\n<p>The plugin uses one external service, and only if you set it up yourself.<\/p>\n\n<p><strong>Stripe<\/strong> \u2014 used only when you enter a Stripe secret key under Settings \u2192\nPayments and turn card payment on for an event. Until then no connection to\nStripe is ever made.<\/p>\n\n<p>When a guest chooses to pay by card, the plugin asks Stripe to open a payment\npage and sends what that page has to show: the amount, the currency, the event\ntitle, the booking reference, the number of tickets in each category, and the\nguest's email address so Stripe can send them a receipt. The guest is then\ntaken to a page hosted by Stripe, where they enter their card details. No card\nnumber ever reaches your site or this plugin. Stripe tells your site the result\nin a signed message, and the plugin reads the payment status back from Stripe\nbefore it confirms anything.<\/p>\n\n<p>Stripe is a service of Stripe, Inc.\nTerms: https:\/\/stripe.com\/legal\/ssa\nPrivacy: https:\/\/stripe.com\/privacy<\/p>\n\n<!--section=installation-->\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 5.8 or later<\/li>\n<li>PHP 7.4 or later<\/li>\n<li>The GD extension, for rendering the tickets<\/li>\n<li>A working mail setup on the site \u2014 an SMTP plugin if your host's mail is\nunreliable<\/li>\n<\/ul>\n\n<h4>Steps<\/h4>\n\n<ol>\n<li>Plugins -&gt; Add New, search for <strong>BitForgeNet Guest Tickets<\/strong>, install and\nactivate. Or upload the ZIP under Plugins -&gt; Add New -&gt; Upload Plugin.<\/li>\n<li>Open <strong>BitForgeNet -&gt; Settings<\/strong> and set your currency, your From address\nand your payment instructions.<\/li>\n<li>Open <strong>BitForgeNet -&gt; Tools &amp; data<\/strong>, run the system check, then send\nyourself a test ticket. Do this before your first real booking, not after.<\/li>\n<li>Create your first event with <strong>BitForgeNet -&gt; Events -&gt; New event<\/strong>.<\/li>\n<li>Put the booking form on a page with the shortcode\n   [bitforgenet_registration].<\/li>\n<li>On the night, open <strong>BitForgeNet -&gt; Door scanner<\/strong>, note the door code, and\ngive the link and the code to whoever is on the door.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20there%20a%20limit%20on%20events%2C%20guests%20or%20tickets%3F\"><h3>Is there a limit on events, guests or tickets?<\/h3><\/dt>\n<dd><p>No. Nothing in this plugin is capped or metered, and there is no per-ticket\nfee. What your server can hold is the limit.<\/p><\/dd>\n<dt id=\"do%20guests%20need%20an%20account%3F\"><h3>Do guests need an account?<\/h3><\/dt>\n<dd><p>No. A guest fills in the form, receives their tickets by email, and shows the\nQR code at the door.<\/p><\/dd>\n<dt id=\"does%20it%20need%20woocommerce%3F\"><h3>Does it need WooCommerce?<\/h3><\/dt>\n<dd><p>No. It has its own booking form and its own bookings screen, and it works on a\nsite with no shop on it.<\/p><\/dd>\n<dt id=\"can%20i%20take%20payment%20online%3F\"><h3>Can I take payment online?<\/h3><\/dt>\n<dd><p>Yes, with Stripe, and it is in this plugin \u2014 not in Pro. Put your own Stripe\nsecret key in Settings \u2192 Payments and turn card payment on for the events you\nwant it on. The guest pays on a page hosted by Stripe, no card number touches\nyour site, and the money goes straight to your own Stripe account: this plugin\nis never in between and takes nothing per ticket, ever.<\/p>\n\n<p>Until you enter a key, nothing changes and no connection to Stripe is made. A\nbooking arrives pending and you confirm it once you have been paid \u2014 by\ntransfer, by WhatsApp, or in cash \u2014 exactly as before.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20make%20guests%20pay%20by%20card%3F\"><h3>Do I have to make guests pay by card?<\/h3><\/dt>\n<dd><p>No. It is a choice per event, and you can also let a guest reserve now and pay\nlater: they get both buttons. If you would rather nothing be reserved until it\nis paid for, there is a single setting for that.<\/p><\/dd>\n<dt id=\"does%20one%20booking%20give%20one%20qr%20code%20for%20everybody%3F\"><h3>Does one booking give one QR code for everybody?<\/h3><\/dt>\n<dd><p>No, and that is the point. A booking for five produces five tickets with five\ndifferent codes, each carrying the name of the person it belongs to.<\/p><\/dd>\n<dt id=\"the%20tickets%20are%20not%20arriving.\"><h3>The tickets are not arriving.<\/h3><\/dt>\n<dd><p>The plugin sends through WordPress, so anything that fixes email for the rest\nof your site fixes it here. Run <strong>Tools &amp; data -&gt; System check<\/strong> first: it says\nwhether the failure is in the rendering or in the sending. If your host's mail\nis unreliable, install an SMTP plugin and connect a real mailbox \u2014 it will be\npicked up automatically.<\/p><\/dd>\n<dt id=\"the%20email%20arrives%20but%20the%20pdf%20is%20missing.\"><h3>The email arrives but the PDF is missing.<\/h3><\/dt>\n<dd><p>Your mail server is stripping the attachment. Lower the attachment ceiling in\nSettings; every email already carries a download link per guest, so the guest\nstill gets their ticket.<\/p><\/dd>\n<dt id=\"does%20the%20door%20scanner%20need%20internet%3F\"><h3>Does the door scanner need internet?<\/h3><\/dt>\n<dd><p>It needs to reach your own website, the same as any other page. For the\nevenings when the venue's wifi is not to be trusted, print the roll-call list\nfirst: it carries every guest and every ticket number, and it works on paper.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20install%20an%20app%20on%20the%20door%20phone%3F\"><h3>Do I need to install an app on the door phone?<\/h3><\/dt>\n<dd><p>No. The station is a web page. Open the link in the phone's browser, enter the\ndoor code, and allow the camera.<\/p><\/dd>\n<dt id=\"can%20two%20people%20scan%20at%20once%3F\"><h3>Can two people scan at once?<\/h3><\/dt>\n<dd><p>Yes. Every station checks the same database, so a ticket used at one door is\nalready used at the other.<\/p><\/dd>\n<dt id=\"the%20camera%20stays%20black%20on%20the%20door%20phone.\"><h3>The camera stays black on the door phone.<\/h3><\/dt>\n<dd><p>The page must be served over HTTPS \u2014 browsers refuse the camera otherwise. If\nthe site is already on HTTPS, a security plugin or your CDN is probably sending\na blanket camera policy; the scanner screen re-states its own, so clearing the\nCDN cache usually settles it.<\/p><\/dd>\n<dt id=\"can%20i%20use%20my%20own%20ticket%20artwork%3F\"><h3>Can I use my own ticket artwork?<\/h3><\/dt>\n<dd><p>The free plugin generates its design for you, in the colour you choose.\nBringing in your own artwork and placing the printed fields yourself is what\nthe ticket studio in BitForgeNet Pro does.<\/p><\/dd>\n<dt id=\"can%20i%20clear%20the%20test%20bookings%20before%20going%20live%3F\"><h3>Can I clear the test bookings before going live?<\/h3><\/dt>\n<dd><p>Yes. <strong>Tools &amp; data -&gt; Archive and clear<\/strong> copies every booking, guest, ticket\nand scan into archive tables and then empties the live ones. Events, venues,\norganizers and designs are untouched. It asks for a one-time code sent to an\naddress you set, so it cannot be run by accident.<\/p><\/dd>\n<dt id=\"is%20it%20translated%3F\"><h3>Is it translated?<\/h3><\/dt>\n<dd><p>Every string in the plugin is translatable. Translations are welcome at\nhttps:\/\/translate.wordpress.org\/projects\/wp-plugins\/bitforgenet-guest-tickets\/<\/p><\/dd>\n<dt id=\"where%20do%20i%20get%20help%3F\"><h3>Where do I get help?<\/h3><\/dt>\n<dd><p>The support forum on this page, or contact@bitforgenet.dev<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.1<\/h4>\n\n<p>Two security fixes, both reported responsibly by <strong>Alik<\/strong>, who tested 1.0.9 in\nan isolated environment and sent a clear, accurate write-up of each. Both were\nreal. Thank you.<\/p>\n\n<p><strong>Bookings for one event now happen one at a time.<\/strong> Counting the free seats\nand taking one were two separate steps, and between two steps another request\nfits: two people clicking at the same instant could both be told there was one\nseat left, and both take it. The capacity check was never wrong -- it was just\non the wrong side of a gap. That gap is now closed with a lock held for the\nlength of a booking, per event, so a busy night with four events does not queue\ninto one line. Every capacity rule is now inside it: the event's own capacity,\neach price category, and each area of the room. (CWE-362.)<\/p>\n\n<p><strong>Forwarding headers are no longer believed by default.<\/strong> The plugin recognises\na visitor by their address in order to count how often they book. It used to\nread CF-Connecting-IP, X-Real-IP or X-Forwarded-For if they were present --\nbut those are written by whoever is making the request, so anybody could invent\none and get a fresh allowance. Only the address the connection actually came\nfrom is used now. If your site really is behind Cloudflare or a reverse proxy,\nsay so under Settings \u2192 Anti-abuse, and the panel shows you what your server is\nactually sending so the choice is not a guess. Naming your proxies in\nwp-config.php as BFNET_TRUSTED_PROXIES narrows it further. Where a list of\nforwarded addresses is read, the plugin now takes the entry the nearest proxy\nwrote rather than the one at the front, which is the one a visitor can invent.\n(CWE-799.)<\/p>\n\n<p><strong>Also<\/strong>: a second booking limit counted per email address, so getting around\nthe per-connection one is no longer enough on its own.<\/p>\n\n<h4>1.2.0<\/h4>\n\n<p>Everything below arrived since 1.0.9. It was built and tested over several\ninternal builds; this is the first of them anyone is offered, because a version\nthat was superseded the same week is not a version worth installing.<\/p>\n\n<p><strong>Rooms and places.<\/strong> An event can now describe where people sit. Three levels,\nand nobody is made to climb them: a plain capacity, named zones with a capacity\nand a price each, or -- with Pro -- a drawn floor plan. Seats are worked out\nfrom a rule rather than stored, so a four thousand seat auditorium is twenty\nrows in your database and not four thousand. The numbering runs whichever way\nyour venue counts: left to right, right to left, odd and even out from the\ncentre, alternating by row. It can skip row I and O, skip 13, start anywhere,\nand carry a prefix.<\/p>\n\n<p><strong>Card payment with Stripe.<\/strong> Set your own secret key and a guest can pay on\nStripe's own page. No card number reaches your site. A payment is confirmed by\nreading it back from Stripe and by a signed message Stripe sends your site --\nnever by the browser that came back. Your places are held for the length of the\npayment session and released on their own if nobody finishes, so the same seat\ncannot be sold twice. Card payment is optional, per event: an evening paid at\nthe door works exactly as it did before.<\/p>\n\n<p><strong>When the ticket goes out, per event.<\/strong> Acknowledge the booking now and send\nthe ticket once you have decided where somebody sits, or -- when the event has\na room -- send it straight away with the place printed on it.<\/p>\n\n<p><strong>The booking page no longer depends on a page.<\/strong> If a direct link to an event\nhas nowhere to open, the plugin renders the booking form itself inside your\ntheme. It also creates the booking page for you, once, rather than leaving a\nlink that opens nothing.<\/p>\n\n<p><strong>Fixed<\/strong><\/p>\n\n<ul>\n<li>A booking link opened an empty page on sites that had never added the\nshortcode themselves.<\/li>\n<li>Guest rows two and after on the manual booking screen were greyed out instead\nof hidden, because the plugin's own stylesheet beat the browser's rule.<\/li>\n<li>The Reserve button was clipped by themes with their own line height.<\/li>\n<li>Sold-out categories were still offered for booking; a category is now closed\nby the room as well as by its own capacity, and the last place is re-counted\nat the moment the booking is written rather than only when the page was\ndrawn.<\/li>\n<li>Reverting a booking to awaiting payment cleared the check-ins but kept them\nin the history, named.<\/li>\n<\/ul>\n\n<p><strong>Also added<\/strong><\/p>\n\n<ul>\n<li>Add a guest by hand, for the bookings that arrive by phone.<\/li>\n<li>A live floor view of the evening -- what is taken, what has arrived, and what\nis full -- with the room drawn as the organizer drew it.<\/li>\n<li>The confirmation screen says which address the email went to, and to look in\nthe spam folder.<\/li>\n<li>Keyboard in the plan editor: undo, redo, delete, escape, shift to select\nseveral, and a number beside every slider.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>The logo printed on the ticket, on the door's code screen and beside an\norganizer with no artwork of its own is the anvil alone. It had been the full\nlockup, wordmark included, which the renderer fits inside its box: a wide\nimage with words in it shrank to a smudge nobody could read<\/li>\n<li>The plugin's page is rewritten. The feature list now says what this plugin\nactually does -- the organizer and venue libraries, the export column picker,\nthe system check and the archive were all shipped and none of them were\nmentioned, while three of them were wrongly described as belonging to Pro.\nThe Pro section says what Pro adds instead of hinting at it, and the FAQ\nanswers fifteen questions rather than five. No code changed for this<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Every template under admin\/views\/ and public\/views\/ states once, at the top of\nthe file, that the PrefixAllGlobals naming rule does not apply to it. A\ntemplate is included from a method, never at file scope, so its variables\nbelong to that method's scope rather than the global one, and PHPCS -- reading\neach file on its own -- has no way to see where the include happens. No\nvariable was renamed and nothing behaves differently<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>The plugin is renamed. It was submitted as \"2KEvents\", and \"2K\" is a\nregistered trademark of Take-Two Interactive that we have no right to lead a\nname with. The display name, the slug, the text domain, the shortcodes and\nevery PHP prefix now read BitForgeNet \u2014 the name of the site that publishes\nit, bitforgenet.dev<\/li>\n<li>Every stylesheet and script the plugin prints goes out through the enqueue\nAPI. The door station and the two screens around it are their own HTML\ndocuments, served on their own endpoint before the theme runs, so they had\ncarried their CSS and JS inside the page. They now register handles and print\nthem by name, the two runtime values arriving through wp_add_inline_style()\nand wp_add_inline_script()<\/li>\n<li>The admin menu icon is assembled from the mark at runtime and has no file\nbehind it, so it registers a style handle with no source rather than printing\na style tag into the head, and moves to admin_enqueue_scripts<\/li>\n<li>The code prefix is five characters. It was three, which is under the four the\ndirectory asks for<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Finished the tidy-up the last two releases started: every code-quality\nsuppression in the plugin is now either stated once for a whole file or\nwritten on the single line it covers, and none of them can change the\nmeaning of another one elsewhere in the same file. No behaviour changes<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Fixed suppression comments that did not cover what they appeared to cover.\nOne kind switched every code-quality rule back on rather than the one it had\nswitched off, quietly undoing notes written elsewhere in the same file; the\nother sat above a nine-line statement instead of around it. No behaviour\nchanges for anyone using the plugin<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Request input is now read the way it should be read: eight admin screens\napplied the integer cast to the whole expression rather than to the value,\nand the export column list is sanitised where it arrives rather than three\ncalls later<\/li>\n<li>The design proof screen now checks its parameter exists before reading it<\/li>\n<li>Every file that queries the plugin's own tables says so once, at the top,\nwith the reason<\/li>\n<li>Dropped a call asking WordPress to load translations it already loads by\nitself, and closed a hatch that let the QR encoder run outside WordPress<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fixed translatable strings that a translator could not have got right. The\nguest counter on an order wrote its two numbers as bare placeholders, which\na language that reorders the words has no way to move, and several strings\ncarrying a placeholder had no note saying what the placeholder holds.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>The plugin header pointed at a placeholder address. It now points at the\nplugin's own page, and the author is named.<\/li>\n<li>The address authorised to reset the plugin's data shipped with a developer's\nown address already filled in. It now starts empty, and the tool refuses to\nrun until an administrator sets one.<\/li>\n<li>Added the full text of the SIL Open Font License beside the bundled Poppins\nand Lora fonts, as that licence requires.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed the door station refusing every scan with \"Station closed\". The page\nopened and showed the event, but each scan was posted to an address that no\nlonger said which event the station was watching, so the server treated it as\na station that had signed out. Nobody could be checked in<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Name every guest, send each one a personal QR ticket as a PDF, and scan them in at the door from a phone. Unlimited events and tickets. No fees.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/361265","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=361265"}],"author":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/bitforgenet"}],"wp:attachment":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=361265"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=361265"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=361265"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=361265"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=361265"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=361265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}