| 开发者 | mashdunllc |
|---|---|
| 更新时间 | 2026年10月19日 01:34 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.1 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
frame-ancestors) on any site the business has not proven is its own. A signing page inside another site's frame is a clickjacking target, and the thing being clicked is a signature. So the block, the shortcode and the forms send the signer to SignSealer's own page, where they can see whose address bar they are signing on. The frames are where signing comes first, on this site: WooCommerce's Before payment, a form set to be signed before it is sent, and Amelia's and Simply Schedule Appointments' signing before the booking. Connecting the plugin proves the site to SignSealer, which is what lets its signing page be shown here.
What it does
signsealer_event action your own code can hook.[signsealer_sign workflow="your-form"] if you prefer a shortcode.add_action( 'signsealer_event', function ( $event, $payload ) { if ( 'signing.completed' === $event ) { // $payload['document']['id'] has signed. } }, 10, 2 );
The signature is checked before this fires, so a handler can trust what it is handed.
Once a document completes, its signers' answers to your form's questions
are handed to signsealer_document_completed, asked for from SignSealer
just after the delivery. This plugin stores none of them; what your own code
does with them is up to it:
add_action( 'signsealer_document_completed', function ( $document ) { if ( 'Yes' === ( $document['answer']['married'] ?? '' ) ) { // "Are you married?" was answered Yes. } } );
$document['answer'] has one value per question, by the question's key; a
tick box is Yes or No. A question more than one person answered (two
signers, each person in a party) holds every different answer, sorted and
joined with a comma: Yes means everyone said Yes, No, Yes that they
differed. answers_text is every answer,
one line each, for an email; answers has each one with who gave it.
Sensitive answers are masked, as your staff see them. To ask for a
document's answers yourself: signsealer_get_answers( $document_id ).
It runs from WP-Cron, so on a site that runs WP-Cron from the server it
waits for the next run.
Two reasons. Before SignSealer connects a site it fetches a small page the plugin serves, to check the plugin is really running there and that the request came from this site; it will only do that over https, so nobody can register an application in your site's name. And once connected, SignSealer posts signed statuses back to your site, which must also be over https so those deliveries are private and verifiable.
Yes. This plugin talks to the SignSealer API; it is not a standalone signing tool.
On SignSealer, with its certificate and audit trail. This site keeps the document's id and its status so a page can say whether it is signed.
No, and that is deliberate. See "Three things this plugin refuses to do" above.
Not unless you ask it to. Under SignSealer → Settings → The sign button there is a setting, off by default, that puts a small "Signed with SignSealer" line under the signing button block and the [signsealer_sign] shortcode, linking to signsealer.com. Only a button to your own business's form gets it: nothing else the plugin shows, and not a shortcode pointed at another business. A business with white label is not offered it.
Nothing at SignSealer. Your documents, evidence and certificates are unaffected. Deactivating does not revoke the connection — end that in SignSealer under Developers → Connected apps.
Yes. On a product's edit screen, under General, choose the SignSealer agreement that product needs. When an order containing it is paid — or placed, under WooCommerce → Settings → SignSealer — the document is started for the customer, offered on the thank-you page, in their order email and under My Account, and its status appears on the order screen and in the order notes as SignSealer reports it. Works whether your orders live in posts or in WooCommerce's own order tables.
Yes. Under WooCommerce → Settings → SignSealer choose Before payment. While a customer's cart holds a product whose agreement is unsigned, the cart's checkout button reads Sign the agreement and goes to a page of your site, in your theme, that shows SignSealer's signing page in a frame; a customer who reaches the checkout some other way is sent back to it. The classic checkout and the checkout block both refuse to place the order until SignSealer confirms it is signed, and the order then carries that signed document. SignSealer shows its signing page in a frame only on sites the business has proven, and the site you connected is one.
A template blank that nothing fills — {{location}} on a photo release, say — would make SignSealer refuse to start the document. So on the product's edit screen, under its SignSealer agreement, each such blank has a box: fill it in to answer it for every order of that product, or leave it empty and the customer is asked. Before payment they are asked on the signing page, beside their name and email. After payment the order's Sign link — on the thank-you page, in the order email and under My Account — opens a page of your site that asks, and the agreement is sent once they have answered. The order notes say when an agreement is waiting for that.
Yes. A bookable product is a product, so mark it the same way. A booking you confirm starts its agreement at once, whether or not it has been paid, because the agreement is wanted before the day. The booking's date, time, number of people and resource go to the template as booking_date, booking_time, persons and resource, and the booking's own screen shows where the agreement stands.
Yes, since 1.8.0. Open SignSealer → Bookings, which lists the services in each (in Simply Schedule Appointments, its appointment types), and choose the workflow a booking of each starts. A booking made through the plugin's booking form, or by staff, starts that workflow for the person who booked, and SignSealer emails them the link; LatePoint's confirmation step shows a button to sign too. Since 1.16.0 the person signs on the page in the other two as well. Amelia's booking form opens the agreement over itself when the person presses Book, and makes the booking once it is signed (a booking Amelia takes payment for through Stripe or WooCommerce is made first, and the agreement opens just after). Simply Schedule Appointments opens it over the page as soon as the booking is made, or on the page its form sends people to afterwards. Closed without signing, a button to sign stays on the page, and the email has the link. In Simply Schedule Appointments an appointment waiting on payment starts its agreement once it is booked. The booking fills in booking_date, booking_time, service_name, persons and staff. Any other blank the agreement asks is listed under the service: choose what of the booking answers it (a location blank is given the booking's location, when the plugin has locations set up), or type the answer to use for every booking of that service. A booking saved again — rescheduled, confirmed, paid — starts nothing a second time, and a canceled one starts nothing. If a booking could not start its agreement, SignSealer → Bookings says which and why.
Yes, since 1.9.0: its RSVPs (the ones Event Tickets 5.30 makes, and the older kind a site has not moved over yet) and its Tickets Commerce tickets, free or paid. Open SignSealer → Bookings. Under Event Tickets, the first row is every ticket and RSVP; each ticket of the events still to come is listed under it, for any that should start a different workflow. Whoever RSVPs or buys is emailed the link to sign: one agreement for each ticket in their order, saying how many people it is for, because Event Tickets asks one name and email an order. A logged-in visitor's RSVP is under their account's email, as Event Tickets records it. The event fills in service_name (the event's name), ticket_name, booking_date, booking_time, persons, location (its venue) and staff (its organizer); an RSVP on a page rather than an event fills in the page's name, the ticket and how many. The RSVP's "received" message and the order page show a button to sign. An RSVP of "not going" starts nothing, and a ticket starts its agreement once its order is completed. Event Tickets Plus, the paid add-on that sells tickets through WooCommerce, has not been tested.
Yes, since 1.10.0. Open SignSealer → Bookings. Under Events Manager, the first row is every event; each event still to come is listed under it, with its date, for any that should start a different workflow (each date of a recurring event is an event of its own). A booking starts its agreement for the person who booked, one agreement a booking with persons the spaces they took, and SignSealer emails them the link; Events Manager's own message after booking shows a button to sign too. A booking waiting for your approval starts it; one waiting on a payment starts it once it is approved; a rejected or cancelled one starts nothing; approving a booking later starts nothing a second time. The event fills in service_name (the event's name), ticket_name, booking_date and booking_time (in the event's own time zone), persons and location. Events Manager Pro's payments and forms have not been tested.
Yes, since 1.11.0, with the free Booking Calendar's calendar. Open SignSealer → Bookings and choose the workflow every booking starts. A booking made on the calendar, or added in its admin, starts that workflow for whoever booked, and SignSealer emails them the link; Booking Calendar's own message after booking shows a button to sign too (with its "message" setting for after booking; with its own thank-you page, the email is the way). Its form's fields are read by name: firstname (or name) and secondname, email (or any email field), phone, and adults and children (or visitors) for persons. The booking fills in booking_date (its first day) and booking_time for a time slot. A booking waiting for your approval starts its agreement, and an edited booking does not start a second one. The paid editions' separate resources are not listed yet: their bookings start the one workflow.
Yes, since 1.12.0. Open SignSealer → Bookings. Under FluentBooking, the first row is every event type; each active event type is listed under it, by its calendar, for any that should start a different workflow. A booking starts its agreement once it is scheduled: booked on its page, added by the host, or, for one waiting for the host's confirmation or a payment, once confirmed or paid. SignSealer emails the person the link, and FluentBooking's confirmation (and its receipt page) shows a button to sign. The booking fills in service_name (the event type), booking_date and booking_time (in the calendar's time zone), persons, staff (the host) and location for an in-person place, with the person's name, email and phone. In a group event each person has a booking of their own and signs their own. FluentBooking Pro's group, round-robin and multi-slot bookings have not been tested.
Yes, since 1.13.0, with the free MotoPress Hotel Booking Lite (and the paid version, which has the same hooks). Open SignSealer → Bookings. Under MotoPress Hotel Booking, the first row is every accommodation type; each type is listed under it, for any that should start a different rental agreement. A booking starts its agreement once it is confirmed: by the guest's email link (its default), by you, or by a payment. SignSealer emails the guest the link, and its Booking Confirmed page (and Reservation Received after a payment) shows a button to sign. The booking fills in booking_date and booking_time (the check-in date and the site's check-in time), check_out_date, nights, service_name (the accommodation types booked) and persons (the adults and children in all of them), with the guest's name, email and phone. A booking with several accommodations starts the first one's workflow. A booking imported from another site's calendar (Airbnb, Booking.com) has nobody to sign and starts nothing.
Yes, since 1.14.0, with the free Bookly (and Bookly Pro, which adds to it). Open SignSealer → Bookings. Under Bookly, the first row is every service; each service is listed under it, for any that should start a different workflow. A booking starts its agreement once it is approved: as it is made, which is Bookly's default, or, for one left pending, when you approve it, when its approve link is followed, or when it is paid for. A booking your staff add in Bookly's calendar starts one too. SignSealer emails the customer the link, and the last step of Bookly's booking form shows a button to sign. The booking fills in service_name, booking_date and booking_time, persons and staff (the staff member), with the customer's name, email and phone. Bookly Pro's recurring appointments start one agreement for the series. A booking whose time has already passed starts nothing. Bookly's free version announces nothing to other plugins, so SignSealer looks for the bookings Bookly approved as each of its requests ends; a booking made some other way, such as Bookly Pro's WooCommerce add-on, is not seen yet.
Yes. Open the form's SignSealer settings, in its own plugin: Gravity Forms' form Settings, WPForms' builder Settings, Fluent Forms' Settings & Integrations, or Contact Form 7's SignSealer tab (SignSealer → Forms lists every form with a link there). Choose a workflow and say which of its fields hold the email address and the name (and the last name, when the form asks for it in a field of its own). Every other blank the workflow's document asks is listed, and for each you choose the field that answers it or type the answer to use; one left with neither is asked of the person on a page of your site just before they sign. After they submit, the person is sent straight to the signing page, or the form's own confirmation gains a button to sign — your choice per form. The entry keeps the document's id, title and status, and a note on it says what was sent and what happened. Contact Form 7 keeps no entries, so there the link is carried to its own script and shown under the form's message.
Yes, since 1.7.0. In Formidable Forms the settings are in the form's Settings, under SignSealer; in SureForms, in the form's Form Settings, under SignSealer, with a Save button of its own. In Ninja Forms SignSealer is an action: open the form's Emails & Actions, add SignSealer, and fill in the person's email and name with merge tags, the way the form's own email is set up. Each answers the agreement's blanks and sends the person on to sign the same way as the plugins above. These three keep the entry as they always have; see who signed in SignSealer.
Yes, since 1.7.0. In a form's SignSealer settings, under When they sign, choose Before the form is sent. Pressing the form's own button then opens the agreement over the form, on your page; once it is signed, the form is sent by itself and its entry carries the signed document. Somebody who closes it without signing sends nothing, and no entry is kept. The check is made by your site asking SignSealer, not by the browser, so it cannot be skipped. SignSealer emails them the link as well, as it always does.
Since 1.14.4 one visitor's address may start 20 agreements an hour, before payment or from a form: enough for anybody signing their own, and a limit on a script sending your agreements to address after address. Your staff, logged in, are not counted. A form sent past the limit keeps its entry, with a note saying nothing was sent. To change the number, return another from the signsealer_starts_per_hour filter (0 for no limit). If your site is behind a proxy that does not pass the visitor's address on, every visitor looks like the proxy: return the address your proxy vouches for from the signsealer_visitor_ip filter.
Yes, since 1.8.0. None has a place in its own screens for another plugin's settings, so a form's SignSealer settings are a page of this plugin's: open SignSealer → Forms and press Open settings beside the form. MetForm's, Everest Forms' and JetFormBuilder's lists of forms also have a SignSealer link under each form. Everest Forms and JetFormBuilder work whether a form sends with AJAX or reloads the page; a JetFormBuilder form that signs first is sent with AJAX, so the signing can open over it. Both answer the agreement's blanks, can sign before the form is sent, and send the person on to sign the same way as the others. MetForm shows its messages as plain text, so the button to sign appears under the form rather than in its message.
Yes, with Uncanny Automator (free). Make an Everyone recipe with the trigger
SignSealer → "A document from a form is signed", choose the form, and choose
the answer it waits for, such as "Are you married? → Yes". Make a second
recipe for "No". Each question on the form is also a token for the recipe's
actions. Developers can use the signsealer_document_completed action
instead (see For developers).
Not yet. Start here names it if it finds it on your site, with the way round it until then: give the form you want signed a public address in SignSealer, and set your form's confirmation to redirect to it (or to a page with the SignSealer agreement block). The person types their name and email again, and nothing is recorded on the entry.
Since 1.5.0 SignSealer has its own item in the admin menu, with Start here, Forms, WooCommerce, Templates and Settings under it. Old bookmarks to the Settings pages still work: they take you to the same page in its new place. Since 1.7.0 a form's settings are with the form, in its own plugin, and the shop's under WooCommerce → Settings → SignSealer; SignSealer's Forms and WooCommerce items take you there.
Yes, when your site is on https. After signing, the page offers a way back to the order they came from, or the page the form was on. SignSealer only sends people to sites a business has proven it holds, and connecting this plugin proved this one.
signsealer_document_completed no longer warns on
a form without the question it reads.signsealer_document_completed with one value per question.
signsealer_get_answers() asks for them on demand. A tick box is Yes or
No; sensitive answers are masked, as your staff see them./wp-json/signsealer/v1/site, shows only a SHA-256 of the connection
attempt's token, never the token itself.assets/, loaded with wp_enqueue_style() and wp_enqueue_script(),
and given what they need as data. The sign button's colour, which you
choose, is the one style still written on the page.[signsealer_sign] shortcode, for your own
business's forms. It is off unless you turn it on, and nothing else the
plugin shows gets it. A business with white label is not offered it.maybe_unserialize(). Formidable's own decoding, which only makes
arrays, is all that runs on what a visitor typed.signsealer_starts_per_hour filter changes it; signsealer_visitor_ip
names the address behind a proxy). Past it nothing is sent and no consent
to text is recorded. A WPForms or Fluent Forms submission kept as spam
starts nothing.gform_after_submission, which Gravity Forms
runs only after it has decided what the visitor sees, so the visitor got
the form's usual confirmation and had to find the link in SignSealer's
email. It now starts the agreement as soon as the entry is saved, before
the confirmation is chosen.wp-i18n./wp-json/signsealer/v1/site, and SignSealer fetches that page over https
to confirm the plugin is running here before registering an application
named after this site. Press Connect, sign in, approve, done. A partner
with an application of their own can still paste it, under a fold.signsealer_woocommerce_participant filter and a
signsealer_form_participant filter, for a site that keeps a template's
blank somewhere the plugin cannot guess.client_id, and put the API's answer — "client_id is required" — at the top
of an admin screen. Such a connection is now simply not a connection, and the
screen offers connecting again.wp_safe_redirect with an allowed_redirect_hosts filter on the OAuth
hand-off, fenced to the host SIGNSEALER_API_BASE resolves to.