Как создать таблицу в панели администратора WordPress. Часть 2.2.

Как создать таблицу в панели администратора WordPress. Часть 2.2.

Доброго времени суток, уважаемые читатели блога!
Давайте продолжим разбирать наш плагин таблицы «по косточкам». И в этой части мы рассмотрим наш класс таблицы «Plance_Table_Lessons2».

Открыв наш класс, первым методом мы можем обнаружить «prepare_items()». Он отвечает за подготовку данных для отображения. Его вызов обязателен. Но а сам метод, имеет следующий код:

public function prepare_items()
{
	//Sets
	$per_page = $this -> get_items_per_page('plance_per_page', 10);

	/* Получаем данные для формирования таблицы */
	$data = $this -> table_data();

	/* Устанавливаем данные для пагинации */
	$this -> set_pagination_args( array(
		'total_items' => count($data),
		'per_page'    => $per_page
	));

	/* Делим массив на части для пагинации */
	$data = array_slice(
		$data,
		(($this -> get_pagenum() - 1) * $per_page),
		$per_page
	);

	$this -> _column_headers = $this -> get_column_info();

	/* Устанавливаем данные таблицы */
	$this -> items = $data;
}

строкой ниже мы получаем количество записей для нашей пагинации. Форму настройки мы настраивали в предыдущей статье. Смотрите метод «showScreenOptions».

$per_page = $this -> get_items_per_page('plance_per_page', 10);

данные о настройках пагинации, для каждого пользователя индивидуальны. И хранятся в таблице «wp_usermeta», саму запись можно найти по ключу «plance_per_page».

В данном уроке, мы немного сократили наш код. И заменили:

$this -> _column_headers = array(
	$this -> get_columns(),
	$this -> get_hidden_columns(),
	$this -> get_sortable_columns()
);

на:

$this -> _column_headers = $this -> get_column_info();

что выглядит более элегантнее 🙂

Правим метод «get_columns()», отвечающий за название наших колонок. И добавляем первым индексом массива чекбокс, для групповых действий над записями:

public function get_columns()
{
	return array(
		'cb' => '<input type="checkbox" />',
		....
	);
}

Теперь, нам нужно создать дополнительную колонку для чекбоксов наших записей. Это мы реализуем в отдельном методе:

function column_cb($item)
{
	return '<input type="checkbox" name="id[]" value="'.$item['ex_id'].'" />';
}

описывать метод думаю смысла нет, т. к. он достаточно прост.

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

function column_ex_title($item)
{
	return $item['ex_title'].' '.$this -> row_actions(array(
		'edit'	 => '<a href="?page='.$_REQUEST['page'].'&action=edit&book='.$item['ex_id'].'">редактировать</a>',
		'delete' => '<a href="?page='.$_REQUEST['page'].'&action=delete&book='.$item['ex_id'].'">удалить</a>',
	));
}

в данном случае, к названию нашей записи, посредством метода «row_actions()» мы присоединяем к ней две ссылки. Где ключ — уникальный идентификатор ссылки, а ее значение — ссылка или какой-либо текст. Количество ссылок может быть произвольным. Как формировать адреса ссылок — дело сугубо личное.

И самый последний метод который мы рассмотрим в этой статье. Это метод формирующий выпадающий список для групповых действий:

function get_bulk_actions()
{
	return array(
		'delete' => __('delete', 'plance'),
		'lock' => __('lock', 'plance'),
		'unlock' => __('unlock', 'plance'),
	);
}

Как видите, все просто. Достаточно попрактиковаться день-два и все будет понятно.
Но а в следующих статьях данного цикла, мы рассмотрим взаимодействие таблицы с данными из базы данных.

UPD. 2021-06-04. Добавил на гитхаб пример реализации таблицы в админке WP. Выгрузить можно по этой ссылке.

Поделиться в соцсетях:
Статьи на похожую тематику

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

