Обновление записей в WordPress с помощью функции wpdb_update()
В этой статье мы рассмотрим, как можно обновлять записи в базе данных WordPress с помощью функции wpdb_update(). По умолчанию метод $wpdb->update() не позволяет использовать массив для параметра $where, что делает работу с запросами менее удобной.
Пример ситуации
Представим, что у нас есть массив с ID записей постов: [1, 5, 9], и нам нужно обновить их статус на draft (черновик). Обычное решение этой задачи в WordPress предполагает использование метода $wpdb->query() и написание отдельного SQL-запроса:
$post_ids = [1, 5, 9];
$wpdb->query(
"UPDATE $wpdb->posts SET post_status = 'draft'
WHERE ID IN (" . implode(',', array_map('intval', $post_ids)) . ")"
);
Проблема
Как видно из примера, такой запрос может быть трудным для чтения и может привести к ошибкам, особенно если количество полей растёт.
Удобное решение с помощью функции wpdb_update()
Мы предложим функцию, которая расширяет функционал $wpdb->update() и позволяет использовать массив в параметре $where. Это значительно упрощает процесс обновления записей.
Пример использования функции
Теперь вы сможете обновлять записи следующим образом:
$post_ids = [1, 5, 9];
wpdb_update($wpdb->posts, ['post_status' => 'draft'], ['ID' => $post_ids]);
Реализация функции wpdb_update()
Вот реализация нашей новой функции wpdb_update(), которая полностью заменяет $wpdb->update():
/**
* Обновление записи в таблице
*
* Расширяет базовую функцию $wpdb->update, чтобы разрешить передачу массива в значении поля $where.
* Переданный массив станет частью SQL-запроса IN ().
*
* $wpdb->update('table', ['column' => 'foo', 'field' => 1337], ['ID' => [1, 3, 5]]);
*
* @param string $table Название таблицы
* @param array $data Данные для обновления (в формате столбец => значение).
* Оба значения должны быть "неэкранированными" (raw).
* Передача значения null установит столбец в NULL.
* @param array $where Ассоциативный массив условий WHERE (столбец => значение).
* Значение может быть массивом - в этом случае будет ��спользован оператор IN ().
* Множественные условия соединяются с помощью AND.
* Оба значения должны быть "неэкранированными".
* Передача значения null создаст сравнение IS NULL.
*
* @return int|bool Число затронутых строк или false в случае ошибки.
*/
function wpdb_update($table, $data, $where) {
global $wpdb;
if (!is_array($data) || !is_array($where)) {
return false;
}
$SET = [];
foreach ($data as $field => $value) {
$field = sanitize_key($field);
if (is_null($value)) {
$SET[] = "$field = NULL";
continue;
}
$SET[] = $wpdb->prepare("$field = %s", $value);
}
$WHERE = [];
foreach ($where as $field => $value) {
$field = sanitize_key($field);
if (is_null($value)) {
$WHERE[] = "$field IS NULL";
continue;
}
if (is_array($value)) {
foreach ($value as &$val) {
$val = $wpdb->prepare("%s", $val);
}
unset($val);
$WHERE[] = "$field IN (" . implode(',', $value) . ")";
} else {
$WHERE[] = $wpdb->prepare("$field = %s", $value);
}
}
$sql = "UPDATE $table SET " . implode(', ', $SET) . " WHERE " . implode(' AND ', $WHERE);
return $wpdb->query($sql);
}
Заключение
Теперь у нас есть полезная функция wpdb_update(), которая делает обновление записей в WordPress более удобным и безопасным. Вы можете легко передавать массивы для условий WHERE, что упрощает чтение и уменьшает вероятность ошибок в запросах.