Como implementar WP_List_Table? WP_List_Table dando matriz em vez de um valor na tabela de listview

Estou tentando implementar WP_List_Table para o meu plugin. Passei por este tutorial e use seu plugin de amostra .

Eu instalei esse plugin e acabei de alterar o nome da tabela e fiz uma modificação leve nas seguintes funções:

column_name, get_columns e get_sortable_columns

Agora está mostrando a tabela, mas em vez de valor está mostrando matriz de linha. Veja a imagem:

insira a descrição da imagem aqui

Estrutura da tabela:

CREATE TABLE IF NOT EXISTS `wp_fa_user_logins` ( `id` int(11) NOT NULL, `user_id` int(11) DEFAULT NULL, `time_login` datetime NOT NULL, `time_logout` datetime NOT NULL, `ip_address` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, `browser` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, `operating_system` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, `country_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, `country_code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, `time_last_seen` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci AUTO_INCREMENT=4 ; 

Meu Código:

  __( 'Customer', 'sp' ), //singular name of the listed records 'plural' => __( 'Customers', 'sp' ), //plural name of the listed records 'ajax' => false //does this table support ajax? ] ); } /** * Retrieve customers data from the database * * @param int $per_page * @param int $page_number * * @return mixed */ public static function get_customers( $per_page = 5, $page_number = 1 ) { global $wpdb; $sql = "SELECT * FROM {$wpdb->prefix}fa_user_logins"; if ( ! empty( $_REQUEST['orderby'] ) ) { $sql .= ' ORDER BY ' . esc_sql( $_REQUEST['orderby'] ); $sql .= ! empty( $_REQUEST['order'] ) ? ' ' . esc_sql( $_REQUEST['order'] ) : ' ASC'; } $sql .= " LIMIT $per_page"; $sql .= ' OFFSET ' . ( $page_number - 1 ) * $per_page; $result = $wpdb->get_results( $sql, 'ARRAY_A' ); return $result; } /** * Delete a customer record. * * @param int $id customer ID */ public static function delete_customer( $id ) { global $wpdb; $wpdb->delete( "{$wpdb->prefix}fa_user_logins", [ 'ID' => $id ], [ '%d' ] ); } /** * Returns the count of records in the database. * * @return null|string */ public static function record_count() { global $wpdb; $sql = "SELECT COUNT(*) FROM {$wpdb->prefix}fa_user_logins"; return $wpdb->get_var( $sql ); } /** Text displayed when no customer data is available */ public function no_items() { _e( 'No customers avaliable.', 'sp' ); } /** * Render a column when no column specific method exist. * * @param array $item * @param string $column_name * * @return mixed */ public function column_default( $item, $column_name ) { switch ( $column_name ) { case 'address': case 'city': return $item[ $column_name ]; default: return print_r( $item, true ); //Show the whole array for troubleshooting purposes } } /** * Render the bulk edit checkbox * * @param array $item * * @return string */ function column_cb( $item ) { return sprintf( '', $item['ID'] ); } /** * Method for name column * * @param array $item an array of DB data * * @return string */ function column_name( $item ) { $delete_nonce = wp_create_nonce( 'sp_delete_customer' ); $title = '' . $item['user_id'] . ''; $actions = [ 'delete' => sprintf( 'Delete', esc_attr( $_REQUEST['page'] ), 'delete', absint( $item['id'] ), $delete_nonce ) ]; return $title . $this->row_actions( $actions ); } /** * Associative array of columns * * @return array */ function get_columns() { $columns = [ 'cb' => '', 'user_id' => __( 'User Id', 'sp' ), 'browser' => __( 'Browser', 'sp' ), 'ip_address' => __( 'IP', 'sp' ) ]; return $columns; } /** * Columns to make sortable. * * @return array */ public function get_sortable_columns() { $sortable_columns = array( 'user_id' => array( 'user_id', true ), 'browser' => array( 'browser', false ), 'ip_address' => array( 'ip_address', false ), ); return $sortable_columns; } /** * Returns an associative array containing the bulk action * * @return array */ public function get_bulk_actions() { $actions = [ 'bulk-delete' => 'Delete' ]; return $actions; } /** * Handles data query and filter, sorting, and pagination. */ public function prepare_items() { $this->_column_headers = $this->get_column_info(); /** Process bulk action */ $this->process_bulk_action(); $per_page = $this->get_items_per_page( 'customers_per_page', 5 ); $current_page = $this->get_pagenum(); $total_items = self::record_count(); $this->set_pagination_args( [ 'total_items' => $total_items, //WE have to calculate the total number of items 'per_page' => $per_page //WE have to determine how many items to show on a page ] ); $this->items = self::get_customers( $per_page, $current_page ); } public function process_bulk_action() { //Detect when a bulk action is being triggered... if ( 'delete' === $this->current_action() ) { // In our file that handles the request, verify the nonce. $nonce = esc_attr( $_REQUEST['_wpnonce'] ); if ( ! wp_verify_nonce( $nonce, 'sp_delete_customer' ) ) { die( 'Go get a life script kiddies' ); } else { self::delete_customer( absint( $_GET['customer'] ) ); // esc_url_raw() is used to prevent converting ampersand in url to "#038;" // add_query_arg() return the current url wp_redirect( esc_url_raw(add_query_arg()) ); exit; } } // If the delete bulk action is triggered if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'bulk-delete' ) || ( isset( $_POST['action2'] ) && $_POST['action2'] == 'bulk-delete' ) ) { $delete_ids = esc_sql( $_POST['bulk-delete'] ); // loop over the array of record IDs and delete them foreach ( $delete_ids as $id ) { self::delete_customer( $id ); } // esc_url_raw() is used to prevent converting ampersand in url to "#038;" // add_query_arg() return the current url wp_redirect( esc_url_raw(add_query_arg()) ); exit; } } } class SP_Plugin { // class instance static $instance; // customer WP_List_Table object public $customers_obj; // class constructor public function __construct() { add_filter( 'set-screen-option', [ __CLASS__, 'set_screen' ], 10, 3 ); add_action( 'admin_menu', [ $this, 'plugin_menu' ] ); } public static function set_screen( $status, $option, $value ) { return $value; } public function plugin_menu() { $hook = add_menu_page( 'Sitepoint WP_List_Table Example', 'SP WP_List_Table', 'manage_options', 'wp_list_table_class', [ $this, 'plugin_settings_page' ] ); add_action( "load-$hook", [ $this, 'screen_option' ] ); } /** * Plugin settings page */ public function plugin_settings_page() { ?> 

WP_List_Table Class Example

customers_obj->prepare_items(); $this->customers_obj->display(); ?>

'Customers', 'default' => 5, 'option' => 'customers_per_page' ]; add_screen_option( $option, $args ); $this->customers_obj = new Customers_List(); } /** Singleton instance */ public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } } add_action( 'plugins_loaded', function () { SP_Plugin::get_instance(); } );

Solutions Collecting From Web of "Como implementar WP_List_Table? WP_List_Table dando matriz em vez de um valor na tabela de listview"

Olhe para este código

 public function column_default( $item, $column_name ) { switch ( $column_name ) { case 'address': case 'city': return $item[ $column_name ]; default: return print_r( $item, true ); //Show the whole array for.... } } 

Uma vez que você está tentando apenas renderizar user_id , browser e ip_address e aqueles não estão disponíveis no caso de switch, que padrão é o caso padrão e o caso padrão imprime toda a matriz do item como esse ( return print_r( $item, true ); )