This plugin hasn’t been tested with the latest 3 major releases of WordPress. It may no longer be maintained or supported and may have compatibility issues when used with more recent versions of WordPress.



This is a WordPress plugin that allows direct excel-like editing of
tables in your WordPress database. It’s goals are to provide useful,
simple, flexible database table admin screens.

It supports:

  • one table per admin screen, as many admin screens as desired
    • These are organized under a new “DB Table Editor” menu item
  • excel spreadsheet like interface using SlickGrid
  • Filter and Sort results
  • Add, Edit & Delete records
  • Custom buttons extensibility
  • Custom permissions per interface for viewing and editing
    (defaults to: edit_others_posts)

    • editing defaults to the same permission as viewing if not specified
  • CSV exports of filtered grid
  • Custom primary key names (but must be a single value / column)

Adding an Interface on the fly

If we go to look up a database table editor and we dont find it, but
there is a function named dbte_create_$tbl that matches, we will call
that function expecting it to return a dbte instance. This is useful
in situations where we may not have the data for a table editor in all
circumstances (EG: not every page has a member id, so only do it on
that particular page).

Adding an Interface from a plugin

If you need to add an interface from a plugin, you should use the
admin_menu action with a lower than default priority.

eg: add_action( 'admin_menu', 'my_load_tables', -10 );

Inside of the my_load_tables function you would include all the
calls to add_db_table_editor

Custom Buttons

Buttons can be created by pushing functions into
DBTableEditor.extraButtons. Each of these is a slick grid
rowButtonFormatter and should return a string of html.

out += fn(row, cell, value, columnDef, dataContext);

The button column width can be set by setting:
DBTableEditor.buttonColumnWidth before the ready function is called

