Назад в блог

~ 4 минуты

Достаем список заказов из БД Wordpress и Woocommerce с помощью скрипта на Node.js

340

4/5/2024

В статье подробно рассказывается о процессе подключения к базе данных MySQL Wordpress и Woocommerce, формировании запроса для получения данных о заказах и информации о клиентах.

Вадим Пашаев

Вадим Пашаев

Инженер, веб-разработчик, путешественник

Достаем список заказов из БД Wordpress и Woocommerce с помощью скрипта на Node.js | PXSTUDIO
Регистрация товарных знаков
Craftum - создайте сайт за 15 минут
Домены, хостинг от reg.ru

Понадобилось одному из заказчиков быстро вытащить список заказов в WP, но сайт уже был свернут, я решил восстановить бэкап БД на MySQL и достать необходимую информацию с помощью Node.js скрипта. Давайте посмотрим, что из этого вышло.

Изначально я пытался писать запросы в консольной версии mysql, после того как запрос стал больше 1 строки, это стало жутко неудобно, поэтому я решил все же написать скрипт, который запросит все необходимые данные и выведет в консоль:

const mysql = require("mysql")

const connection = mysql.createConnection({
  host: "localhost",
  user: "USERNAME",
  password: "PASSWORD",
  database: "DATABASE"
})

Данные для подключения я взял с конфига Wordpress. Как его найти и какие есть в нем константы, можно почитать здесь.

Дальше необходимо создать подключение к БД MySQL с помощью следующего скрипта:

connection.connect((err) => {
  if (err) {
    console.error("Ошибка подключения к базе данных:", err)
    return
  }
  console.log("Подключение к базе данных успешно!")

  // Пример запроса
  connection.query(query, (err, results) => {
    if (err) {
      console.error("Ошибка выполнения запроса:", err)
      return
    }
    console.log("Результаты запроса:", results)
  })

  // Закрытие соединения
  connection.end((err) => {
    if (err) {
      console.error("Ошибка закрытия соединения:", err)
      return
    }
    console.log("Соединение успешно закрыто!")
  })
})

Здесь с помощью функции connect() создается соединение с БД в который передается callback и первым параметром идет err, который показывает по результатам соединения ошибку или успешное подключение, отрабатываем эту ошибку и выводим результат.

Ну а дальше формируем запрос в БД. В WooCommerce общая сумма заказа обычно хранится в метаданных с ключом _order_total или _order_total_tax. Давайте попробуем изменить запрос, чтобы добавить столбец total_order_amount на основе этих ключей:

const query = `
SELECT 
    p.ID AS order_id,
    p.post_date AS order_date,
    p.post_status AS order_status,
    MAX(CASE WHEN pm.meta_key = '_billing_first_name' THEN pm.meta_value END) AS billing_first_name,
    MAX(CASE WHEN pm.meta_key = '_billing_last_name' THEN pm.meta_value END) AS billing_last_name,
    MAX(CASE WHEN pm.meta_key = '_billing_email' THEN pm.meta_value END) AS billing_email,
    MAX(CASE WHEN pm.meta_key = '_billing_phone' THEN pm.meta_value END) AS billing_phone,
    MAX(CASE WHEN pm.meta_key = '_shipping_first_name' THEN pm.meta_value END) AS shipping_first_name,
    MAX(CASE WHEN pm.meta_key = '_shipping_last_name' THEN pm.meta_value END) AS shipping_last_name,
    MAX(CASE WHEN pm.meta_key = '_shipping_address_1' THEN pm.meta_value END) AS shipping_address_1,
    MAX(CASE WHEN pm.meta_key = '_shipping_address_2' THEN pm.meta_value END) AS shipping_address_2,
    MAX(CASE WHEN pm.meta_key = '_order_total' THEN pm.meta_value END) AS total_order_amount -- Добавленный столбец с общей суммой заказа
FROM 
    wp_posts p
JOIN 
    wp_postmeta pm ON p.ID = pm.post_id
WHERE 
    p.post_type = 'shop_order'
GROUP BY 
    p.ID;
`

Скрипт отработал, я получил заветную информацию о 3000+ заказов, и понял что это жутко не удобно и нужно сделать что-то что позволит с этой информацией работать уже без скриптов и БД, поэтому решил сохранять все это в csv файл и открывать уже в Excel.

Как оказалось, вывод в CSV был проще простого. В npm есть специальный пакет json2csv, который преобразует JSON в CSV, соответственно. И все что нужно сделать для этого это получить список полей и передать его в парсер:

const fields = Object.keys(results[0])

const parser = new json2csv({ fields, delimiter: ";" })
const csv = parser.parse(results)

Но это еще не все, для того, чтобы сохранить в файл, необходим стандартный модуль fs и следующий код будет создавать в коренном каталоге новый файл с именем results.csv

fs.writeFile("results.csv", "\uFEFF" + csv, { encoding: "utf8" }, (err) => {
   if (err) {
      console.error("Ошибка сохранения файла:", err)
      return
   }
   console.log("Результаты успешно сохранены в файле results.csv")
})

Не забудьте поставить enconding, иначе в Excel откроются кракозябры! Надеюсь кому-то будет полезно, и вы тоже сможете достать весь список заказов с информацией о клиенте, телефонах, адресе доставки и сумме заказа.

Полный код можно скачать на Github

Подписаться на рассылку

Получите лучшие новости по веб-разработке и AI

Подписаться на рассылку

Получите лучшие новости по веб-разработке и AI

Оценка проекта

Хотите быструю оценку Вашего проекта?

Василий Иванов
Максим Насенников
Виктория Мальцева
Vadim Pashaev

Заполните форму справа и наша команда экспертов поможет найти для Вас оптимальное решение вашей идеи или задачи

Есть интересная идея?

И вы очень хотите ее реализовать, пишите нам и получите подробное коммерческое предложение и быструю реализацию