{"id":347768,"date":"2026-08-14T11:09:49","date_gmt":"2026-08-14T11:09:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/gil-waiting-room\/"},"modified":"2026-08-14T11:09:27","modified_gmt":"2026-08-14T11:09:27","slug":"gil-waiting-room","status":"publish","type":"plugin","link":"https:\/\/fa.wordpress.org\/plugins\/gil-waiting-room\/","author":15127888,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.1","stable_tag":"2.0.1","tested":"7.0.4","requires":"5.9","requires_php":"7.4","requires_plugins":null,"header_name":"GIL Waiting Room","header_author":"Mateus Getulio Vieira","header_description":"A virtual waiting room for WordPress. Caps concurrent visitors at a configurable limit and places everyone else in a FIFO queue with live position updates.","assets_banners_color":"213c57","last_updated":"2026-08-14 11:09:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/mateusgetulio\/GIL","header_author_uri":"https:\/\/mateusgetulio.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":25,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.0.1":{"tag":"2.0.1","author":"mateusgetulio","date":"2026-08-14 11:09:27"}},"upgrade_notice":{"2.0.0":"<p>Complete rework. The queue table is rebuilt on activation; settings are preserved.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3647241,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3647241,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3647241,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3647241,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3647205,"resolution":"1","location":"assets","locale":"","width":2560,"height":1600},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3647205,"resolution":"2","location":"assets","locale":"","width":2560,"height":1800}},"screenshots":{"1":"The waiting room lobby with live position and estimated wait.","2":"The settings page with live queue status."}},"plugin_section":[],"plugin_tags":[268114,240864,4645,493,203071],"plugin_category":[55],"plugin_contributors":[275703],"plugin_business_model":[],"class_list":["post-347768","plugin","type-plugin","status-publish","hentry","plugin_tags-capacity","plugin_tags-high-traffic","plugin_tags-queue","plugin_tags-traffic","plugin_tags-waiting-room","plugin_category-seo-and-marketing","plugin_contributors-mateusgetulio","plugin_committers-mateusgetulio"],"banners":{"banner":"https:\/\/ps.w.org\/gil-waiting-room\/assets\/banner-772x250.png?rev=3647241","banner_2x":"https:\/\/ps.w.org\/gil-waiting-room\/assets\/banner-1544x500.png?rev=3647241","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/gil-waiting-room\/assets\/icon-128x128.png?rev=3647241","icon_2x":"https:\/\/ps.w.org\/gil-waiting-room\/assets\/icon-256x256.png?rev=3647241","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/gil-waiting-room\/assets\/screenshot-1.png?rev=3647205","caption":"The waiting room lobby with live position and estimated wait."},{"src":"https:\/\/ps.w.org\/gil-waiting-room\/assets\/screenshot-2.png?rev=3647205","caption":"The settings page with live queue status."}],"raw_content":"<!--section=description-->\n<p>What happens when a sale, a campaign, or a viral post sends more visitors than your server can comfortably handle?<\/p>\n\n<p>GIL Waiting Room creates a virtual waiting room in front of your site. You choose how many visitors may browse at the same time; everyone above that limit is placed in a fair, first-come-first-served queue and sees a clean lobby page with their live position and an estimated wait. As soon as a spot opens, the next visitor in line is admitted automatically, no refresh or action needed.<\/p>\n\n<h4>How it works<\/h4>\n\n<ul>\n<li>Each visitor gets a signed, HttpOnly cookie so their place in line survives reloads and short absences.<\/li>\n<li>Admission is atomic at the database level, so the limit holds even under bursts of concurrent traffic.<\/li>\n<li>Admitted visitors keep their spot for a session length you configure; when it expires, the spot goes to the next person in line.<\/li>\n<li>The lobby page polls a lightweight status endpoint every few seconds, shows live progress, and lets the visitor in the moment they are admitted.<\/li>\n<li>The lobby adapts to the visitor's light or dark system theme, respects reduced-motion preferences, and announces progress to screen readers.<\/li>\n<li>Preview the waiting room from the settings page before enabling it, and watch live admitted\/waiting counts during a spike.<\/li>\n<li>The lobby is served with HTTP 503 and a Retry-After header, so search engines understand the site is temporarily busy and do not index the lobby.<\/li>\n<li>Administrators are never gated, so you cannot lock yourself out.<\/li>\n<\/ul>\n\n<h4>What this plugin is not<\/h4>\n\n<p>GIL Waiting Room manages capacity, it is not DDoS protection. Requests still reach PHP; the plugin decides who may browse. If you are under attack, you need protection at the network or CDN layer.<\/p>\n\n<p>If a full-page cache or CDN serves your pages without hitting PHP, those cached hits cannot be queued. The waiting room works for requests that reach WordPress.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/<\/code>, or install it through the WordPress plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open the \"GIL Waiting Room\" menu in your admin sidebar.<\/li>\n<li>Set the concurrent visitor limit and session length, then enable the waiting room.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20waiting%20room%20apply%20to%20wp-admin%20or%20the%20login%20page%3F\"><h3>Does the waiting room apply to wp-admin or the login page?<\/h3><\/dt>\n<dd><p>No. Only the front end is gated. Administrators are also exempt on the front end.<\/p><\/dd>\n<dt id=\"can%20visitors%20skip%20the%20line%20by%20clearing%20cookies%3F\"><h3>Can visitors skip the line by clearing cookies?<\/h3><\/dt>\n<dd><p>Clearing cookies discards the visitor's identity, so they re-enter at the back of the line. The cookie is signed, so it cannot be forged to gain admission.<\/p><\/dd>\n<dt id=\"how%20is%20the%20estimated%20wait%20calculated%3F\"><h3>How is the estimated wait calculated?<\/h3><\/dt>\n<dd><p>It is a simple upper-bound estimate: your position divided by the visitor limit, times the configured session length.<\/p><\/dd>\n<dt id=\"where%20is%20the%20queue%20stored%2C%20and%20can%20i%20reset%20it%3F\"><h3>Where is the queue stored, and can I reset it?<\/h3><\/dt>\n<dd><p>In a dedicated database table. The settings page shows live admitted and waiting counts and has a button to clear the queue.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20collect%20any%20personal%20data%20or%20contact%20external%20servers%3F\"><h3>Does the plugin collect any personal data or contact external servers?<\/h3><\/dt>\n<dd><p>No. The plugin makes no external requests of any kind, includes no analytics, and collects no personal data. The visitor cookie contains only a random identifier and a signature, nothing identifying, and the queue table stores that identifier with timestamps. Uninstalling removes the table and all plugin options.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20caching%3F\"><h3>Does it work with page caching?<\/h3><\/dt>\n<dd><p>Only requests that reach PHP can be queued. If a full-page cache or CDN answers a request by itself, the waiting room never sees it.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>The lobby page now loads its CSS and JavaScript through wp_enqueue_style() and wp_enqueue_script() instead of inline blocks.<\/li>\n<li>Fixed the lobby favicon, which was stripped and rendered as an empty reference.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Complete rework of the admission engine: atomic admission under a database lock, FIFO promotion, and a fatal-error fix at exact capacity.<\/li>\n<li>Visitor identity moved from PHP sessions to a signed, HttpOnly cookie.<\/li>\n<li>New lobby page: self-contained, served with HTTP 503 and Retry-After, polls a REST status endpoint and admits automatically.<\/li>\n<li>Administrators are never gated.<\/li>\n<li>Queue clearing is now nonce-protected; settings are validated server-side.<\/li>\n<li>All external assets removed; everything ships with the plugin.<\/li>\n<li>Redesigned lobby (light\/dark themes, progress bar, reduced-motion and screen-reader support) and settings page (live-updating counts, status line, lobby preview).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"A virtual waiting room for WordPress. Caps concurrent visitors at a limit you choose and queues everyone else with live position updates.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/347768","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=347768"}],"author":[{"embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mateusgetulio"}],"wp:attachment":[{"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=347768"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=347768"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=347768"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=347768"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=347768"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=347768"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}