wppartner.ru wordpress WP Partner

WooCommerce: как добавить собственные поля в внутренний отчет о продажах

Диагностика проблемы: почему стандартные отчеты WooCommerce не всегда подходят

WooCommerce предоставляет встроенные отчеты по продажам, заказам и клиентам. Однако часто возникает необходимость добавить в эти отчеты дополнительные данные — например, пользовательские поля из заказа, сведения о доставке, кастомные мета-данные продуктов или информацию, собранную через кастомные поля на странице оформления заказа.

Стандартные отчеты не показывают эти данные, что затрудняет анализ и принятие решений. Чтобы расширить функционал, требуется внести изменения в код, добавив собственные поля в отчет.

Пошаговое решение: добавление собственных полей в отчет по продажам WooCommerce

1. Определите, какие поля нужно добавить

Например, добавим в отчет поле «Номер телефона клиента», которое хранится в мета заказа с ключом _billing_phone, и кастомное поле продукта custom_product_code.

2. Создайте собственный отчет на основе класса WooCommerce

WooCommerce использует классы для отчетов, например WC_Admin_Report_Orders. Чтобы добавить поле, лучше создать собственный класс, наследующий от базового, и расширить вывод данных.

if ( ! class_exists( 'WC_Custom_Report_Sales' ) ) {
    class WC_Custom_Report_Sales extends WC_Admin_Report_Orders {
        /**
         * Переопределяем метод получения данных для отчета
         */
        public function get_report_data( $args = array() ) {
            global $wpdb;
            $query = "
                SELECT
                    p.ID as order_id,
                    pm.meta_value as billing_phone,
                    oi.order_item_name,
                    p.post_date
                FROM {$wpdb->prefix}posts p
                INNER JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_billing_phone'
                INNER JOIN {$wpdb->prefix}prefix_woocommerce_order_items oi ON p.ID = oi.order_id
                WHERE p.post_type = 'shop_order'
                AND p.post_status IN ('wc-completed', 'wc-processing')
                AND p.post_date BETWEEN %s AND %s
            ";
            $prepared_query = $wpdb->prepare( $query, $args['start_date'], $args['end_date'] );
            return $wpdb->get_results( $prepared_query );
        }
    }
}

Обратите внимание, что здесь prefix_woocommerce_order_items нужно заменить на актуальное имя таблицы с префиксом базы данных.

3. Выведите отчет в админке или в отдельном шаблоне

Создайте страницу в админке или фронтенде, где вызовете новый отчет:

$report = new WC_Custom_Report_Sales();
$data = $report->get_report_data(array(
    'start_date' => '2024-01-01 00:00:00',
    'end_date' => '2024-03-31 23:59:59'
));

foreach ($data as $row) {
    echo 'Заказ: ' . $row->order_id . ', Телефон: ' . $row->billing_phone . ', Товар: ' . $row->order_item_name . '<br>';
}

4. Добавление поля кастомного продукта в отчет

Если нужно добавить мета-поле продукта, например custom_product_code, то понадобится дополнительный SQL JOIN с таблицей woocommerce_order_itemmeta:

SELECT
  p.ID as order_id,
  pm.meta_value as billing_phone,
  oi.order_item_name,
  oim_product_code.meta_value as product_code,
  p.post_date
FROM {$wpdb->prefix}posts p
INNER JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_billing_phone'
INNER JOIN {$wpdb->prefix}woocommerce_order_items oi ON p.ID = oi.order_id
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim_product_code ON oi.order_item_id = oim_product_code.order_item_id AND oim_product_code.meta_key = 'custom_product_code'
WHERE p.post_type = 'shop_order'
AND p.post_status IN ('wc-completed', 'wc-processing')
AND p.post_date BETWEEN %s AND %s

Проверка результата после внедрения

  • Откройте страницу с отчетом в админке или шаблон, где вы выводите результаты.
  • Проверьте, что появились новые колонки с нужными полями (например, телефон и код продукта).
  • Сравните данные с реальными значениями в заказах и товарах, чтобы убедиться в корректности.
  • Для проверки SQL-запроса можно использовать плагин Query Monitor или временно вывести запрос и проверить в phpMyAdmin.

Частые ошибки и как их исправить

  • Ошибка: Некорректное имя таблицы с префиксом базы данных.
    Решение: Используйте $wpdb->prefix для динамического определения префикса.
  • Ошибка: Отсутствие данных в новых полях.
    Решение: Проверьте, что мета-ключи существуют и заполнены у заказов и товаров.
  • Ошибка: SQL-запрос возвращает ошибку или пустой результат.
    Решение: Проверьте правильность синтаксиса и корректность JOIN, используйте отладку с Query Monitor.
  • Ошибка: Перегрузка сервера при больших объемах данных.
    Решение: Добавьте пагинацию и ограничения по датам в запросах.

Практические советы по безопасности и производительности

  • Используйте $wpdb->prepare() для всех динамических SQL-запросов, чтобы избежать SQL-инъекций.
  • Добавляйте индексы на часто используемые поля метаданных, если объем данных большой.
  • Кешируйте результаты сложных отчетов при помощи Transients API или внешнего кеша.
  • Ограничьте доступ к страницам отчетов только администраторам или нужным ролям через проверку capabilities.

Сравнение вариантов реализации: плагин vs. кастомный код

КритерийПлагин (готовый отчет)Кастомный кодКомпромисс
ГибкостьОграничена функционалом плагинаМаксимальная, можно добавить любые поляКод требует поддержки
Время реализацииБыстрое подключениеТребуется время на разработку и тестыЗависит от навыков
ПроизводительностьОптимизировано авторомЗависит от качества кодаМожно оптимизировать под свой сайт
БезопасностьЗависит от плагинаЗависит от разработчикаНужно тщательно проверять
ОбновленияАвтоматические через репозиторийТребуют ручного обновленияВозможна интеграция с системой контроля версий
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