Hooks / Actions

  • db-table-editor_enqueue_scripts is an action that will be called
    after enqueueing all plugin scripts and before enqueueing jsFile
    (if it exists)

    function dbTableEditorScripts(){
    add_action('db-table-editor_enqueue_scripts', 'dbTableEditorScripts');

dbte_row_deleted, dbte_row_updated, dbte_row_inserted

Called after a row is deleted, updated, or inserted passes


add_action(‘dbte_row_deleted’, ‘my_dbte_row_deleted’, 10, 2);

function my_dbte_row_deleted($currentTable, $idRemoved){
// do things

add_action(‘dbte_row_updated’, ‘my_dbte_row_upserted’, 10, 4);
add_action(‘dbte_row_inserted’, ‘my_dbte_row_upserted’, 10, 4);

function my_dbte_row_upserted($currentTable, $values, $columns, $indexedModified){
// do things



You can use a shortcode to include a dbte interface on a wordpress
page. Please use with care.

[dbte id=table-editor-id] – (id defaults to table)


  • Dont put an editable table editor on your public facing screens using the shortcode!


Feel free to ask support questions / open trouble tickets


Advanced Examples

Custom Javascript and Buttons on the table editor

See: examples/custom-buttons-and-js.php

Shows how to add custom javascript to a report page and adds a custom
load button on the grid

CF7 DB Submit Plugin integration

See: examples/cf7dbsubmit_integration.php

This is not a fully runnable example, but should give good examples of

  • working cf7dbsubmit plugin
  • Custom save delete hooks
  • custom complex sql building with this plugin
  • sending notifications on edit of specific fields

cf7dbsubmit stores its data in a “hashtable” format of:

form, submit_time, field_name, field_value

but we want to present this in a more excel fasion of each field being
a column of our spreadsheet and each row being a different submission

Contributers and Thanks

  • bobbysmith007 / – Primary developer of plugin
  • nikomuse – i18n support


  • Here’s a screenshot of it in action


This is installed the same way all wordpress plugins:

  • Drop the unzipped plugin directory into your wordpress install at

  • Activate the plugin via the WordPress Admin > “Plugins” menu

Adding an interface

DB-Table Editor Interfaces are added by calling the
add_db_table_editor function in your theme’s functions.php file.
This supports wp_parse_args style arguments.

  • title: what shows up in the H1 on the screen and in menues
    • ex: title=>"My Product Reports Page"
  • table: the table we wish to display / edit
    • ex: table=>"wp_my_custom_table"
  • id: the admin interface id (defaults to table)
    • ex: id=>"custom_table_interface_1"
  • id_column: the column in each row that names the id for the row
    • ex: id_column=>"id"
  • dataFn: a function that returns the data to be displayed /
    edited, defaults to select * from {table}. This should return ARRAY_N
    through wpdb->get_results. Alternatively it may return a DBTE_DataTable.
    dataFn is called with the arguemnts array to add_db_table_editor;

    • ex: dataFn=>"myCustomInterfaceFunction"
  • jsFile: the name of a registered script that will be enqueued for
    this interface

    • ex: jsFile=>"my-custom-interface-js"
  • cap: the capability a user needs to view/edit this interface,
    defaults to edit_others_posts

    • ex: cap=>"edit_others_posts"
  • editcap: the capability required to edit the grid, if not set
    all viewers are assumed to be editors

    • ex: editcap=>"edit_others_posts"
  • noedit: turns off the editing abilities (same as editcap=nosuchcapability)
    • ex: noedit=>true
  • columnFilters: Default column filters, this is an array of column->val
    to be applied as default column fitlers when the page is loaded

    • ex: columnFilters=>Array("Year"=>"2017")
  • columnNameMap: A map of actual column names to displayed label
    • Ex: columnNameMap=>Array('column_name'=>'Column Alias')
  • noedit_columns, hide_columns: You may wish to hide some columns
    or prevent edit. You may do so by setting these fields to the name
    of columns you wish hidden or uneditable (eg: the id)

    • Ex:noedit_columns=>"data,id" or noedit_columns=>Array('data', 'id')
  • save_cb, delete_cb: function names to be called with an array of data:
    the dbte, update array, column array and modified indexes array
    call_user_func($cur->save_cb,Array(‘table’=>$cur, ‘update’=>$up,
    ‘columns’=>$cols, ‘indexes’=>$idxs, ‘id’=>$id));
    If your call back inserts data it should fill in $data[‘id’] and accept data
    by reference
  • auto_date: should columns that appear to be datetimes, be treated as such
    This is based on the columns data type

    • Sort of buggy but allows some different date formats than iso8601
    • Ex:auto_date=>true
  • autoHeight: passes the autoHeight option to slickgrid (makes
    there not be a vertical scrollbar on the grid and instead in the

    • Ex:auto_height=>true
  • async_data: request data asyncronously instead of inlining
    it. Makes slow queries “seem” faster.

    • Ex:async_data=>true
  • default_values: an a_array of default values that new rows should have
    • Ex:default_values=>Array("name"=>"First M Last")
  • export_id_field: the field to use when limiting the export results
    • some sql needs a specific field – defaults to table.id_col
    • Ex:"export_id_field"=>"mytbl.fooid"




‘title’=>’Event Registrations’,
‘sql’=>’SELECT * FROM event_registrations ORDER BY date_entered DESC’


Reasons and Expectations

Previously my company had been using DB-toolkit to provide minimal
database interfaces for custom tables through the WordPress admin.
While the configuration was cumbersome for what we were doing, it did
work and was easier than writing anything. However, when DB-Toolkit
stopped being maintained and I couldn’t find a simple, but suitable
replacement, I decided to tackle my goals more head on

Use of this plugin requires a basic knowledge of PHP, and SQL. It was
written by a programmer to help accomplish his work and does not
currently provide admin configuration screens (instead simple function
calls in your theme’s functions file are used to configure the
screens). This was preferable to me, because my configuration is
safely in source control (a problem I had when DB-toolkit would
upgrade and lose all configuration).


  • I dont see any interface / nothing changed?
    • Did you complete the installation process, including appropriate
      add_db_table_editor calls?
    • My delete button is missing / I Can’t Edit
    • You either dont have editcap or id_column is misconfigured


April 19, 2020
Plug in is pretty good, but Documentation is poor. But once I gathered all the necessary informations from the ratings and Support Topics to get this plugin to work and understand the limitations of it, it works fine. One thing i’m still not sure about: Is it somehow possible to edit EAV based tables that have been grouped by a value? If yes, how? Or is another approach necessary or is it impossible? And if using joins it seems only possible to edit the ‘basic table’, or am I missing something? Would be nice if joined views would be fully editable, but of course I don’t understand the compelexity of the implementation of these functionalities. Clear statements about these things in the documentation would be helpful, also the example given could use more parameters, so every functionality (edit values, export, etc.) is possible. I just insert a working example here, maybe it helps someone in the future: if(function_exists(‘add_db_table_editor’)){ add_db_table_editor(array( ‘id’=>”custom_table_interface_1″, ‘title’=>’Mitglieder: Bezahlstatus, Handynummer und Telefonnummer Γ€ndern’, ‘table’=>’wp_users_zusaetze’, ‘cap’ => ‘edit_pages’, ‘edit_cap’ => ‘edit_pages’, ‘id_column’=> “ID”, “export_id_field”=>”z.ID”, ‘noedit_columns’ => ‘user_email, display_name’, ‘sql’=>”SELECT z.ID, u.user_email, u.display_name, z.user_bezahlstatus, z.Handynummer, z.Telefonnummer FROM wp_users_zusaetze z INNER JOIN wp_usermeta m ON m.user_id = z.user_id INNER JOIN wp_users u ON u.ID = m.user_id WHERE m.meta_key = ‘wp_capabilities’ AND m.meta_value LIKE ‘%mitglied%'” )); } like I said, only the values of the table ‘wp_users_zusaetze’ are editable, joined tables can’t be edited, but maybe I am doing something wrong.
October 24, 2018 1 reply
Russ, I sent you an email: 007. For help actually. If you can assist, I will assume the task of creating and maintaining the wp-db-table-editor wiki, which I noticed is patiently awaiting a good document manager such as myself. πŸ˜‰ Thanks either way.
July 26, 2018 6 replies
That’s an interesting plugin and it definitely deserves either 5 stars (if you are a programmer with high IQ) or 1 star (if you are not). LOL The author made a nice tool but it’s a nice only if you know what to do and have time to look trough his code if needed. One question – is there any way to add pagination, let say if I have a table with 20K records to prevent it loading as a whole in the admin panel? If not is there an easy way to accomplish this (being able to perform a search on the whole table if needed), thanks. EDIT (for those that don’t like to read docs): – to enable the plugin capabilities (to appear in the Admin menu) you must have the table defined already in the database and in functions.php (or elsewhere) to add at least a single line of code (example at the end); – to be able to add new lines, there should be a column “ID” or if it is different, to use the specific config rule; – the pagination is not needed at all – it’s super fast with large tables (>20K lines). Example code to enable the plugin in theme’s functions.php: if(function_exists('add_db_table_editor')){ add_db_table_editor('title=THE_TITLE_FOR_ADMIN_AREA&table=the_table_name'); }
April 25, 2017
Quick easy access to custom database tables from the wp-admin.
March 23, 2017 2 replies
Lost like 5-10 minutes to even search for the interface or where to find a menu item for this plugin. When heading to the description site, again nothing described where menu item should be found etc. Not thought through/documented well.
March 7, 2017 2 replies
Hello! Fine? I want resize the table that we define in functions.php and its cells ( width and height) by default, not manually. Like change the css plugin. It is possible? Because my table have long texts. I know is possible resize manually, i want the table and its cells (columns and rows) more bigger, enlarge the width and height for all cells of the table. Best Regards
Read all 19 reviews

Contributors & Developers

“WP-DB-Table-Editor” is open source software. The following people have contributed to this plugin.


“WP-DB-Table-Editor” has been translated into 1 locale. Thank you to the translators for their contributions.

Translate “WP-DB-Table-Editor” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.


For detailed information, please view:

Version: 1.6.0 – 2017-02-23
* New (customized) version of SlickGrid (branched from 6pac@github)
* allow access to the default filter and the filtered items
* Handle exports by sending a list of ids to export rather than
trying to recreate the full filter set serverside. Allows rather
arbitrary JS filtering functions without having to get nitty gritty
on the server

Version: 1.5.6 – 2017-02-22
* allow easy button column width configuration

Version: 1.5.5 – 2016-12-16
* fix deprecated constructor

Version: 1.5.4 – 2016-12-06
* trim noedit_columns!

Version: 1.5.3 – 2016-03-14
* Better numeric sorting

Version: 1.5.2 – 2015-11-28
* fixed confused ajax-vs-async nomenclature

Version: 1.5.1 – 2015-09-21
* Fixed bug with new rows without default values

Version: 1.5 – 2015-09-15
* replace update & insert call backs and actions with dbte_save
that passes an argument array instead of list of arguments.
should hopefully make upgrading easier (updated example).
This also allows the callback to set the “id” of the argument
array (should be passed by ref) in case of insert.
* async_data: option makes the grid pull data using ajax instead of
inlining it. This might make the page appear more responsive if
the query takes forever. You are probably better off improving
your query.
* when calling save ajax, pass all query arguments for the current
page. Also set default values along the way

Version: 1.4.2 – 2015-08-17
* bug fixes: new rows were not updating their id
* saving now submits the currently active cell if there is one

Version: 1.4.1 – 2015-06-19
* added some missing files for translation

Version: 1.4 – 2015-06-18
* nikomuse provided i18n support

Version: 1.3.2 – 2015-03-30
* introduce action db_table_editor_init, for other plugins
to use

Version: 1.3.1 – 2015-03-30
* Introduce PhpSqlParser and use it instead of my
half-implemented index scanning, for inserting the where clause

Version: 1.3 – 2015-02-18 10:30
* !! API CHANGE update_cb, delete_cb, and dbte_row_updated
all accept ID arguments — TODO: perhaps these should accept
keyword arg arrays, to make it handle upgrades more gracefully?

Version: 1.2.8 – 2015-02-04 10:30
* better docs
* better examples
* dbte_row_inserted, dbte_row_updated, dbte_row_deleted actions