Обновление записей в WordPress с wpdb_update() – удобный и безопасный способ

Обновление записей в 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, что упрощает чтение и уменьшает вероятность ошибок в запросах.

Leave a Reply

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