Комментарии
  1. Олег

    Здравствуйте уважаемый автор. В процессе изучения Вашего плагина "Lessons "Tabele Create" Part 2" , скаченного по адресу: http://plance.top/wp-content/uploads/2016/02/plance-lessons-table-create-part2.zip
    я обнаружил, что в выпадающем меню "настройки экрана" - не работает функция выбора колонок таблицы для их отображения/скрытия. Не могли-ли Вы подсказать как это поправить.
    С уважением, Олег.

    ответить
    1. Pavel
      16.04.2016 в 19:57 автор блога

      Я знаю об этом. Проблема в значении переменной:

      $_REQUEST['page']

      А точнее из-за подчеркивания. Насколько я помню, она имеет вид "Plance_Table_Lessons2", а должна иметь - "plance-table-lessons2".

      ответить
      1. Олег

        Я смотрю Ваш код и вижу, что переменная $_REQUEST['page'] используется дважды в функции function column_ex_title($item) и больше нигде. Видимо что-то в другом месте...

        ответить
        1. Pavel
          16.04.2016 в 20:17 автор блога

          Без проверки утверждать не могу, но вот часть кода влияющая на это:

          $hook = add_menu_page(
          'Table',
          'Table',
          'manage_options',
          __CLASS__,
          array($this, 'createTable')
          );

          А точнее "__CLASS__", эта системная константа содержит название класса.
          А сама эта конструкция формирует пункт меню.

          ответить
  2. Олег

    Посмотрел константу "__CLASS__" В ней хранится Plance_INIT_Lessons2
    И что делать?

    ответить
    1. Pavel
      16.04.2016 в 20:32 автор блога

      Измените к примеру на это - "plance-table-lessons2"

      ответить
  3. Олег

    Все заработало. Спасибо за помощь.

    ответить
  4. Олег

    Здравствуйте, Павел. В Вашем лекционном материале есть функция prepare_items(). Там, ранее было:
    $this -> _column_headers = array(
    $this -> get_columns(),
    $this -> get_hidden_columns(),
    $this -> get_sortable_columns()
    );
    затем, стало:
    $this -> _column_headers = $this -> get_column_info();
    Вопрос. Как, в дальнейшем использовать функцию get_sortable_columns()
    для включения сортировки по столбцам.
    Спасибо.

    ответить
    1. Pavel
      17.04.2016 в 15:34 автор блога

      Здравствуйте, Олег!
      На данном этапе, на функцию "get_sortable_columns()" не обращайте внимание. Просто знайте что она отвечает за поля которые участвуют в сортировке. Она будет "реально" задействована когда данные будут браться из БД (в одном из следующих уроков). Ниже, пример кода который взаимодействует с глобальной переменной $_GET,значение которой и есть поля и направление сортировки:

      $per_page = $this -> get_pagination_arg('per_page');
      $order_ar = $this -> get_sortable_columns();
      $orderby = 'date_create';
      $order = 'DESC';

      if(isset($_GET['orderby']) && isset($order_ar[$_GET['orderby']]))
      {
      $orderby = $_GET['orderby'];
      }

      if(isset($_GET['order']))
      {
      $order = $_GET['order'] == 'asc' ? 'asc' : 'desc';
      }

      $sql = "SELECT *
      FROM `{$wpdb -> prefix}plance_xyz`
      {$this -> _getSqlWhere()}
      ORDER BY `{$orderby}` {$order}
      LIMIT ".(($this -> get_pagenum() - 1) * $per_page).", {$per_page}
      ";

      return $wpdb -> get_results($sql, ARRAY_A);

      ответить
  5. Владимир

    Доброго времени суток!
    Подскажите а как вывести данные на главную страницу например?

    ответить
    1. Pavel
      11.12.2020 в 08:19 автор блога

      Здравствуйте, Владимир. Вывести можно используя методы объекта WPDB - get_results, get_var, get_row, get_col, пр.
      Смотрите статью - https://plance.top/wordpress/vzaimodeystvie-plagina-s-bazoy-dannyih-wordpress-chast-2.html

      ответить
  6. Иван

    Добрый день.
    Не планируется ли продолжение статей или все заглохло?

    ответить
    1. Pavel
      03.06.2021 в 15:09 автор блога

      Здравствуйте, планируется. Но когда когда будет продолжение - сориентировать не могу.

      ответить
  7. Александр

    Добрый день.

    Появилась мысль написать похожий комментарий, каки Иван. Эх 🙁 материал очень хороший и изложен понятным языком. В ру сегменте я даже близко похожего не нашел (имею ввиду гайд от А до Я). Жаль что продолжение пока не планируется.

    А могли бы дать совет, возможно по нему закончить смогу. Мне осталось все это дело подружить с БД. В сети я находил различные варианты взаимодействия, через WP_List_Table{}, dbDelta() - ранее дел с произвольными не имел и немножо растерялся, что выбрать.

    Я в двух словах опишу ситуацию, может вы подскажите какой подход лучше всего:
    >> В таблице будут хранится данные сплит-тестирования (5 столбцов в поле + id). То есть я не пытаюсь сделать аналог постов, с таксономиями или другими прелестями. Изменение некоторых значений в строках будет производится через запросы (в админке возможности редактирования не будет- только просмотр).

    Примерно так...методы отвечающие за CRUD сделаю, мне понять бы сам принцип:
    Где объявить создание таблицы (понимаю, что в классе для взаимодействия с таблицей - я назвал SplitTestingCreateTable). На каком этапе - конструктор (и делать проверку версии, что бы каждый раз не пыталась создаваться таблица), в статическом методе.

    Если приоткроете завесу этой, темной для меня темы, буду очень вам признателен 🙂

    P.S. но в любом случае - спасибо, материал в предыдущих статьях - отличный!

    ответить
    1. Pavel
      03.06.2021 в 20:51 автор блога

      Здравствуйте. Ваша почта в комментарии указана правильно? Постараюсь завтра выслать вам рабочий код.

      ответить
      1. Александр

        Совершенно верно, на неё получил уведомление 🙂

        Если вы вышлете исходник - это будет бомба =) впереди выходные, как раз можно будет спокойно разобраться, а не по 2-3 часа после работы!

        ответить
        1. Pavel
          03.06.2021 в 20:58 автор блога

          Или вышлю или где-то в статье прикреплю. Вам отпишусь 🙂

          ответить
          1. Sergey

            Я тоже хочу рабочий код для манипулирования данными из базы данных =)

          2. Pavel
            11.06.2021 в 12:16 автор блога

            Код на гитхабе, ссылка в конце статьи.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *