WordPress already ships with everything you need to put a table inside a post. No install screen, nothing extra sitting in your updates list.
The block editor has a Table block built in. There’s also the Custom HTML block, which takes raw markup and leaves it alone, and for data that repeats or changes, a shortcode registered in functions.php does the job.
One thing to know before you commit to the native route: the core Table block still cannot merge or split cells. That request sits open in WordPress’s own Gutenberg repository on GitHub, unresolved as of 2026.
Table of Contents
Which Method Should You Use to Create a Table in WordPress
Most people want the Table block. It sits in the editor, it takes about ninety seconds, and it never asks you to think about markup.
The other options earn their place under specific conditions: exact attribute control, an old site still running TinyMCE, or data that refuses to sit still.
| Method | Skill Level | Setup Time | Best Use Case |
|---|---|---|---|
| Table block | Beginner | Under 2 minutes | Quick comparison or pricing table in a post |
| Custom HTML block | Intermediate | 5 to 10 minutes | Styled tables with custom attributes |
| Classic Editor | Intermediate | 5 to 10 minutes | Legacy sites still running TinyMCE |
| Shortcode | Advanced | 20+ minutes | Recurring or database driven tables |
Developers maintaining client sites reach for shortcodes more often than anyone else, and there’s a reason for that. WooCommerce renders several of its own front end elements the same way, through shortcodes tied to WP_Query.
How to Create a Table With the Table Block

Insert the Table block, tell it how many columns and rows you want, then type into the cells. Header and footer rows appear once you switch them on from the block toolbar.
- Open a post or page in the editor and click the plus icon to open the block inserter
- Search for Table and select it from the results
- Enter the number of columns and rows you need, then click Create Table
- Click into any cell and start typing your content
- Open the block toolbar and toggle Header section or Footer section if your data needs one
- Add or remove rows and columns later from the block sidebar, no need to rebuild the table from scratch
Nothing here touches code. That’s the whole appeal of the block over the other three methods.
How to Add a Table With the Custom HTML Block
This one skips the visual editor entirely. You paste real table markup into the post and WordPress renders it.
- Add a Custom HTML block from the inserter
- Type or paste your table markup, starting with the opening table tag
- Add tr, th, and td tags for each row and cell
- Switch to the Preview tab inside the block to check how it renders
- Publish the post once the layout looks right
Not everything survives the save, though. Inline script tags get removed, unrecognized custom attributes get dropped, and style tags outside the allowed list go the same way. That filtering runs through wp_kses_post, a core WordPress function that sanitizes content the same way everywhere in the editor, not just inside this one block.
The post’s own Code editor mode, opened from the more tools menu, shows this markup alongside every other block on the page. Worth a quick look before publishing.
How to Add a Table in the Classic Editor
TinyMCE, the editor behind Classic Editor, never shipped with a table button. You still add one. It just happens through the Text tab instead of a menu.
Before writing this method off as ancient history, the Classic Editor plugin remains active on 8 million plus WordPress installs, according to its official WordPress.org listing (2026). That’s a real slice of the web still editing this way.
- Open the post in the Classic Editor screen
- Click the Text tab above the editing area, next to Visual
- Type your table markup directly, the same table, tr, th, and td tags used in the Custom HTML block
- Switch back to the Visual tab to preview how it looks
- Save or publish once the table renders correctly
If you already built the markup in a Custom HTML block somewhere else, copy it into the Text tab. Saves typing the same tags twice.
How to Build a Table From a Shortcode
A shortcode based table generates its markup from PHP instead of typed out HTML. That distinction matters once the data changes often or repeats across pages.
Say the same table appears on fifty pages. One edit to the callback updates every instance, and nobody has to open fifty posts. Rows can also pull automatically from custom fields without anyone touching post content, which is where Advanced Custom Fields pairs nicely for structured, repeatable data.
- Open your child theme’s functions.php file, or a custom plugin file if you keep code out of the theme
- Register the shortcode through the Shortcode API using add_shortcode, giving it a unique tag such as team_table
- Write the callback function that builds and returns the table markup as a string
- Pull dynamic rows with WP_Query when the data lives in custom posts, or hardcode static rows when it does not
- Drop the shortcode into any post or page using its tag inside square brackets
WooCommerce runs on this exact pattern. Its own shortcodes, the ones behind product grids and cart displays, register through add_shortcode and pull live data instead of static markup.
For a fully dynamic front end list rather than a fixed table, the block editor’s Query Loop block covers similar ground without any PHP at all.
Styling a WordPress Table

The Table block comes with its own styling controls, so no CSS is required unless you want more than the basics.
- Stripes, alternating row background for easier scanning
- Border color and width, set from the block sidebar
- Background and text color, applied per cell or across the whole table
- Wide or full width alignment, useful when a table needs more room than the text column gives it
| Style Control | Where It Lives | What It Changes |
|---|---|---|
| Stripes toggle | Block sidebar, Style panel | Alternating row background color |
| Border color | Block sidebar, Border panel | Cell border color and width |
| Alignment | Block toolbar | Wide or full width layout |
| Custom CSS | Custom HTML block or theme.json | Anything the sidebar does not expose |
Block themes like Twenty Twenty-Four inherit their base table colors from theme.json, so a table can match the site’s palette before anyone opens a sidebar setting.
Classic themes get none of that. Table colors there still need manual CSS, since theme.json only powers block themes.
And when the sidebar can’t do what you want (custom cell padding is the usual one), you drop back into the Custom HTML block and write plain CSS.
Making a WordPress Table Responsive and Accessible
A table that only works on a desktop screen, read by a mouse and a full set of eyes, fails a large share of the people who land on it.
Small screens and assistive technology need different fixes, and neither one solves the other.
Fixing Table Overflow on Small Screens
A wide table breaks a mobile layout the moment its columns stop fitting.
Mobile devices now account for roughly 52% of global website traffic (StatCounter, 2026), which means a table that only behaves on desktop is failing most visitors before they read a single cell.
The usual fix is to wrap the table in a container set to overflow-x scroll or auto, so the table scrolls sideways inside its own box instead of stretching the whole page.
- Works inside the Custom HTML block, wrapped in a div with a scoped style attribute
- Works in a shortcode callback, wrapped the same way before the table markup is returned
- The Table block has no built in overflow setting, so this fix lives outside the block itself
Adding Scope and Caption Markup for Screen Readers
Two bits of markup do most of the work. A caption element, placed as the first child inside the table tag, names what the table contains. A scope attribute on each header cell, set to row or col, tells a screen reader which cells that header describes.
WebAIM’s 2024 survey found 71.6% of screen reader users navigate a page mainly by its structure, the same reliance a caption and properly scoped header cells serve inside a table. The same survey found 91.3% of respondents use a screen reader on a mobile device, so the overflow fix above and this one end up solving different halves of the same problem.
Neither the Table block nor the Custom HTML block adds scope automatically. Both need it typed in by hand.
When Should You Use a Table Plugin Instead
Sorting, searching, live filtering, pagination. None of the native methods provide any of it, and that’s the line where a plugin starts earning its place.
Native Method: Pros and Cons
On the plus side, nothing extra runs. No added database queries beyond what WordPress already does for the page, no plugin update to track, no new thing that can break during a theme update. You also get full control over the markup, down to individual cell attributes.
The cost shows up in maintenance. There’s no sorting, searching, or pagination, and editing a large table means going cell by cell or rewriting a shortcode callback.
Fine for a handful of rows. Awkward past a few dozen.
When a Plugin-Free WordPress Table Does Not Work
Live search, pagination, automatic updates from an outside source. The native methods handle none of it.
Past a certain size, typed or hardcoded rows simply stop being practical to maintain by hand.
- Large datasets, hundreds of rows or more, that visitors need to search or filter
- Data that changes daily and lives somewhere other than WordPress, like a shared spreadsheet
- Non-technical editors who need a visual interface for sorting columns or adding rows without touching code
- Ecommerce tables tied to cart logic, stock levels, or live pricing rules
Teams that outgrow a static table often end up embedding a live Airtable base or a shared Google Sheet instead. If the source data arrives as a CSV file, a CSV to Google Sheets workflow can move that data into a shared spreadsheet before it is embedded or connected to the site. None of the four native WordPress methods here can reproduce that kind of automatically maintained data source.
At that point, a plugin or a dedicated embed is doing a job a WordPress table was never built to do.
When a plugin makes more sense for WordPress tables
Tables keep data readable, and most sites need one sooner or later. Free table generators and plain HTML work fine for small, static tables.
Once the data changes often, comes from a spreadsheet, or needs sorting and search, a plugin saves a lot of manual work. My pick for that is wpDataTables.

