Разработка сайтов на WordPress и фреймворке Yii2

Здесь Вы можете заказать полный пакет услуг по разработке сайта. Начиная от написания ТЗ до программирования на PHP, JavaScript и верстке.

Взаимодействие плагина с базой данных WordPress. Часть 2

Взаимодействие плагина с базой данных WordPress. Часть 2

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

CREATE TABLE IF NOT EXISTS `wp_plance_text_shortcodes` (
  `sh_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `sh_title` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL,
  `sh_code` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL,
  `sh_description` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `sh_is_lock` tinyint(1) unsigned NOT NULL,
  `sh_date_create` int(10) unsigned NOT NULL,
  PRIMARY KEY (`sh_id`)
) ENGINE=InnoDB;

Такую структуру, на данный момент имеет таблица моего плагина «My Text Shortcodes». При желании, вы можете скачать этот плагин с этой страницы.

Добавление данных

Для сохранения данных в свою таблицу WordPress, я обычно пользуюсь следующим методом:

$wpdb -> insert(
	$wpdb -> prefix.'plance_text_shortcodes',
	array(
		'sh_title'		 => $data_ar['sh_title'],
		'sh_code'		 => $data_ar['sh_code'],
		'sh_description' => $data_ar['sh_description'],
		'sh_is_lock'	 => $data_ar['sh_is_lock'],
		'sh_date_create' => time(),
	),
	array('%s', '%s', '%s', '%d', '%s')
);

Разберем его подробнее. И первое что вы должны сделать (то что не показано в примере выше), так это объявить глобальную переменную «$wpdb». Без нее как вы понимаете, поработать с БД WP у нас не получится. Для этого, в начале метода разместите следующий код:

global $wpdb;

Таким образом, мы «включаем» в область видимости нашей функции или метода - объект работы с базой данных «wpdb».

Для «вставки» и сохранении данных, используется функция «insert» имеющая следующий вид и параметры:

insert( $table, $data, $format = null )

где:
$table — название таблицы в которую будут записаны данные
$data — массив данных, где ключ — название поля, а значение ключа — данные которые будут записаны в эти поля
$format — массив форматов данных полей в предыдущем массиве. Т.е., если первый параметр массива «$data» — число, этот массив должен определять этот параметр как число. Если строка — то определять должен как строку. Все это нужно, что бы обезопасить нашу базу данных, и сайт от вредоносного кода. Если данный параметр не указывать, то судя по документации, все параметры по умолчанию будут считаться как числа.

Возвращаясь к примеру выше, в качестве названия таблицы мы указали:

$wpdb -> prefix.'plance_text_shortcodes',

где:
«$wpdb -> prefix» - префикс нашей таблицы
«plance_text_shortcodes» - название нашей таблицы

Вторым параметром у нас идет массив ключей с содержимым:

array(
	'sh_title'		 => $data_ar['sh_title'],
	'sh_code'		 => $data_ar['sh_code'],
	'sh_description' => $data_ar['sh_description'],
	'sh_is_lock'	 => $data_ar['sh_is_lock'],
	'sh_date_create' => time(),
),

Здесь все достаточно просто. При желании, можете сравнить ключи массива с полями таблицы (они приведены в первом фрагменте кода)

Последним параметром идет фильтр значений:

array('%s', '%s', '%s', '%d', '%s')

где:
%s — строка
%d — число

Честно сказать не помню, почему time() имеющий числовое значение, я указал как строка. Но если не ошибаюсь, то WP его обрезал.

Обновление данных

Не поверите 🙂 но здесь практически все аналогично созданию:

update( $table, $data, $where, $format = null, $where_format = null )

где:
$table — название таблицы данные которой будут обновлены
$data — массив данных, где ключ — название поля, а значение ключа — данные которые будут записаны в эти поля
$where — массив условий
$format — массив форматов данных полей в массиве «$data»
$where_format — массив форматов данных полей в массиве «$where»

А вот и пример, наглядно это демонстрирующий:

$wpdb -> update(
	$wpdb -> prefix.'plance_text_shortcodes',
	array(
		'sh_title'		 => $data_ar['sh_title'],
		'sh_code'		 => $data_ar['sh_code'],
		'sh_description' => $data_ar['sh_description'],
		'sh_is_lock'	 => $data_ar['sh_is_lock'],
	),
	array('sh_id' => $sh_id),
	array('%s', '%s', '%s', '%d'),
	array('%d')
);

В этом примере, по ID шорткода (поле «sh_id») мы обновляем данные. Два последних массива фильтруют обновляемые данные и параметры условия запроса.

Удаление данных

Для удаления данных, следует воспользоваться методом:

delete( $table, $where, $where_format = null )

Работает он аналогично, где:
$table — название таблицы, данные из которой будут удалены
$where — массив условий
$where_format — массив форматов данных полей в массиве «$where»

Пример использования следующий:

$wpdb -> delete(
	$wpdb -> prefix.'plance_text_shortcodes',
	array('sh_id' => $sh_id),
	array('%d')
);

или можно использовать такой код:

$wpdb -> query("DELETE FROM `{$wpdb -> prefix}plance_text_shortcodes` WHERE `sh_id` = ".intval($sh_id));

Получение данных

Для извлечения данных из базы данных WordPress можно воспользоваться методом:

get_results( $query = null, $output = OBJECT )

где:
$query — запрос к БД
$output — в каком виде будут возращены данные. Варианты:
OBJECT, OBJECT_K — в виде объекта. Первый вариант отличается от второго тем, что идет с нулевого индекса, а второй с первого (зачем так, не понятно пока)
ARRAY_A — массив с ассоциативными ключами (такими как и поля таблицы)
ARRAY_N — массив с числовыми ключами

Для получения одного значения из БД, следует воспользоваться методом:

get_var( $query = null, $x = 0, $y = 0 )

где:
$query — запрос к БД
$x — смещение по полям
$y — смещение по записям

Для получения одной записи, следует воспользоваться методом:

get_row( $query = null, $output = OBJECT, $y = 0 )

где:
$y — смещение по записям

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

get_col( $query = null , $x = 0 )

где:
$x — смещение по колонкам

Подготовительные запросы

В WordPress бывают ситуации, когда стандартные методы выполнения запросов через методы «insert» и «update» не подходят. Для этого можно совместить метод «query» с методом «prepare», который очистит и вставит значения в нужные части запроса.

Пример:

$wpdb->query( $wpdb->prepare(
	"INSERT INTO {$wpdb -> prefix}plance_text_shortcodes "
	. "(sh_title, sh_code, sh_description, sh_is_lock, sh_date_create) "
	. "VALUES "
	. "(%s, %s, %s, %d, %s )",
	array(
		$data_ar['sh_title'],
		$data_ar['sh_code'],
		$data_ar['sh_description'],
		$data_ar['sh_is_lock'],
		time()
	)
));

А сам метод, имеет следующий вид:

prepare( $query, $args )

где:
$query — запрос к БД
$args — массив подставляемых значений

Всем спасибо! На этом все 🙂

Добавить комментарий

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