Содержимое
Продолжаем цикл статей по работе с базой данных в 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 — массив подставляемых значений
Всем спасибо! На этом все 🙂