How to Enable Inline Editing in a WordPress Table

Inline editing turns a read-only data table into a live spreadsheet your team can update without leaving the page. TableCrafter's inline edit feature writes changes directly back to Gravity Forms entries via the GF API, which means every edit is stored in the same place your original form submissions live. This guide walks through the complete setup from plugin install to first successful cell edit. WordPress powers 43% of all websites globally (W3Techs, July 2026), and TableCrafter bridges the gap between the data you collect and the tables your users need to see, no custom PHP, no dashboard access required for viewers. The free version on WordPress.org supports CSV, JSON, Google Sheets, and Excel. Pro adds Gravity Forms, Airtable, Notion, WooCommerce, REST APIs, inline cell editing, export to CSV, Excel (.xlsx), and JSON, role-based column visibility, and auto-refresh. Every table embeds on any page with the [tablecrafter] shortcode or the native Gutenberg block.
What You Need Before You Start?
Inline editing in TableCrafter requires the Pro tier Pro. Make sure you have:
After completing this step, verify the result by viewing the page as a logged-out visitor in an incognito window. This confirms the table behaves correctly for public visitors rather than reflecting admin-level permissions that may hide configuration issues during initial setup. Check both the rendered output and the browser console for any JavaScript errors.
- TableCrafter Pro installed and activated
- A Gravity Forms form with at least one existing entry
- Editor or Administrator role on the WordPress site
- A page or post where you'll embed the table
Step 1: How Do I Install and Activate TableCrafter Pro?
If you haven't installed the plugin yet, go to Plugins → Add New → Upload Plugin and upload the tablecrafter-pro.zip file you downloaded from your account dashboard. Activate it, then navigate to TableCrafter → Settings → License and paste your license key. A green checkmark confirms the license is valid.
With Gravity Forms already active, TableCrafter will automatically detect your forms. You do not need to configure a connection manually, the plugin reads from the Gravity Forms database tables directly.
The column mapping you define here is stored as a JSON configuration in the WordPress database. You can export this configuration using the TableCrafter export tool and import it to another table or another site. This is useful when replicating a table layout across multiple pages or when migrating a table to a staging environment for testing before going live.
Step 2: How Do I Create a Table Configuration?
Go to TableCrafter → Tables → Add New. This opens the table builder.
- Select your form from the Source dropdown. TableCrafter lists every active Gravity Forms form on the site.
- Choose columns by dragging fields from the Available Fields panel into the Columns panel. Each field you add becomes one column in the rendered table.
- Set the Display Label for each column. This is what users see as the column header, it does not have to match the Gravity Forms field label.
- Mark columns as editable. In the column settings panel, toggle the Allow Inline Edit switch for any column you want users to be able to change. Columns without this toggle remain read-only even when the table is in edit mode.
- Save the table. TableCrafter assigns a numeric ID (e.g.,
id="3") that you'll use in the shortcode.
Step 3: How Do I Enable the Edit Parameter in the Shortcode?
Once your table is saved, place the shortcode on any page or post. Inline editing is controlled by the per-column and per-table settings in the table builder's Editing tab, not by any shortcode attribute. The shortcode that embeds the table is identical regardless of whether editing is enabled:
[tablecrafter id="3"]
When a user loads this page, TableCrafter checks whether the current user's role has edit permission and whether individual columns have editing toggled on. If both conditions are met, those columns render as editable cells. If either condition is not met, the table renders in read-only mode. There is no client-side parameter that bypasses this server-side gate.
You can combine the shortcode with other display parameters. A full-featured shortcode for a team operations table might look like:
[tablecrafter id="3" filter="true" search="true" export="true"]
Each parameter is independent. filter="true" adds column filter dropdowns, search="true" adds a search bar, and export="true" adds an export button for CSV, Excel (.xlsx), and JSON. These display parameters do not affect the inline editing behavior.
TableCrafter re-fetches this data on each page load by default. If your data source updates infrequently and your site has significant traffic, enable the built-in caching option in the table's Performance tab. This stores the fetched data for a configurable number of minutes and serves it from WordPress transients, reducing API calls to the source and improving page load time for visitors.
Step 4: How Do I Test a Cell Edit?
Visit the page where you placed the shortcode while logged in as an Administrator or a role you've granted edit permissions. You should see the table rendered with your data. Hover over a cell in an editable column, the cursor changes to a text cursor and a subtle highlight appears on the cell.
Click the cell. The cell enters edit mode: the static text is replaced by an input field (or a dropdown for choice fields, a date picker for date fields). Type a new value and press Enter to save, or press Escape to cancel without saving.
After pressing Enter, you'll see a brief spinner inside the cell while TableCrafter sends the update. The spinner disappears and the new value appears. No page reload happens.
The configuration you set here applies to every visitor who loads a page containing this table, regardless of whether they are logged in. Role-specific overrides for columns and rows are a separate layer and do not replace these global display settings. Apply global settings first, then add role restrictions as needed for tables that serve multiple user types.
What Happens Under the Hood?
When a user confirms an edit, TableCrafter fires a JavaScript fetch request to wp-admin/admin-ajax.php with the action gt_update_entry. The payload includes the table ID, the Gravity Forms entry ID, the field ID being updated, and the new value.
On the server side, TableCrafter's AJAX handler validates the request (nonce check, capability check, per-column editability check), then calls GFAPI::update_entry_field() with the entry ID, field ID, and sanitized new value. Gravity Forms handles the write to the wp_gf_entry_meta or wp_gf_entry_values database table depending on your GF version.
This means every inline edit creates a proper Gravity Forms entry update, complete with GF's own update hooks firing. Any notification, feed, or plugin that hooks into gform_after_update_entry will respond to inline edits exactly as it would to a manual edit inside the GF entries screen.
How Does Troubleshooting Common Setup Issues Work?
Edit Mode Does Not Appear
If clicking a cell does nothing, work through the following checks in order.
First, confirm your Pro license is active. Inline editing is a Pro-only feature, gated at the plugin level by gt_is_premium(). Navigate to TableCrafter → Settings → License and verify the license status shows as active. A lapsed or missing license deactivates all Pro features silently rather than showing a frontend error message, so the table loads and looks normal but clicking cells has no effect.
Second, confirm the specific column has inline editing toggled on in the table builder. Open the Editing tab for the column in question. Not every Gravity Forms field type supports inline editing: text, number, email, textarea, select, radio, checkbox, and date fields are all supported. File upload fields use a separate edit guard and behave differently from the standard editable field types. If the field type is not in the supported list, the column cannot be made editable regardless of other settings.
Third, confirm the current user's role is permitted to edit. Check the edit role configuration in the table settings and compare it against the logged-in user's WordPress role. A user with insufficient role sees a read-only table with no visible indicator that editing exists.
Changes Save But Revert After Reload
This is almost always a caching issue. When a user saves a cell edit, TableCrafter fires an AJAX request to write the new value back to the Gravity Forms entry. The write succeeds and the cell reflects the new value immediately because the page was not reloaded. However, on the next full page load, a stale cached page replaces the AJAX-updated view with the old data.
If you are running a full-page cache such as WP Rocket, LiteSpeed Cache, or NitroPack, the cached HTML snapshot was taken before the edit. To fix this, either exclude the page from full-page caching entirely, or configure your cache plugin to bypass caching for logged-in users. The latter is the safer default for pages that contain editable tables, because logged-in users are the only ones who can edit.
A second, less obvious cause is object caching. If you use a persistent object cache such as Redis or Memcached, Gravity Forms entry queries may be served from that cache even after the database record is updated. Clear the object cache after the AJAX write if you suspect this. In most managed hosting environments, object caching can be scoped or disabled per request without degrading site-wide performance. Confirm by toggling off the object cache temporarily and retesting the edit-then-reload cycle.
Spinner Appears Then Disappears Without Saving
Open your browser developer tools (F12 or right-click and choose Inspect) and switch to the Network tab. Trigger an edit attempt. Look for the request to admin-ajax.php in the network request list. The HTTP status code on that request identifies the category of failure.
A 403 Forbidden response indicates a nonce validation failure or a capability check failure on the server. The most common causes are an expired browser session (log out and back in to regenerate a fresh nonce) or the current user not having the required role to edit the table configuration. Verify that your session is active and that the logged-in WordPress role matches the edit permissions in the table configuration.
A 500 Internal Server Error points to a PHP error during the AJAX handler execution. Enable WordPress debug logging by setting WP_DEBUG and WP_DEBUG_LOG to true in your wp-config.php, then retry the edit. The error details will appear in wp-content/debug.log. Common causes include a Gravity Forms API conflict, a missing or invalid entry ID in the payload, or a field value that reached the TC_Inline_Edit_Sanitizer with an unexpected data type for the field's sanitization rules.
What Are the Next Steps?
With inline editing enabled, you have a live editable table wired directly to Gravity Forms. From here, consider adding validation rules to prevent bad data from entering your system (see the guide on inline edit validation), restricting which roles can edit which columns (see role-gated inline editing), or enabling the diff badge feature so you can audit which cells have been changed in a session. The shortcode you placed today is the foundation every other inline editing feature builds on.
This step completes the connection between your data source and the TableCrafter table engine. Once saved, the plugin caches the connection credentials in the WordPress options table and uses them on every subsequent page load. If you update the source configuration later — for example, rotating an API key or changing a sheet URL — return to this step, enter the new value, and save again. The table updates immediately on next load without any shortcode changes.
Frequently Asked Questions
What do you need before you start?
Inline editing in TableCrafter requires the Pro tier Pro. Make sure you have:
What Is TableCrafter?
TableCrafter is a WordPress plugin that turns data from Gravity Forms, Google Sheets, Airtable, Notion, REST APIs, CSV files, and WooCommerce into interactive, sortable, filterable frontend tables. Embed any table on any WordPress page with the [tablecrafter] shortcode or the native Gutenberg block. No PHP or custom development required. The free version supports CSV, JSON, Google Sheets, and Excel. Pro adds Gravity Forms, Airtable, Notion, WooCommerce, REST APIs, inline cell editing, export to CSV, Excel (.xlsx), and JSON (PDF is browser print only, not a server export), role-based column visibility, and auto-refresh.
Does this require PHP or developer skills?
No. TableCrafter is configured entirely through the WordPress admin interface. You choose your data source, map fields to columns, and set display preferences using point-and-click controls. Embedding uses the [tablecrafter] shortcode or the native Gutenberg block.
Is the free version sufficient or do I need Pro?
The free plugin on WordPress.org supports CSV, JSON, Google Sheets, and Excel sources with unlimited tables, rows, and columns. Pro adds Gravity Forms, Airtable, Notion, WooCommerce, REST API sources, inline cell editing, bulk row actions, export to CSV, Excel (.xlsx), and JSON (PDF output uses the browser print dialog, not a server-generated file), role-based column visibility, and auto-refresh.
Ready to try it?
TableCrafter is free on WordPress.org. Pro unlocks inline editing, role-based permissions, and advanced data sources.
Column order is preserved across sessions. Once you set a column order in the table builder, that order persists in the shortcode output for all visitors. Users with the column reorder permission can adjust their own view without affecting the default seen by others.
If this step produces unexpected output, check the source data directly in the connected system. TableCrafter passes data through without modification — if a cell displays an unexpected value, the source record contains that value. Use the TableCrafter debug log (Settings > Advanced > Debug Mode) to trace the exact query sent to the source and the raw response received, which narrows the diagnosis to either a source-side or rendering-side issue.