| 开发者 | macvej |
|---|---|
| 更新时间 | 2026年10月5日 05:22 |
| PHP版本: | 8.0 及以上 |
| WordPress版本: | 7.1 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
/table-check-in/. Full screen, no admin bar, nothing for door staff to get lost in.manage_woocommerce; nobody needs an Administrator account to run service./wp-content/plugins/ over FTP. Activate from the Plugins screen with WooCommerce already active. Activation creates the plugin's database tables and refreshes permalinks, so the scanner URL works straight away.
2. Create a venue
Products > Add New, then pick Booking venue from the Product data dropdown - the same dropdown that holds Simple and Variable.
3. Draw the floor plan
On the Floor plan tab, upload a picture of the room and draw the tables or seats on it. Give each one a label, a price and a capacity.
4. Set the booking times
On the Booking times tab, add the weekly timeslots and any closed dates. Publish, and customers can book from the product page.
5. Give door staff access
Edit the user under Users and set their role to Scanner. They can then open /table-check-in/ on a phone and check guests in, and see nothing else in wp-admin. Administrators and Shop Managers already have access.
Settings at a glance
Settings live under Seats & Tables > Settings in three tabs. The defaults work; only change what you need.
Yes. The plugin adds a WooCommerce product type and will not activate without WooCommerce active.
No. There is no external service and nothing to sign up for. You sell through your own WooCommerce checkout, and what you charge is what you keep.
No. Adding a table to the cart creates a short-lived hold on that exact table, date and timeslot, enforced by a unique index in the database, so the second of two racing customers is told the table has just gone. Holds that are never paid for expire on their own.
The site's timezone, as set under Settings > General. Timeslots, booking dates, the booking notice and the check-in window all use it.
The hold expires after the configured number of minutes (15 by default) and the table is bookable again. If the customer comes back to a cart with an expired hold, the line is removed and they are told why. Removing a line and pressing "Undo" takes the hold again if the table is still free.
Its tables are released after the window set under Seats & Tables > Settings (60 minutes by default), the order is cancelled and a note is added to it. Orders on hold awaiting a bank transfer are never released automatically.
When the payment goes through, and when you mark an order Completed by hand. Processing on its own is not enough, because cash on delivery sets that status before anyone has paid. If your shop takes bank transfers and you set orders to Processing yourself once the money lands, add this to your theme's functions.php to issue the codes at that point too:
add_filter( 'stbk_issue_codes_on_processing', '__return_true' );
Do not use it on a shop that also offers cash on delivery: those orders reach Processing unpaid, and the plugin cannot tell the two apart afterwards.
No. Expired holds are treated as free the moment they expire; the five-minute WP-Cron event only tidies the rows up. The unpaid-order release runs on that event too, so on a site where WP-Cron is disabled it runs whenever the system cron calls wp-cron.php.
Yes. Open Seats & Tables > Bookings, pick the venue and the date, and press "+ Block" in the empty cell for that sitting. The table disappears from the floor plan for that sitting until the block is released.
No. The scanner is a web page that uses the phone camera. It needs a browser and HTTPS, which is what the camera API requires.
Users with the Scanner role, and users with the manage_woocommerce capability, which covers Administrators and Shop Managers. A Scanner user cannot see orders, products or the dashboard.
A cancelled code, a code already used, and a code scanned outside its check-in window. The reason is shown on screen.
Yes, once you turn on Enable API under Seats & Tables > Settings > Scanner / API - it is off by default. The app authenticates with a WordPress Application Password and calls stbk/v1/scanner/checkin/{id} the same way the built-in scanner does. The settings page documents every response.
A real account password is not accepted, and the site must be on HTTPS, because that is what WordPress itself requires before it will accept an Application Password. The built-in scanner is unaffected either way; it uses the staff member's own login.
Staff can resend it from the Bookings screen. The code is also on the thank-you page and in the order details under My Account, so a signed-in customer can pull it up there.
The add-to-cart and scanner-login limits count requests per visitor IP, taken from REMOTE_ADDR only. Forwarded headers are ignored, because any caller can forge them. Behind a proxy, configure the web server to put the real client address into REMOTE_ADDR (Apache mod_remoteip, nginx real_ip, or Cloudflare's own instructions), trusting only the proxy's addresses. Otherwise all visitors share one limit. If the server cannot be changed, the stbk_client_ip filter can return the verified address instead.
Yes. The plugin declares compatibility with WooCommerce High-Performance Order Storage and reads and writes orders only through the WooCommerce order API. It works with the Cart and Checkout blocks and with the classic shortcode cart and checkout.
Settings, the Scanner role and the scheduled event are removed. Bookings, floor plans and QR data are kept, so removing the plugin to test a conflict cannot wipe your reservations.
If you do want all of it gone, add this to wp-config.php before you delete the plugin:
define( 'STBK_REMOVE_ALL_DATA', true );
That drops the plugin's database tables and deletes the generated QR images. It cannot be undone. Take a backup first.
No. Settings and bookings are left alone, and reactivating picks up where you left off.
changelog.txt in the plugin folder.
1.9.1
REMOTE_ADDR only. Forwarded headers are ignored because any caller can forge them. Behind a proxy, see the new FAQ entry, or return the verified address from the new stbk_client_ip filter.changelog.txt.