~ 4 минуты
Достаем список заказов из БД Wordpress и Woocommerce с помощью скрипта на Node.js
340
4/5/2024
В статье подробно рассказывается о процессе подключения к базе данных MySQL Wordpress и Woocommerce, формировании запроса для получения данных о заказах и информации о клиентах.
Понадобилось одному из заказчиков быстро вытащить список заказов в 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
Взгляните на наш стартап:
Выбирай экскурсии и активности по всему миру
Уже зарегистрировано 0 стран, 0 направлений, 0 экскурсий
Есть интересная идея?
И вы очень хотите ее реализовать, пишите нам и получите подробное коммерческое предложение и быструю реализацию