Таблицы в админке WordPress (часть 1) 

Когда мы разрабатываем собственные плагины для Wordpress, иногда возникает необходимость создать пользовательскую таблицу, которая будет содержать необходимые данные.

При работе с данными плагина из админки не хочется создавать свой собственный дизайн таблицы, а лучше всего использовать дизайн WordPress, чтобы страница настроек вашего плагина соответствовала пользовательскому интерфейсу WordPress. А так же чтобы таблица с данными нашего плагина обладала теми же функциями: массовыми действиями, поиском, разбивкой на страницы, подсчетом данных и т.д.

Для этого мы будем использовать класс WP_List_Table.

Для чего нужен класс WP_List_Table?

Это базовый класс для создания таблиц с любыми данными в WordPress. Эти таблицы поддерживают технологию AJAX. Все таблицы в административной панели WordPress основаны на этом классе.

Для чего нужен класс WP_List_Table?

Этот класс позволяет нам отображать список содержимого с разбивкой по страницам, настройками экрана, поиском, массовыми действиями, сортировкой и многим другим.

Код класса WP_List_Table можно посмотреть в файле /wp-admin/includes/class-wp-list-table.php

В 2012 году был присвоен закрытый статус этому классу. Это значит, что он является частью ядра WordPress и не может использоваться в плагинах. Разработчики не обязаны обеспечивать обратную совместимость кода, связанного с этим классом. 

Однако, несмотря на это, разработчики плагинов все чаще стали использовать этот класс, поскольку он предоставляет удобный функционал для создания собственных таблиц в плагинах. 

Сегодня структура данного класса является достаточно стабильной, и маловероятно, что его будущие изменения сильно повлияют на код, созданный с его использованием. Тем не менее, разработчикам рекомендуется проверять работоспособность своего кода при каждом основном релизе WordPress. 

Подготовка

Чтобы выводить какие то данные, нужно скачала их создать. Например создадим таблицу с сотрудниками организации, в таблице будет содержаться имя сотрудника, его отдел и информация в отпуске ли он.

Для создания таблицы войдите в базу данных (например с помощью phpMyAdmin) и выполните следующий запрос:

CREATE TABLE `wp_adt_employees_table` 
( 
`id` int(20) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
`name` varchar(255) NOT NULL, 
`department` varchar(255) NOT NULL, 
`on_vacation` tinyint(1) NOT NULL 
); 

Далее наполним нашу таблицу данными:

INSERT INTO `wp_adt_employees_table` (`name`, `department`, `on_vacation`) 
VALUES ('Иван Петров', 'Отдел разработки ПО', 1), 
('Мария Сидорова', 'Отдел маркетинга и продаж', 0), 
('Олег Васильев', 'Отдел маркетинга и продаж', 0), 
('Сергей Кузнецов', 'Финансовый отдел', 0), 
('Анна Иванова', 'Отдел кадров', 1), 
('Виктор Сергеев ', 'Отдел логистики и доставки', 0);

В итоге получаем табличку:

Создаем плагин

Чтобы показать работу класса WP_List_Table создадим простой плагин, который будет просто на своей страничке выводить данные в виде таблицы.

В папке /wp-content/plugins создадим employees-admin-table.php и добавим в него следующую заготовку кода:

<?php
/* 
* Plugin Name: Сотрудники организации 
* Description: Плагин для демонстрации работы класса WP_List_Table 
* Version: 0.0.1 
* Author: Александр Третьяков 
* Author URI: https://tretyakov.net/ 
* License: GPLv2 or later 
* License URI: https://www.gnu.org/licenses/gpl-2.0.html 
* 
*/

// Загружаем файл с классом WP_List_Table 
if ( ! class_exists( 'WP_List_Table' ) ) {
	require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
}

// Создаем наш класс, который наследует WP_List_Table 
class Employees_List_Table extends WP_List_Table {
// Позже добавим сюда код 
}

