Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Forms: Add unique IDs when multiple instances. #40998

Open
wants to merge 8 commits into
base: trunk
Choose a base branch
from

Conversation

lezama
Copy link
Contributor

@lezama lezama commented Jan 13, 2025

Fixes: #33009

Currently, when forms are used multiple times on a single page, all instances share the same ID. This can cause issues with:

  • Form submission handling
  • Success message display targeting
  • Accessibility (duplicate IDs violate HTML spec)

Before:

Screenshot 2025-01-13 at 10 51 00 AM

After:

Screenshot 2025-01-13 at 10 52 55 AM

Proposed changes:

  • Adds a unique identifier suffix to form IDs when multiple instances of the same form exist on a page by:
  • Tracking the number of form instances via self::$forms count
  • Appending a numeric suffix to the form ID (e.g., form-123-1, form-123-2)
  • Using this unique ID in the form HTML output and submission handling
  • First form will keep the existing id

Other information:

  • Have you written new tests for your changes, if applicable?
  • Have you checked the E2E test CI results, and verified that your changes do not break them?
  • Have you tested your changes on WordPress.com, if applicable (if so, you'll see a generated comment below with a script to run)?

Jetpack product discussion

Does this pull request change what data or activity we track or use?

Testing instructions:

  1. Create a page with multiple instances of the same contact form
  2. Verify each form instance has a unique ID in the HTML output
  3. Submit each form instance and verify:
    • Success messages appear correctly for the submitted form
    • Form submissions are tracked properly

@lezama lezama requested a review from a team January 13, 2025 13:45
Copy link
Contributor

github-actions bot commented Jan 13, 2025

Are you an Automattician? Please test your changes on all WordPress.com environments to help mitigate accidental explosions.

  • To test on WoA, go to the Plugins menu on a WordPress.com Simple site. Click on the "Upload" button and follow the upgrade flow to be able to upload, install, and activate the Jetpack Beta plugin. Once the plugin is active, go to Jetpack > Jetpack Beta, select your plugin, and enable the update/forms-unique-id branch.

  • To test on Simple, run the following command on your sandbox:

    bin/jetpack-downloader test jetpack update/forms-unique-id
    

Interested in more tips and information?

  • In your local development environment, use the jetpack rsync command to sync your changes to a WoA dev blog.
  • Read more about our development workflow here: PCYsg-eg0-p2
  • Figure out when your changes will be shipped to customers here: PCYsg-eg5-p2

@github-actions github-actions bot added [Feature] Contact Form [Package] Forms [Plugin] Jetpack Issues about the Jetpack plugin. https://wordpress.org/plugins/jetpack/ labels Jan 13, 2025
Copy link
Contributor

github-actions bot commented Jan 13, 2025

Thank you for your PR!

When contributing to Jetpack, we have a few suggestions that can help us test and review your patch:

  • ✅ Include a description of your PR changes.
  • 🔴 Add a "[Status]" label (In Progress, Needs Team Review, ...).
  • 🔴 Add a "[Type]" label (Bug, Enhancement, Janitorial, Task).
  • ✅ Add testing instructions.
  • ✅ Specify whether this PR includes any changes to data or privacy.
  • ✅ Add changelog entries to affected projects

This comment will be updated as you work on your PR and make changes. If you think that some of those checks are not needed for your PR, please explain why you think so. Thanks for cooperation 🤖


The e2e test report can be found here. Please note that it can take a few minutes after the e2e tests checks are complete for the report to be available.


Follow this PR Review Process:

  1. Ensure all required checks appearing at the bottom of this PR are passing.
  2. Choose a review path based on your changes:
    • A. Team Review: add the "[Status] Needs Team Review" label
      • For most changes, including minor cross-team impacts.
      • Example: Updating a team-specific component or a small change to a shared library.
    • B. Crew Review: add the "[Status] Needs Review" label
      • For significant changes to core functionality.
      • Example: Major updates to a shared library or complex features.
    • C. Both: Start with Team, then request Crew
      • For complex changes or when you need extra confidence.
      • Example: Refactor affecting multiple systems.
  3. Get at least one approval before merging.

Still unsure? Reach out in #jetpack-developers for guidance!


Jetpack plugin:

The Jetpack plugin has different release cadences depending on the platform:

  • WordPress.com Simple releases happen semi-continuously (PCYsg-Jjm-p2).
  • WoA releases happen weekly.
  • Releases to self-hosted sites happen monthly. The next release is scheduled for February 4, 2025 (scheduled code freeze on February 4, 2025).

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.

@github-actions github-actions bot added the [Status] Needs Author Reply We would need you to make some changes or provide some more details about your PR. Thank you! label Jan 13, 2025
@coder-karen
Copy link
Contributor

One thing that might be worth considering, either for this PR or for follow-ups, is the ability to manually customize the unique form ID. If we allow for that, then it may also be worth adding the unique ID as an attribute to the form as well, assuming the ID could be set via the editor / inspector.
Adding the ID as an attribute would also be useful in terms of hidden fields in forms too - related to a current PR I'm working on: #40860

I added a few rough notes about both of these under 'form reusability' in an issue here that could be helpful: https://github.com/Automattic/vulcan/issues/601

Perhaps thought that's something to consider for some time down the line, but wanted to mention it just in case.

@enejb enejb force-pushed the update/forms-unique-id branch from 8e71c98 to 2f42b0d Compare January 15, 2025 20:32
@simison
Copy link
Member

simison commented Jan 16, 2025

I like this solution for simplicity, and particularly for backawrds compatibility (re: "First form will keep the existing id"). I think it's fine to merge this iteration.

However, I think it has some weaknesses we need to address in future:

  • If I reorganise the forms on the page, IDs change. That's fine for handling frontend UIs like submissions and confirmations, but would anyone try apply specific styling to the form with CSS. Those people should arguably add custom CSS class to the form and use that instead, though.
  • We can't track back submissions to a specific form, only to the page it was submitted from. That's a problem if we want to develop a centralized form management UIs, track better stats for specific forms, etc. For that, we need stable IDs regardless if the same form is on multiple pages via synced patterns. I think we'll need additional stable form "key" which ideally would be queryable. Perhaps we'll generate it randomly and add to attributes, or use synced pattern ID, or save the form in custom post type and use the post ID. Future problems but food for thought now.

Can you double check this solution works also if some of the forms are inside reusable/synced patterns?

if ( ! isset( $attributes['id'] ) ) {
$attributes['id'] = '';
}
$attributes['id'] = $attributes['id'] . '-' . ( count( self::$forms ) + 1 );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fine as is, but noting that wp_unique_id() can be handy here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Contact Form [Package] Forms [Plugin] Jetpack Issues about the Jetpack plugin. https://wordpress.org/plugins/jetpack/ [Status] Needs Author Reply We would need you to make some changes or provide some more details about your PR. Thank you! [Tests] Includes Tests
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Form block: Duplicating a form does not create a unique entity
4 participants