Using WP_List_Table To Render Custom Tables in the WordPress Admin
To display a custom table in the WordPress admin using WP_List_TableFollow this structured approach:
- Add a Custom Menu to the Admin Start by registering a custom menu using the add_menu_page() or add_submenu_page() function. This will create a new page in the admin panel where your table will be displayed.
function add_a_menu_for_wp_list() { add_menu_page( 'Custom Table', 'Custom Table', 'manage_options', 'my-custom-table', [ $this, 'render_my_custom_admin_table'] ); } function render_my_custom_admin_table() { $table = new MyCustomListTable(); $table->prepare_items(); echo '<div class="wrap">'; echo '<h1 class="wp-heading-inline"> WP List</h1>'; echo '<form method="post">'; $table->display(); echo '</form>'; echo '</div>'; } add_action( 'admin_menu', array( $this, 'add_a_menu_for_wp_list' ) );
- Render the Table on the Menu Page Inside the callback function for the admin menu, do the following:
Create an instance of your custom table class (which extends WP_List_Table).
Call the prepare_items()
method to prepare the data.
Call the display()
method to render the table.
$table = new \WeLabs\Demo\MyCustomListTable(); $table->prepare_items(); $table->display();
- Implement the prepare_items() Method Inside your custom table class, the prepare_items() method is responsible for:
Fetching data (e.g., from the database).
Setting up columns, hidden columns, and sortable columns.
Assigning the result to $this->items.
$this->_column_headers = array( $this->get_columns(), array(), array() );
$this->items = $data;
- Define Columns with get_columns() The get_columns() method returns an associative array of columns where:
The key is the column slug.
The value is the column label.
public function get_columns() { return array( 'name' => esc_html__( 'Name', 'domain_name' ), 'email' => esc_html__( 'Email', 'domain_name' ), ); }
- Render Individual Columns For each column, define a method column_{column_name}($item) to control how data should be rendered.
public function column_name( $item ) { return esc_html( $item->name ); }
Full code of the instance that extends WP_List_Table :
<?php namespace Samrat\Demo; if ( ! class_exists( 'WP_List_Table' ) ) { require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php'; } use WP_List_Table; class MyCustomListTable extends WP_List_Table { public function __construct() { parent::__construct( array( 'singular' => __( 'Item', 'domain_name' ), 'plural' => __( 'Items', 'domain_name' ), 'ajax' => false, ) ); } /** * Define the columns displayed in the table. * * @return array */ public function get_columns() { return array( 'name' => esc_html__( 'Name', 'domain_name' ), 'email' => esc_html__( 'Email', 'domain_name' ), ); } /** * Render the Name column. * * @param object $item * @return string */ public function column_name( $item ) { return esc_html( $item->name ); } /** * Render the Email column. * * @param object $item * @return string */ public function column_email( $item ) { return esc_html( $item->email ); } /** * Prepare table data, columns, and pagination. */ public function prepare_items() { global $wpdb; $table_name = $wpdb->prefix . 'custom_form'; $data = $wpdb->get_results( "SELECT * FROM {$table_name} ORDER BY created_at DESC" ); // Define column headers $columns = $this->get_columns(); $hidden = array(); $sortable = array(); // Add sortable columns if needed $this->_column_headers = array( $columns, $hidden, $sortable ); $this->items = $data; } }
Result:
Thank you for reading this article. :)
Top comments (0)