// Добавляем ссылку на плагин в меню админки 
function my_add_menu_items() {
	add_menu_page( 'Сотрудники организации', 'Сотрудники организации', 'activate_plugins', 'employees_list_table', 'employees_list_init' );
}

add_action( 'admin_menu', 'my_add_menu_items' );


function employees_list_init() {
// Создаем экземпляр класса Employees_List_Table 
	$table = new Employees_List_Table();

	echo '<div class="wrap"><h2>Список сотрудников</h2>';
// Формируем таблицу 
	$table->prepare_items();
// Выводим таблицу 
	$table->display();
	echo '</div>';
}

Далее идем в список плагинов и активируем его:

У нас в меню появилась ссылка на страницу плагина, можем перейти на эту страницу, но пока там ничего нет (кроме ошибки function WP_List_Table::prepare_items() must be overridden in a subclass.)

Создаем таблицу

Первым методом, который мы собираемся добавить в наш класс, будет get_columns(), который позволяет нам создавать столбцы в нашей таблице.

С помощью него мы сделаем шапку с названиями столбцов. Добавим следующий код в наш класс:

// Создаем колонки нашей таблицы 
function get_columns() {
	$columns = array(
		'cb'  => '<input type="checkbox" />',
		'name' => 'Имя',
		'department' => 'Отдел',
		'on_vacation' => 'Сотрудник в отпуске?'
	);

	return $columns;
}

Далее мы должны определить метод prepare_items() в нашем классе, он подготавливает данные для таблицы. Это важный метод на нем строиться вся таблица. 

 Добавим код метода в наш класс:

function prepare_items() {
	$columns = $this->get_columns();
	$hidden = array();
	$sortable = array();
	$this->_column_headers = array( $columns, $hidden, $sortable );

	$this->items = [];
}

Теперь, если обновить страницу плагина, ошибки больше нет и мы видим пустую таблицу с нужными нам колонками:

Наполняем таблицу данными из БД

Теперь нам нужно передать массив методу prepare_items(), на данный момент передается пустой массив:

$this->items = [];

Добавим в наш класс метод  get_table_data(), который будет брать данные из базы данных:

// Забираем данные из БД 
private function get_table_data() {
	global $wpdb;

	$table = $wpdb->prefix . 'adt_employees_table';

	return $wpdb->get_results(
		"SELECT * from {$table}",
		ARRAY_A
	);
}

Мы берем данные из нашей таблице и возвращаем их в виде массива.

Определим в нашем классе приватное свойство table_data, куда будем помещать наш результирующий массив:

private $table_data; 

Теперь немного изменим метод prepare_items():

function prepare_items() {

	$this->table_data = $this->get_table_data();

	$columns = $this->get_columns();
	$hidden = array();
	$sortable = array();
	$primary = 'name';
	$this->_column_headers = array($columns, $hidden, $sortable, $primary);

	$this->items = $this->table_data;
}

Теперь чтобы увидеть данные в таблице нам осталось определить метод column_default() в нашем классе. 

function column_default( $item, $column_name ) {
	switch ( $column_name ) {
		case 'id':
		case 'name':
		case 'department':
		case 'on_vacation':
		default:
			return $item[ $column_name ];
	}
}

Обновляем страницу, уже лучше:

Только в первой колонке, где у нас должен быть чекбокс, пусто. Исправим это добавив еще один метод в наш класс:

function column_cb( $item ) {
	return sprintf(
		'<input type="checkbox" name="element[]" value="%s" />',
		$item['id']
	);
}

Все, мы справились с задачей и сделали вывод таблицы с данными нашего плагина. В следующей статье мы научимся работать с данными этой таблицы. Мы узнаем как добавить разбиение на страницы, использовать поиск, работать с настройками экрана и выполнять массовые действия с данными.

Весь код файла employees-admin-table.php можно посмотреть на Гитхабе.

Хостинг для ваших проектов