| 开发者 | gsheetplugins |
|---|---|
| 更新时间 | 2026年10月9日 03:24 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.1 |
| 版权: | GPL-2.0-or-later |
| 版权网址: | 版权信息 |
[gsma_user_info].[gsma_login_form] shortcode, instead of WordPress's default login screen.GDLINK1 field. The separate Mailchimp and EmailOctopus settings-card buttons save the card and sync the full roster only to that provider.
Pro and Chapters check the required Free features before loading their modules, so an add-on update arriving first through Freemius can keep working with compatible older Free versions. Unsupported combinations pause with an admin notice, preserve saved settings, and resume automatically after a compatible Free update. New optional functionality can require a newer Free version without pausing an otherwise compatible add-on.
membership-google-sheets folder to /wp-content/plugins/ (or upload the ZIP under Plugins → Add New → Upload Plugin).name@project.iam.gserviceaccount.com) as an Editor (required for the Sales feature and the Pro add-on's Group Email; Viewer is enough if you only use page protection). The sheet stays private to everyone else.GOLD, PLATINUM)./d/ and /edit) |
| Sheet (Tab) Name | Optional. Leave blank to use the spreadsheet's first tab automatically. |
| Email Column | Column letter containing email addresses (default: A) |
| Membership Code Column | Column letter containing membership codes (default: B) |
| Header Row Number | Row number of the header; data starts on the next row (default: 1) |
| Cache Duration (seconds) | How long to keep the encrypted whole-roster cache in WordPress options (default: 300). Set 0 to disable roster caching. |
| Expiration Mode | Daily (individual dates), Monthly, or Annual (covered-to year). |
| Warning Window (days) | Days before expiration to start showing members a renewal warning (default: 14) |
| Grace Period | Continued access after expiration: days in Daily mode; calendar months in Monthly and Annual modes. |
| Expired-Access Message | Message shown once a membership has expired and the grace period has passed |
| Login Redirect URL | Where to send unauthenticated visitors trying to access a restricted page |
| Access-Denied Redirect URL| Where to redirect logged-in users without the required membership |
| Access-Denied Message | Message to display instead of redirecting (if no redirect URL is set) |
| Access Control Match Mode | Exact match, or "letters mode," where the member's code must contain every letter in the required set |
| Custom Login Page | The WordPress page containing [gsma_login_form]; leave on Auto-detect to let the plugin find it, or fall back to WordPress's default login page |In Recent Purchases, choose Reconcile and then "Abandon a sandbox test purchase". Verify the original transaction in the payment provider's test or sandbox environment, confirm that no real funds were charged, and confirm that any test roster changes have been removed or reversed without deleting a legitimate membership. Record a short note and mark it reconciled. This permanently prevents another fulfillment attempt for that payment without claiming a refund or a completed membership, and does not approve an email addition. Known live transactions cannot use this shortcut: a real-money purchase made for testing still needs a completed full refund or the correct fulfilled membership. Original errors and email-status notes remain available in expandable details instead of an active failure warning.
No — never. You only share it with the service account email address. It remains completely private to all other users.
The OpenSSL extension is needed to sign the JWT for authentication. It is enabled by default on virtually all shared and managed WordPress hosts (including WP Engine, Kinsta, SiteGround, Flywheel, and others).
No. Users with the manage_options capability always bypass all membership checks.
It is stored in your WordPress database (the wp_options table). With OpenSSL available, the plugin encrypts it using this installation's security salts; if encryption is unavailable, the credential-saving routine can retain plaintext rather than replace a working credential with unusable ciphertext. Check the encryption status on the Access settings screen. It is never sent to the browser or written to a file by the plugin. Keep the salts and database backups secure.
After the encrypted whole-roster cache expires (default 5 minutes / 300 seconds), the next read fetches fresh data and writes a newly encrypted payload. Reduce the cache duration in settings or click Clear Cache to force the next read to refresh.
The plugin logs an error and denies access as a safe default. Use Save & Test Main Roster in settings to verify connectivity.
This works for any member already on the roster, whether they got there through the plugin's own purchase pathway or not — a name typed in manually, imported from a spreadsheet, added after a mailed-in check, however your roster is maintained. The sign-in flow doesn't care how someone became a member, only that their email is on the sheet. It's part of the free plugin. There's no separate account-creation step. A member enters their email, and what happens next depends on whether they've signed in before:
With the GSheet Membership Pro add-on, you can connect a real mailbox (Google sign-in or an App Password) on the main settings page and route login verification codes, purchase confirmations and gift notices through it. A rejected verification code falls back to the site's normal mailer. Group Email can also use the authenticated mailbox for batched sending, or use Mailchimp for campaign delivery. Correctly configured mailbox authentication can improve deliverability; it does not guarantee that messages avoid spam filters.
With the GSheet Membership Pro add-on, the Group Email page in Membership Access lets you compose a message and send it to your roster — everyone, or a subset filtered by membership code. Delivery can use the site's batched mailer (including an authenticated mailbox) or a connected Mailchimp audience. Mailchimp can sync the filtered audience before a classic-mode send or target a segment of the synced full roster. Chapter sites send Group Email to their local chapter roster only, even if their access checks also include the main roster. Direct delivery and Mailchimp campaigns have different unsubscribe and reporting behavior; Pro includes send history and delivery reports. There are two ways to trigger a send: filling out the compose form yourself, or Email-in — forwarding a single email to a dedicated mailbox, covered next.
Email-in is the second way to send a Group Email: instead of the compose form, you forward a message to a dedicated mailbox (e.g. blast@example.org). The plugin checks that mailbox on a schedule (IMAP); a message from an authorized sender that meets the subject-keyword rule is queued under the same audience rules as the compose form. The configured delivery method determines whether it goes through site mail or Mailchimp.
imap.gmail.com, port 993, the mailbox address as username, and the App Password.The From: address of an email can be forged (spoofing) — an allowlist alone is not sufficient protection for something that can email your whole membership. The required subject keyword adds a second check; keep it private and choose a non-obvious phrase. The keyword is stripped from the subject before delivery. This does not replace mailbox security or prevent an attacker who learns the keyword from sending a forged message.
Meeting notes [codes: GOLD,SILVER]. The tag is removed before delivery. Without a tag, the membership code filter saved on the Group Email page is applied; if that filter is blank, all members receive the message. Works on both main and chapter sites.The Sales half of GSheet Membership puts a configurable buy-membership picker on any page and, on a successful payment, writes (or updates) the buyer's row in your private Google Sheet so they can immediately log in on your site.
0 for a free membership that skips the gateway; leave a cell blank to make that combination unavailable.gsms_purchase_email_vars and adjust the rendered confirmation body with gsms_confirmation_body.[gsms_admin_picker] shortcode lets a site administrator apply a membership directly to the sheet without taking a payment, perfect for comp memberships, cheque / cash-in-hand orders, or back-filling an old purchase.openssl, hash, and mbstring extensions (already enabled on every major WordPress host).[gsma_membership_purchase] — that is the buy page.[gsma_user_info] on it (that shortcode shows the buyer's status with an inline login form when they're not yet signed in). Select that page on the Settings sub-page under Thank-you page.[gsma_login_form] — renders the sign-in form (email, then a first-time verification code or a returning password) on the page you choose as the Custom Login Page. Independent of the Sales feature — every site can use it.[gsma_membership_purchase] — renders the full picker (Delivery × Duration × Postage) with live total and the Buy membership button. Place this on the page where you want to take payments.[gsms_admin_picker] — admin-only variant of the picker that applies a membership directly to the sheet without any payment. Only site administrators (manage_options) see it; everyone else sees a polite notice.[gsma_user_info] — place it on the thank-you page so buyers see their membership status (and an inline login form when they aren't logged in).0 for a free membership; leave it blank to make that combination unavailable. The Membership Levels block above the grid lets you choose which levels are currently offered for purchase.Stripe Connect (free plugin): On the Payments page, click Connect with Stripe and complete Stripe's hosted onboarding. No Stripe API keys or direct webhook signing secret are entered in the free plugin; payment confirmations are relayed through the hosted Connect service. Direct Stripe API keys (Pro add-on only): If you choose Pro's own-key mode instead of Connect, configure separate Test/Live keys on the Payments page and register its direct webhook:
/wp-json/gsma-sales/v1/stripe-webhook).checkout.session.completed.whsec_...) into Pro's matching webhook field for that mode./wp-json/gsma-sales/v1/paypal-webhook).CHECKOUT.ORDER.APPROVED and PAYMENT.CAPTURE.COMPLETED.The picker can be exercised without a payment gateway. A price of 0 also completes a free membership without sending the buyer to Stripe or PayPal.
TEST).pk_test_... and sk_test_... keys, and register the test-mode direct webhook as described above. The free Connect setup does not offer a Test/Live switch in the WordPress settings; do not use a test card against a live connected account.paid from Stripe and inserted (or updated) for the sheet.The first delivery is processed normally. Any duplicate of the same event is identified and returns HTTP 200 with status: duplicate without writing to the sheet. Two concurrent deliveries for the same event are serialized via an atomic per-event lock; the loser receives HTTP 409 so the gateway retries it. From 1.7.13 each processed event is stored as its own wp_options row with a 72-hour TTL — there is no fixed-size eviction window that could cause old-but-recent events to fall off and be reprocessed.
The plugin returns HTTP 500 to the gateway (so it retries delivery automatically), records a "failed" entry on the Recent Purchases page, and shows a persistent admin notice while failures remain unresolved. The buyer confirmation email is not sent for a failed write — only a successful upsert triggers it. Pro offers a manual retry for safe failures. If the result of an earlier write is uncertain, use Reconcile to compare the original payment and intended membership before confirming an already-corrected outcome; do not renew again blindly. Reconciliation itself does not send a receipt, charge, refund, approve an email change or write the roster.
No. The gateway has captured the payment regardless of what happens on your site. Recoverable sheet failures can catch up through retries, but an uncertain prior write is deliberately blocked to avoid renewing twice and needs administrator review through Reconcile.
Yes. Renewals extend the existing expiration date forward, so an early renewal never shortens the buyer's coverage. A lifetime purchase clears the expiration cell entirely.
The cancelled checkout row is kept visible in Recent Purchases for auditing, but it never blocks a retry. If the gateway somehow delivers a capture event for an order the cancel handler already marked cancelled, the finalisation pipeline now detects and recovers that row automatically rather than treating it as already-done.
It depends on how you take card payments:
gsms_purchase_email_vars and gsms_confirmation_body purchase-confirmation filters so integrations can provide purchase-specific itemization while preserving the configured template.access_match_mode to the public, read-only pricing contract consumed by Chapters sites.