What wpDataTables does
It has over 60,000 active installations on WordPress.org and a 4.5 star rating. The free Lite version is enough to get started.
You can build a table from scratch with the built-in editor (merge cells, add star ratings, media and custom links). Or you can import one from Excel, CSV, XML, JSON or a PHP array. Premium adds MySQL queries and Google Sheets, including private sheets through the API.
Tables are responsive by default, so they adjust to desktop, tablet and phone screens. Every table except the simple ones also gets search, sorting, pagination and export buttons (Copy, CSV, PDF, XLS and Print).
Publishing is simple. Paste a shortcode, or use the Gutenberg block. Elementor, Divi, Avada and WPBakery are supported too.
Free vs premium at a glance
| Feature | Lite (free) | Premium |
|---|---|---|
| Simple table builder | Yes | Yes |
| Excel, CSV, XML, JSON, PHP array import | Yes | Yes |
| Google Charts and Chart.js | Yes | Yes |
| Highcharts and ApexCharts | No | Yes |
| Front-end editing | No | Yes |
| Conditional formatting (highlighting) | No | Yes |
| MySQL tables and private Google Sheets | No | Yes |
| WooCommerce product tables | No | Yes |
Charts from the same data
You can turn any table into a chart with the chart wizard. Go to wpDataTables, then Create a Chart, pick an engine and a chart type, choose the table, and select the columns and rows.
The free version supports 23 chart types through Google Charts and Chart.js, including line, column and pie charts. A live preview shows the result before you save it.
There is also a “Follow table filtering” option. When a visitor filters the table, the chart redraws to match the visible rows.
Try it before you install
The sandbox demo gives you a working back end to click around in. The documentation is solid, with step-by-step guides and video for each data source.
One honest caveat. The feature set is big, so expect a short learning curve.
Why Your Table Block Is Missing or Not Showing Correctly
Table problems tend to come from an outdated WordPress version, a theme or plugin conflict, or markup that got altered on save. Rarely from the block itself.
Table Block Missing From the Inserter
The inserter search comes up empty for Table on a small number of sites, almost always for the same handful of reasons.
- Confirm WordPress is on a current version, since the block editor ships as core, not as a separate plugin
- Check whether a page builder plugin has replaced the default block inserter entirely
- Deactivate other block related plugins one at a time to isolate a conflict
- Clear any caching plugin, since a cached admin screen can hide a block that was added in a recent update
The block itself hasn’t moved. Something sitting between it and the inserter usually has.
Table Markup Stripped After Saving
Two different systems can alter table markup, and confusing one for the other wastes an afternoon.
Block validation is the first. The Table block checks its own saved HTML against what it expects to generate, and markup edited outside the block, then pasted back in, often fails that check and gets flagged as invalid on reload.
Manual edits inside Code editor mode cause the second. Change a table’s structure there without matching the block’s expected attributes and you trigger the same validation error, which is when WordPress offers a recovery option instead of rendering the table normally.
Rebuilding the row or column from inside the block, rather than editing the underlying HTML, avoids the conflict entirely.
Table Not Responsive on the Front End
A table that looks fine inside the editor but breaks on the live site usually points to the theme, not the table.
| Symptom | Likely Cause |
|---|---|
| Table overflows the page horizontally | Theme CSS missing a max-width or overflow rule on tables |
| Table renders but ignores block colors | Theme stylesheet overriding block level CSS |
| Table columns collapse oddly on mobile | No responsive rule defined for the table element at all |
Switching to a current block theme, one built against core table styles from the start, usually resolves this without a single line of custom CSS.
FAQ on How To Create A Table In WordPress Without A Plugin
What’s the difference between the Table block and a raw HTML table?
On the front end, nothing. Both output identical table, tr, and td tags.
The difference sits in how you build it. The Table block gives you a visual interface plus sidebar styling controls. Raw HTML in the Custom HTML block gives you neither, and full control instead.
Do table blocks work the same in classic themes and block themes?
No. Block themes pull table colors from theme.json automatically, matching the site’s global styles.
Classic themes rely on the theme’s own stylesheet instead, so a table’s default look depends entirely on how that theme wrote its CSS.
Can you sort or filter a WordPress table without a plugin?
Static markup is all you get from the Table block, the Custom HTML block, and the Classic Editor. No sorting, no filtering.
A shortcode can add basic JavaScript sorting if you write it, but a real filtering interface comes from a dedicated table plugin.
Can you copy a table from Google Sheets or Excel into WordPress?
Yes. Copy the cells, paste directly into a Table block, and WordPress usually preserves rows and columns.
Formatting is another matter. Complex formatting rarely survives, so check merged cells, colors, and formulas afterward before you publish.
Does the Table block support merged cells?
Not natively. There’s no colspan or rowspan control anywhere in the block interface.
The Custom HTML block accepts both attributes directly in raw markup, which makes it the practical workaround for a table that needs merged cells.
Does a table slow down page load speed?
A native table adds no extra requests. It’s plain HTML rendered with the rest of the page.
A shortcode pulling from WP_Query adds a small database query. A table plugin typically adds more, through extra CSS and JavaScript assets.
What You Should Verify First
Start with the markup itself. Open the published post, inspect the rendered table in the browser, and confirm every row and column appears exactly as typed before you look at styling, responsiveness, or accessibility markup.
The order goes like this.
- Markup validity first, since mismatched HTML can silently drop a row on the next edit
- Responsive behavior second, tested by narrowing the browser below the point columns start crowding
- Caption and scope attributes last, since they affect meaning for screen readers over visual rendering
Checking markup ahead of visual polish means a table can go live looking plain while a striped style or custom border waits for a second pass.




