Gravity Forms Read Only - WordPress Plugin
This plugin allows you to configure applicable form fields to be set to a read only state. Fields set to read only will be visible, but not editable. In other words, the user can “read” the field value but can not change the field value.

Plugin Features
This is useful in situations where you would like to present information to the user without the user being able to modify that data. This comes in handy when populating fields using Populate Anything, calculating quantities with Nested Forms, or anywhere that you want to include a Default Value without the user overwriting it.
Specifications:
| Release date: | 11-10-2020 | |
| Last updated: | 20-08-2026 | |
| Type: | Paid | |
| License: | GPL | |
| Subject: | Contacts & Feedback for Gravity Forms | |
| Compatibility: | W5.x W6.x | |
| Includes: | Plugin | |
| Language packs: |
|
|
| Developer: | Gravitywiz | |
| Rating: | ||
Share with your friends!
How to Configure Gravity Forms Read Only for Locked Form Fields
Gravity Forms Read Only is useful in WordPress forms where a value should remain visible to the visitor but must not be edited before submission. In this guide, we will cover more than just checking a box in the Gravity Forms editor. We will also look at the practical decisions that matter more: which fields should be locked, how to handle prefilled data, why dropdowns need extra verification, how to present a non-editable value cleanly to the user, and what to do if a field can still be changed or its value is not saved.
This guide is intended for site owners, webmasters, and developers who already use Gravity Forms and want to turn a form into a controlled workflow: some data comes from the user profile, the URL, another field, a calculation, or a related process, while the visitor only confirms, supplements, or submits the final result. This approach is especially useful for request forms, account areas, registrations, internal workflows, calculation forms, and entry editing forms.
The plugin does not replace server-side validation and should not be treated as protection against every possible type of tampering. Its purpose is more practical: to reduce the risk of a user accidentally changing an important value in the form interface, keep the field visible to the user, and preserve normal Gravity Forms behavior on submission.
What Problem the Plugin Solves in a Real Form
In a standard form, every visible field feels like an invitation to type. If a field already contains a request number, price, selected plan, user name, or property address, some visitors will try to change it. Sometimes that is harmless. Sometimes it breaks a calculation, a notification, a record link, or downstream request processing. Gravity Forms Read Only creates a middle state between a regular field and a hidden internal field: the value is visible, included in the submission, but not editable on the public-facing site.
The clearest example is a request form that a user opens from a service page. The service name and internal code are passed into the form through the URL or page settings. The name should be visible so the user can confirm the context of the request. The code is needed for the administrator and any integrations. If you leave those fields fully editable, the user may accidentally delete the name or replace the code. If you hide them completely, the user loses the visual confirmation that the request relates to the correct service. A read-only state solves both problems.
The official Gravity Wiz documentation describes the principle this way: the plugin adds a state to supported input fields rather than creating a separate field type. The setting appears in the Gravity Forms editor under the Perks tab for a supported field. Once enabled, the field stays in the form, but its value cannot be changed by typing, selecting, or clicking. The exact behavior depends on the field type.
How Read-Only Differs from a Hidden Field
A hidden field works best when the user does not need to see the value at all: an internal ID, campaign tag, traffic source, or technical flag. A read-only field is better when the value supports trust and clarity in the form. For example, it may be useful for the user to see their profile email, property number, calculated area, selected event entry, or a company that was looked up automatically.
Problems start when read-only is used as a substitute for server-side validation. The readonly and disabled attributes control interface behavior, but they should never be the only safeguard for an important business rule. If the price, role, discount, request status, or access rights are critical, validate them on the WordPress side, in Gravity Forms, in your integration, or in the form handler. The plugin helps prevent user mistakes, but final trust in the data must come from a source you control.
Where a Visible but Non-Editable Field Is Especially Useful
- Prefilled user data. A name, email, company, customer ID, or city can be shown for confirmation, while editing is blocked in the form if those details should only be changed in the user profile or CRM.
- Calculated and derived values. Area, final coefficient, package number, calculated quantity, or an internal code are better kept under control so the visitor cannot manually change the number.
- Entry editing forms. When a request is reopened, some fields can remain informational while only the comment, status, attachments, or clarification data stays editable.
- Connected forms. In Nested Forms or similar setups, a child entry may receive a value from the parent form, and the user should be able to see it without being able to accidentally edit it.
- Internal workflows. In approval requests, service forms, and support forms, read-only fields help separate source data from the fields that the current participant in the workflow is expected to complete.
Practical rule of thumb: if a value should be hidden from the user, use a hidden or admin field. If it should remain visible as context but the user must not change it, use Gravity Forms Read Only and add separate server-side validation for critical data.
What Happens Behind the Scenes: readonly, disabled, and Hidden Value Preservation
The main technical detail of Gravity Forms Read Only is that it changes the form markup before output, instead of waiting for the browser to run JavaScript after the page loads. For standard text fields and paragraph fields, the plugin adds the HTML readonly attribute to the input or textarea. That is native browser behavior: the value stays visible, focus behavior may vary depending on the field and theme, but the text cannot be edited.
Choice fields are different. HTML does not support readonly for select, and checkbox and radio fields behave differently from text inputs as well. That is why those field types use disabled instead. This approach has an important caveat: disabled fields normally do not submit their values with the form. Gravity Wiz documentation explains that the plugin works around this by using a hidden input that stores the selected value. That is why, after enabling read-only for a dropdown, you need to verify not only the visual state but also the saved value in Entries.
readonly, while choice fields require disabled plus separate verification that the value is still saved.Why This Is Better Than Writing Custom JavaScript for Every Field
Gravity Forms documentation includes an example of how to make a field read-only manually: add a CSS class to the field and run JavaScript on the form render event. That method works, but it requires code, retesting after AJAX re-renders, separate logic for checkbox and radio fields, and discipline when moving the form between sites. Gravity Forms Read Only covers the standard use case without adding a separate page-level implementation.
The practical advantage becomes even clearer in forms with conditional logic, multiple pages, prefilled values, and AJAX. The more the form changes while it is in use, the easier it is to forget to reapply JavaScript to the right field. The plugin's markup-based approach is simpler to maintain: the field is marked in the editor settings, and the state is applied when the form is generated.
Which Fields Deserve Extra Care
Gravity Wiz documentation says the plugin supports most fields that accept user input. But the wording "most" matters: not every field is equally suited to a read-only state. Before going live, test at least one scenario for every field type you plan to lock.
| Field Type | What to Usually Expect | What to Verify |
|---|---|---|
| Single Line Text, Email, Phone, Number without calculation | The value is visible and cannot be edited through normal text input. | The field is saved in the entry, and the hint text and styling do not mislead the user. |
| Paragraph Text | The multi-line value stays visible but cannot be edited. | The field is tall enough, and long text does not look like an active typing area. |
| Drop Down, Radio, Checkbox | A disabled state is used because native readonly is not available. |
The selected value is saved in the entry after submission and does not disappear in a multi-page form. |
| Address | The field contains multiple nested inputs, so in some cases only part of the address should be locked. | Which address lines should remain non-editable and which ones the user should still complete. |
| Calculated Number | Calculated Number fields in Gravity Forms already behave as read-only. | Whether this field actually needs the plugin or the built-in calculation setting is enough. |
After that review, you will see where read-only is truly useful and where another mechanism makes more sense: a hidden field, plain text in an HTML field, a calculated field, an admin field, or separate server-side validation.
Who This Approach Fits Best, and When Another Option Makes More Sense
Gravity Forms Read Only is especially useful on sites where forms have become part of a process rather than just collecting open-ended messages. The more prefilled values, dependent choices, calculations, and repeat editing your form has, the more valuable a clear read-only mode becomes. At the same time, the plugin has a narrow purpose: it does not build a CRM, create an account area, or define your full access-control model.
When the Plugin Is a Good Fit
Use it if you already have Gravity Forms and need a quick way to add a controlled state to specific fields. Good candidates include forms for logged-in users, requests with passed parameters, price calculation forms, service requests, forms embedded on product or service pages, and forms where an administrator edits the entry later in another tool.
The plugin is convenient for agencies and developers because the setting is visible directly in the form editor. You do not need to explain to a content manager where the JavaScript lives or which CSS class must not be removed. With decent internal documentation, it is enough to note: the "Customer Number" field is locked through the Perks tab, the value comes from the user profile, and any changes must be made only in the CRM.
When Read-Only May Be Unnecessary
Do not use the plugin just for a visual effect if the value could be shown as plain text instead. For example, if you want to display an informational note such as "Processing time is up to two business days," an HTML field, field description, or nearby text is a better choice. A read-only field is specifically for values that need to remain part of the submission or the form's behavior.
Another questionable use case is protecting a commercially sensitive price. If the price is calculated on the client side and then simply locked in a field, a technically skilled user can still attempt to alter the submitted data. In that case, read-only is useful as an interface cue, but the calculation and validation must be duplicated in trusted site logic.
Where Another Product May Be Needed
If you need more than just locking a value and also want to pull it dynamically from posts, users, taxonomies, a database, or a REST API, Read Only by itself is not enough. In that setup, it often works together with Populate Anything: one tool fetches and inserts the value, while the other prevents the user from manually changing the result. If the task involves editing entries on the front end, you may also need GravityView, Entry Blocks, or Gravity Flow depending on the workflow.
Preparation Before Installation: What to Review in the Form and on the Site
Before installation, it helps to do more than just confirm that WordPress and Gravity Forms are running. Create a quick field map. This takes less time than diagnosing the form later, after it is published and some submissions start coming in with empty or unexpected values.
Field Mapping Before Enabling Read-Only
Open the form in the editor and list the fields you want to make non-editable. For each field, answer five questions: where the value comes from, whether the user should see it, whether it must be saved in the entry, what should happen if the value is empty, and who is allowed to change the source. This kind of list immediately shows where read-only is appropriate and where a hidden field or plain text would be enough.
- Value source. It may be a static value, a merge tag, a URL parameter, a user profile value, a Populate Anything result, a calculation, or a value from a parent form.
- User-facing purpose. Does the visitor need to see this value for confirmation, or is it purely internal?
- Role in submission. Should the value be saved in the entry, notification, confirmation, or integration, or is it only displayed as a reference?
- Behavior when empty. Should the form submit, show an error, leave the field editable, or hide the block?
- Who is responsible for fixing it. The user, the administrator, the CRM, the integration, or the form owner.
Checking Gravity Forms Dependencies
The official Gravity Wiz documentation describes Gravity Forms Read Only as a perk inside the Gravity Perks ecosystem, which is currently managed through Spellbook. On a production site, it is important to understand how Gravity Wiz products are installed: through Spellbook, manually, or through an older project setup. This article does not cover purchasing or entering a license, but for reliable updates and support, you should use the developer's official distribution channel.
You should also review the form itself. It should not include conflicting solutions that try to alter the same fields after the form is rendered: custom JavaScript, old read-only snippets, third-party form styling plugins, aggressive input masks, conditional logic that hides the field before submission, or page caching that interferes with dynamic population. In most cases, a conflict does not show up immediately. It appears only under a specific combination: AJAX is enabled, the form is multi-page, the value comes from the URL, and the choice field is disabled.
Cache and Dynamic Population
Gravity Forms documentation specifically warns that dynamic population through PHP does not behave predictably on cached pages if the cache serves a prebuilt HTML page without running PHP for the current request. That matters for read-only fields: the plugin may correctly lock the field, but it will lock an outdated, empty, or wrong value if the prefill step failed.
Before publishing: if a field gets its value from a URL, shortcode, block, or PHP hook, test the form on a page with the same caching rules that will be used in production. Do not rely only on the form preview in the admin panel.
Installation and an Initial Check Without Unnecessary Risk
Installation depends on how Gravity Wiz products are managed in your project. According to current documentation, Gravity Perks are installed and managed through Spellbook, while the perks themselves remain separate plugins. In practice, that means you locate Gravity Forms Read Only in your tool list, activate it, and then configure the required fields inside the Gravity Forms editor.
Do not start with a live form that is already receiving submissions. Create a copy of the form or use a test page instead. Gravity Forms makes it easy to duplicate a form and review changes on a page that is blocked from indexing or available only to administrators. That way, you do not disrupt your current submission flow and can safely compare the entry before and after the change.
Basic Sequence
- Make sure Gravity Forms is active. The Read Only plugin extends Gravity Forms and is not useful without a working form builder.
-
Activate Gravity Forms Read Only through the project's official setup method. After activation, a setting should appear on the
Perkstab in the field editor. - Open a test form. Pick one field that already has either a default value or dynamic population.
-
Enable
Read-onlyfor that field. Save the form and refresh the page where the form is embedded. - Try to change the value as a regular visitor. Do not rely only on the admin preview, because the theme, cache, and page embedding can affect the behavior.
- Submit a test entry. Open Entries and confirm that the locked value was saved exactly as expected.
If everything works at this stage, move on to multiple field types. Do not enable read-only on ten elements at once, because it becomes harder to tell which field caused a submission problem.
Minimal Test Form
For an initial check, a simple three-field form is enough: a standard editable name field, a read-only "Selected Service" field with a default value, and a read-only dropdown or radio field with a preselected option. This will show the difference between text-based readonly and disabled choice fields. If both values are saved in the entry, you can move on to your real form structure.
What Counts as a Successful Initial Check
- The value is visible on the public page and does not look accidentally disabled because of a styling issue.
- The user cannot change the value through ordinary browser interactions.
- After submission, the value appears in the Gravity Forms entry.
- The notification and confirmation receive the expected value if you use merge tags.
- After a page reload or reopening the form, the value does not disappear because of caching or a bad data source.
Detailed Configuration After Installation: From the Perks Tab to Entry Verification
After installation, the real work happens not in global plugin settings, but in specific form fields. That is convenient, but it requires discipline: every read-only field should have a clear value source and a clear verification method. Otherwise, the form turns into a collection of locked fields that nobody remembers how to maintain.
Step 1. Choose a Field That Should Stay Visible
Start by asking whether the user actually needs to see the value. If the field is purely internal and does not help explain the context of the request, do not make it read-only just because it is easier. A hidden or admin field will be cleaner. If the value helps the user confirm that they are submitting a request for the correct property, service, or account, then read-only is a good fit.
Step 2. Enable the Setting on the Perks Tab
Open the field in the form editor and go to the Perks tab. For a supported field, you will see the Read-only setting. Turn it on and save the form. If the setting is not there, do not try to force this plugin onto the field. First check the field type: it may already be non-input content, calculated, hidden, an HTML block, or an unsupported element.
Step 3. Set the Value Under Advanced
The official Gravity Wiz instructions recommend that after enabling read-only, you go to the Advanced tab and specify a default value if needed. In Gravity Forms, a default value can be static or use supported merge tags. For more flexible connections, you can use dynamic population or a separate tool such as Populate Anything, but in that case you should separately verify caching behavior and value matching for choice fields.
Do not leave a required read-only field empty. If the field is required but the value was not populated, the user will not be able to correct it, and the form may return a validation error. For those fields, set up the value source first, then enable required validation, and only after that apply the lock.
Step 4. Adjust the Appearance of the Locked Field
The user should understand that the field is unavailable by design, not because something is broken. Sometimes a theme's default style makes disabled elements too faint. In other cases, a read-only field still looks like a normal input and invites clicks. Gravity Wiz publishes CSS examples for read-only and disabled fields, and Gravity Forms points to several safe places for adding CSS, including the theme and Code Chest.
Below is a small CSS snippet for cases where you want to present a non-editable field as a confirmed value in a clean way. This is not an official plugin feature, but a safe visual adjustment based on the public CSS selectors readonly and disabled. Add it wherever you normally store form styles: a child theme, the theme's custom CSS, or Code Chest.
/* Clean styling for fields the user can see but not edit */
.gform_wrapper input[readonly='readonly'],
.gform_wrapper textarea[readonly='readonly'],
.gform_wrapper select[disabled='disabled'],
.gform_wrapper input[disabled='disabled'] {
background-color: #f6f8fb;
border-color: #cbd5e1;
color: #334155;
cursor: not-allowed;
}
.gform_wrapper input[disabled='disabled'] + label {
color: #475569;
}
The verification is straightforward: open the form page without administrator privileges and make sure the locked field is readable but does not look like the main field intended for action. Then submit a test entry and confirm that the CSS does not hide important hints or reduce contrast.
Step 5. Document the Field's Purpose for the Team
If multiple people maintain the form, add an internal note in the project documentation or next to the task. State that the field is locked through Gravity Forms Read Only, where its value comes from, and where it should be changed. This is especially important in agency projects: a few months later, a content manager may see a locked field and try to "fix" it by unchecking the setting.
Prefilled Values, Populate Anything, and Locked User Data
One of the strongest use cases for Gravity Forms Read Only is a field that is populated automatically but remains visible. That could be the current user's profile, WordPress post data, a selected service, a Populate Anything filter result, or a value passed through the URL. It is important to separate two responsibilities: what fills the value and what prevents it from being edited.
Dynamic Value from a URL or Shortcode
Gravity Forms supports dynamic population through a parameter, shortcode, block, and PHP hooks. You enable the Allow field to be populated dynamically setting for the field, assign a parameter name, and then pass the value when the form is opened. In this setup, Read Only makes that populated value non-editable for a regular user.
For example, a service page links to a form with the parameter service_code=consulting_basic. The form includes a field labeled "Service Code" that receives this value and is locked. The user sees which service was selected but cannot modify the internal code. On submission, the administrator receives an entry with the code, and the notification can use it to route the request.
What Can Go Wrong
If the parameter is missing, the field will remain empty. If it is required and read-only, the user will not be able to fix it. If the page is cached with the same HTML for every visitor, the dynamic value may never populate. That is why URL parameters and PHP prefill logic need separate testing on the actual page, not just in the form editor.
Using It Together with Populate Anything
Populate Anything can dynamically fetch values and choice options from many sources: posts, users, taxonomies, Gravity Forms entries, databases, and other objects. In that pairing, Read Only handles the second half of the job: once the value has been found and displayed, the user should not be able to replace it manually.
A practical example: the user enters an email address, Populate Anything finds their organization and customer ID, and Read Only locks those discovered fields. The visitor can see that the form recognized their profile but cannot change the customer ID. If the organization is not found, you can leave the field empty or present another way to continue, depending on the form's behavior.
Gravity Wiz snippets include an "Enable When Dynamically Populated" option: the field becomes read-only only when it actually receives a value. That is useful when an empty field should remain editable, but a matched value should be locked. This approach requires careful testing, but it is better than permanently locking an empty required field.
Choice Fields and Exact Value Matching
For choice-based fields, value accuracy matters even more. If a dynamically populated value does not match the actual value of an existing option, the field may fail to select the correct item. Official Gravity Forms and Gravity Wiz materials repeat this point in different contexts: for dropdowns and checkboxes, the value must match one of the available options.
The check takes a minute: open the choice settings, review the actual value for the required option, and then pass that exact value through your source. After submission, confirm that the selected item was saved in the entry rather than an empty string. If the field is in a multi-page form, also test moving forward and backward because the state must persist during form navigation.
Calculations, Nested Forms, and Fields the User Should Only Confirm
The second important use case is values that are generated inside the form itself. This may be a quantity calculation, a price, a coefficient, a child-entry total, an operation code, or a value that should be shown for confirmation before submission. In these cases, Read Only helps separate user input from a value the form calculates or receives from a related process.
Calculated Number Fields
Gravity Forms states that Number fields with calculations enabled are already read-only. So for those fields, the Read Only setting may not be necessary and may not even appear. That is normal behavior: if a field is the output of a formula, Gravity Forms already protects it from manual editing in the interface.
But the fields around a calculated field may still be ordinary inputs that supply the source values: the selected plan, customer coefficient, service type, unit count, and so on. Those fields often do need additional locking, especially if they come from a profile or external logic. Otherwise, the user can change an input value and produce an unexpected total.
Nested Forms and Child Entries
In its Read Only description, Gravity Wiz gives a Nested Forms example: calculated quantities or values from a child form can be shown as non-editable. In these structures, it is especially important to understand where the value is created. The parent form may collect the overall order, the child form may hold the line items, and read-only fields may display data that should not change when an individual row is edited.
The Snippet Library includes a separate example for cases where child entry fields become read-only only during editing, while remaining editable during initial creation. That is a good model to follow: not every field should always be locked. Sometimes the lock is only needed after the entry has already been created and is being used in the next stage of the process.
How to Verify the Outcome in Calculation-Based Setups
- Fill in the source fields with normal test values.
- Confirm that the calculated or populated value appears before submission.
- Try changing the read-only value in the browser using normal actions.
- Submit the form and open the entry.
- Compare the visible value on the page, the value in Entries, and the value in the notification.
- Repeat the test on a multi-page form if the calculation or child entry is not on the first page.
If any of those values do not match, do not blame Read Only right away. Check the formula, field order, conditional logic, and hidden fields. Gravity Forms documentation on calculations specifically notes that fields involved in a formula must appear before the calculated field and must not be hidden by logic at the moment of submission.
Practical Example: A Request Form with a Locked Service Code
Let us walk through a working example that is easy to adapt for a consultation, event, service order, catalog inquiry, or internal request. The goal is to build a form where the user sees the selected service and service code but cannot replace them before submission. At the same time, the administrator receives an entry with the correct values.
Goal
The user lands on a request form from a service page. The form already knows the service name and internal code. The visitor fills in their name, phone number, and comment, while the "Service" and "Service Code" fields stay visible but locked. After submission, the manager can immediately see which service the request is tied to, and the integration can use the code.
Preparation
- Gravity Forms is installed and working on the site.
- Gravity Forms Read Only is activated through the project's official method.
- You have a test form or a copy of the live form.
- You know how the value will reach the form: statically, through a URL parameter, shortcode, block, or separate dynamic logic.
- The form page does not serve stale cache for dynamic parameters.
Setup Steps
- Create a
Single Line Textfield labeled "Service." Under theAdvancedtab, set a default value or enable dynamic population. - Go to the
Perkstab for that field and enableRead-only. - Create a second
Single Line Textfield labeled "Service Code." If the visitor does not need to see the code, use a hidden field. If the code should be visible for confirmation, leave it visible and enableRead-only. - Add standard editable fields such as name, email or phone number, and comment.
- Set up the notification so it includes the "Service" and "Service Code" fields. Do not rely only on page text, because the manager works from the entry and email.
- Save the form and embed it on a test page.
Verification
Open the page as a regular user. Make sure the "Service" and "Service Code" fields are filled in and cannot be edited. Submit the form. Entries should contain the same values that were visible on the page. If you use notifications, check the email too: the merge tags should output the correct values.
Common Pitfall with an Empty Value
If the service code does not populate, the read-only field will not let the user fix it. In that case, it is better not to make the field required until the source has been verified. Another option is to show a clear message and avoid displaying the form at all if the required parameter is missing. That is page or integration logic, not the job of Read Only itself.
Common Pitfall with Admin Permissions
In some cases, an administrator should be allowed to edit something that the visitor cannot. Gravity Wiz Snippet Library includes a "Disable Read Only for Admins" example where a field with a specific CSS class stays editable for administrators. That approach can work for internal forms, but test it on a copy of the site first and do not treat it as a replacement for a proper access-control model.
Verifying the Outcome on the Public Page, in Entries, and in Notifications
A read-only setup should only be considered complete after three checks: the user cannot change the value on the public-facing site, Gravity Forms saves the expected value in the entry, and notifications and integrations receive that same value. If you only verify the visual state, you can miss a problem with a disabled choice field or dynamic population.
Public-Facing Site
Open the page in conditions that are as close as possible to a real user session. It is best to use a separate browser, a private window, or a test user without admin privileges. Check ordinary actions: clicking the field, using the keyboard, trying to select another option, moving between form pages, going back, submitting through AJAX, and reopening the page.
Entry in the Admin Area
After submission, open Forms - the relevant form - Entries. Find the test entry and compare the value. For text fields, the match is usually obvious. For checkbox, radio, and select fields, verify the saved value itself, not just the option label shown on the public page. If the field participates in conditional logic, make sure it was not hidden before submission.
Notifications and Confirmations
If the read-only field is used in an email or confirmation, test the merge tags. Not every value that appears on the page is automatically suitable for every output context. Official Gravity Forms documentation on merge tags and default values emphasizes that support depends on where the value is being used. That is why a test email is a required part of verification.
Quick Verification Matrix
| Verification Area | Expected Outcome | If It Does Not Match |
|---|---|---|
| Public form | The value is visible but cannot be edited through normal actions. | Check whether Read-only is enabled for the correct field and whether a script is re-rendering the field. |
| Entries | The entry contains the expected value. | Check the field type, hidden value preservation for disabled states, conditional logic, and the value source. |
| Notification | The email contains the same value as the entry. | Check the merge tag, value format, and notification settings. |
| Multi-page form | The value does not disappear while moving between pages. | Check dynamic population, AJAX, caching, and any snippet updates if they are used. |
Useful Refinements: Styling, Admin Roles, and Partial Address Locking
After the basic setup, it is common to want smarter behavior: make a read-only field look like plain text, let administrators edit a locked value, or lock only part of a compound field. The key is not to invent an internal API that does not exist. Gravity Wiz publishes ready-made snippets for several cases, and safe CSS is enough for appearance changes.
Show a Read-Only Field as Text Instead of an Input
Gravity Wiz FAQ includes a CSS approach that removes the background, border, shadow, and extra spacing from a read-only input so the value looks like plain text. This works well in confirmation blocks such as "Selected Service," "Request Number," or "Assigned Manager." But use this style carefully. If the field looks like ordinary text, the user may not realize that it still participates in the form submission.
/* Option for forms where a read-only value should look like reference text */
.gform_fields input[readonly='readonly'] {
background-color: transparent;
border: none;
border-color: transparent;
border-radius: 0;
box-shadow: none;
font-family: inherit;
font-size: inherit;
outline: 0;
padding: inherit;
}
After adding the style, test the form on a mobile screen and with a validation error. Some themes rely on field borders as a visual cue, so if you remove that border, make sure a clear label or description still remains nearby.
Disable Read-Only for Administrators
The official Gravity Wiz snippet for administrators works through a field CSS class and the gform_pre_render filter. The idea is simple: visitors see the field as locked, while a user with administrator permissions can edit it. This is convenient for internal forms, but it requires a clear policy: exactly who should be allowed to change the value, where that is documented, and how the change is verified after saving.
Do not paste a snippet like this into a live project without testing. Create a test form, add the CSS class from the instructions to one field, and verify the behavior as both an administrator and a regular user. If your roles differ from the standard administrator role, the adaptation should be done by a developer, because a mistake in access permissions can expose editing rights to the wrong users.
Partial Locking for an Address Field
An Address field contains multiple internal inputs. In some cases, you may want to lock the country and city but leave the street and ZIP code editable. The Snippet Library includes an "Input-specific Read Only for Address Fields" example that removes readonly from selected internal address parts. That is no longer a content-manager setting, but a targeted developer customization.
The practical sequence is: enable read-only for the entire Address field, identify the form ID and field ID, then specify the internal indexes that should remain editable in the snippet. After that, test every address variation, because the structure of address inputs depends on the address type and field settings. If your project does not require a compound address, using separate fields for city, street, and ZIP code is often simpler.
Compatibility with the Theme, Cache, Conditional Logic, and Multi-Page Forms
Most read-only field issues do not come from the checkbox itself, but from the form environment. The theme changes the styling of disabled fields, cache interferes with dynamic values, conditional logic hides the calculation source, and a multi-page form re-renders part of the markup. That is why a solid test involves not just the form editor but the real page.
Theme and Visual State
Some themes make disabled fields look too faint. For checkbox and radio fields, that can look like a broken unavailable state even when the field is intentionally locked. Add a short description below the field: "This value is filled automatically" or "The selected plan cannot be changed in this form." If the styling is still confusing, use the CSS from the earlier section and verify contrast.
Page Cache
If a read-only field gets its value through dynamic population, exclude the form page from aggressive full-page caching or configure the cache so query parameters and user context do not get mixed together. Be especially careful with forms for logged-in users. You cannot allow one user to see a value intended for someone else.
Conditional Logic
Gravity Forms does not save values from fields that are hidden by conditional logic at the time of submission. That matters for read-only fields: a field may be locked and filled in, but if logic hides it before submission, the value may never reach the entry. If the value is critical, do not tie its visibility to an unstable condition. It is better to keep the field visible as contextual reference or use a hidden internal field if the value should not be displayed.
Multi-Page Forms and AJAX
Multi-page forms add another layer of verification. A value may populate on the first page, then the form moves forward, goes back, re-renders through AJAX, and loses its state. Gravity Wiz updates its snippets for cases like this, but custom modifications and third-party scripts may lag behind. Test the full user path, not just the top of the form.
Troubleshooting Common Issues
If Gravity Forms Read Only behaves unexpectedly, start with the symptom. Do not change multiple settings at once, or it will be hard to tell what actually fixed the problem. The issues below are the ones most specific to read-only fields, dynamic population, and Gravity Forms.
The Field Can Still Be Edited
Symptom: the user clicks into the field and changes the value. Most often, the setting was enabled on the wrong field, the field is being re-rendered by custom script, or you are testing a different copy of the form.
Check the form ID, the form copy, and the field in the editor. Make sure Read-only is enabled on the Perks tab. If the page contains custom JavaScript, disable it temporarily on a test copy. If the problem disappears, the conflict is not in Read Only but in the extra logic.
The Value Is Visible but Not Saved in Entries
Symptom: the field looks locked, but the entry is empty. For text inputs, first check the value source and whether the field is required. For select, radio, and checkbox fields, check how the field is being locked and which value is being submitted. Disabled fields follow special submission rules, so you need to test the saved entry itself, not just the appearance.
Also review conditional logic. If the field is hidden before submission, Gravity Forms may ignore its value. For critical internal data, use a separate hidden field or a verified server-side source.
The Read-Only Field Is Empty and the User Cannot Fill It In
Symptom: the form displays an empty locked field or returns a required-field error. The cause is almost always the value source: the URL parameter did not arrive, the merge tag is not supported in that context, Populate Anything did not find a record, cache served an old page, or the value for a choice-based field did not match an available option.
First, temporarily remove the required setting from the field and test the source. Then open the form with an explicit test parameter such as ?service_code=test if the field is configured for dynamic population. Once the source is confirmed, turn the required setting back on if it is genuinely needed.
The Field Looks Too Faint or Too Unclear
Symptom: the user treats the field as broken or does not notice the value. This is a theme styling and UX issue. Add a field description, use CSS for read-only and disabled states, and check contrast and mobile behavior.
If the field looks like ordinary text, make sure there is still a label next to it. If it looks like a disabled input, add a short explanation such as "Filled automatically" or "Can only be changed in the profile."
The Problem Only Appears on the Live Page, Not in Preview
Symptom: everything works in the editor, but on the published page the value does not populate or the field becomes editable. Check caching, the theme, the page builder, AJAX, and third-party scripts. The Gravity Forms preview does not always reproduce the real page conditions.
Disable one factor at a time on a test copy: first page cache, then custom JS, then any conflicting form styling plugins. If the issue disappears after switching to a default theme, look for CSS or JavaScript in the theme.
The Problem Is Related to an Entry Editing Form
Symptom: when editing an existing entry through GravityView, Entry Blocks, or a similar workflow, a field should be informational but remains editable or loses lines. Use only snippets that specifically target entry editing, and test the exact field type. Comments under one of the Gravity Wiz snippets discussed a List field case when editing through GravityView, so compound fields are best tested separately.
When to roll back: if enabling read-only causes the entry value to disappear or breaks form submission, remove the setting from the problematic field and restore the form to a working state. Then repeat the test on a copy using just one field and one value source.
Questions That Usually Come Up After Setup
Can Gravity Forms Read Only be used to protect a price from tampering?
Only as part of the interface. The plugin helps prevent the user from accidentally changing a value in the form, but any critical price, discount, role, or access right must be validated on the server or in reliable business logic. Do not trust important data just because the field was locked in the browser.
Why does the setting not appear for some fields?
Read-only only makes sense for user-input fields. If the field is hidden, an HTML block, a technical element, a CAPTCHA, a page break, a section, or already a calculated field, the setting may be irrelevant or unavailable. Check the field type and decide whether the user truly needs to see it as a visible value.
Can a field become read-only only when it is filled automatically?
Yes. Gravity Wiz provides a snippet for the case where a field becomes read-only only when it has received a dynamically populated value. This is useful when a matched value should be locked, but an empty field should remain editable. That snippet should be tested on a copy of the site, especially with multi-page forms and choice fields.
What should I do if an administrator must be able to edit the field but a visitor must not?
The Snippet Library includes an example that disables read-only for administrators through a field CSS class and a permission check. Use it only after testing with different roles. If your permission model is more complex, it is better to design a dedicated editing workflow than to build the whole model around a single admin condition.
Does read-only affect form speed?
The plugin itself works at the field markup level and does not require a separate JavaScript dependency for its base behavior. In most cases, the impact is minimal. Real performance issues are more often tied to dynamic population, external requests, a large number of fields, a heavy theme, AJAX, or caching.
Can read-only be used with required fields?
Yes, as long as the value is guaranteed to populate before submission. But it is a risky combination for fields that sometimes stay empty. The user will not be able to fix an empty read-only field, so verify the value source first, then the required setting, and only after that publish the form.
Do I need separate CSS for locked fields?
Not always. If the theme already presents read-only and disabled states clearly, extra CSS is unnecessary. Add styles only when the field looks broken, too faded, or too similar to a normal editable input.
Why is there no exact video in this article?
This guide is based on official pages and documentation, and an exact useful YouTube video specifically about Gravity Forms Read Only could not be confirmed. Some Gravity Wiz snippets include Loom videos, but those are not YouTube resources suitable for embedding in the article.
When Gravity Forms Read Only Is Worth Using
Gravity Forms Read Only is a strong choice when you want to keep important form values visible and understandable while removing the chance of accidental edits. It is especially effective when paired with dynamic population, Populate Anything, Nested Forms, entry editing forms, and internal workflows where different fields play different roles.
Before publishing, run one final short check: the value source works on the real page, the read-only field cannot be changed in normal use, the value is saved in Entries, notifications receive the correct merge tag, cache is not inserting stale data, and the field appearance does not confuse the user. If everything matches, you can move on to the live form and go to the Gravity Forms Read Only download for further testing on your site.
The key is to use the plugin for what it is meant to do. It should not replace validation, permissions, or server-side checks, but it does solve the interface problem well: showing the user an important value, saving it in the request, and preventing accidental data changes before submission.


