Что такое WooCommerce order meta и зачем он нужен
Order meta — это дополнительные данные, которые сохраняются вместе с заказом в WooCommerce. Они позволяют расширить стандартную информацию о заказе, добавляя поля для внутреннего учета, передачи данных в CRM, аналитики и кастомных отчетов.
Например, можно сохранять информацию о промокодах, персональных заметках менеджера, условиях доставки или дополнительных настройках товара.
Как добавить и сохранить собственные данные в order meta
Для добавления собственных метаданных к заказу используйте хуки WooCommerce. Рассмотрим пример, где сохраняется дополнительное поле «Уровень обслуживания» (service_level) из кастомной формы на странице оформления заказа.
Добавление поля на страницу оформления заказа
add_action('woocommerce_after_order_notes', function() {
echo '<p class="form-row form-row-wide">';
echo '<label for="service_level">Уровень обслуживания</label>';
echo '<select name="service_level" id="service_level" class="woocommerce-select">';
echo '<option value="standard">Стандарт</option>';
echo '<option value="express">Экспресс</option>';
echo '<option value="premium">Премиум</option>';
echo '</select>';
echo '</p>';
});Сохранение значения поля в метаданных заказа
add_action('woocommerce_checkout_update_order_meta', function($order_id) {
if (!empty($_POST['service_level'])) {
update_post_meta($order_id, '_service_level', sanitize_text_field($_POST['service_level']));
}
});Как вывести кастомные метаданные в админке WooCommerce
Для удобства работы с заказами можно добавить вывод значения мета-поля в таблицу заказов в админке.
add_filter('manage_edit-shop_order_columns', function($columns) {
$new_columns = array();
foreach ($columns as $key => $column) {
$new_columns[$key] = $column;
if ('order_total' === $key) {
$new_columns['service_level'] = 'Уровень обслуживания';
}
}
return $new_columns;
});
add_action('manage_shop_order_posts_custom_column', function($column) {
global $post;
if ('service_level' === $column) {
$service_level = get_post_meta($post->ID, '_service_level', true);
echo $service_level ? esc_html($service_level) : '–';
}
});Как использовать order meta для создания кастомных отчетов
Кастомные отчеты делаются путём выборки заказов с нужными метаданными. Например, вывести количество заказов по уровню обслуживания за месяц.
function get_orders_count_by_service_level($start_date, $end_date) {
global $wpdb;
$query = $wpdb->prepare(
"SELECT meta_value, COUNT(*) as count
FROM {$wpdb->prefix}postmeta pm
INNER JOIN {$wpdb->prefix}posts p ON pm.post_id = p.ID
WHERE pm.meta_key = %s
AND p.post_type = 'shop_order'
AND p.post_status IN ('wc-completed', 'wc-processing')
AND p.post_date BETWEEN %s AND %s
GROUP BY meta_value",
'_service_level', $start_date, $end_date
);
return $wpdb->get_results($query, OBJECT_K);
}
// Пример вызова
$stats = get_orders_count_by_service_level('2024-05-01 00:00:00', '2024-05-31 23:59:59');
foreach ($stats as $level => $data) {
echo "Уровень: " . esc_html($level) . ", заказов: " . intval($data->count) . "<br>";
}Диагностика проблем с order meta
Если кастомные метаданные не сохраняются или не отображаются, проверьте:
- Отправляются ли данные с формы (проверить через
var_dump($_POST)в хук сохранения); - Правильно ли указано имя мета-поля (
meta_key); - Есть ли ошибки в консоли браузера или в логах PHP;
- Не перезаписывается ли мета-значение другими плагинами или кодом;
- Используется ли правильный статус заказа для отчетов (например,
wc-completedилиwc-processing).
Чек-лист: проверка корректности сохранения и отображения order meta
- Поля корректно отображаются на странице оформления заказа
- Данные передаются в
$_POSTи проходят валидацию - Метаданные сохраняются в таблице
wp_postmetaс ключом, начинающимся с подчеркивания - Метаданные доступны при выводе через
get_post_meta() - Данные отображаются в колонках админки WooCommerce
- Отчёты корректно выбирают заказы по мета-данным
Частые ошибки и как их исправить
- Данные не сохраняются при оформлении заказа: отсутствует или неверно подключён хук
woocommerce_checkout_update_order_meta. Проверьте, что функция привязана именно к этому хуку. - Метаданные не отображаются в админке: неправильно реализен фильтр колонок или вывод. Следует использовать
manage_edit-shop_order_columnsиmanage_shop_order_posts_custom_column. - Запросы к базе возвращают пустые данные: проверьте даты, статусы заказов и правильность
meta_keyв SQL. - Конфликты с другими плагинами: временно отключите плагины, которые могут менять обработку заказов.
Практические советы по безопасности и производительности
- Всегда санитизируйте и валидируйте данные из формы перед сохранением (
sanitize_text_field(),intval()и др.). - Не храните в метаданных большие объемы данных — для этого лучше использовать отдельные таблицы или внешние сервисы.
- Используйте индексы в базе для ускорения выборок по meta_key, если у вас много заказов и отчетов.
- Для отчетов с большим объемом данных рассмотрите использование WP-CLI или внешних BI-инструментов с выгрузкой из базы.
- Используйте nonce-поля и проверки прав пользователя при добавлении кастомных полей в админке.
Таблица сравнения способов реализации кастомных метаданных WooCommerce
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Хуки WooCommerce (checkout update) | Простота, интеграция с формой заказа | Только для оформления заказа | update_post_meta($order_id, '_service_level', ...) |
| Админка с мета-боксами | Удобство для менеджера, ручное редактирование заказа | Нужно реализовать UI | add_meta_box + save_post |
| Использование плагинов для метаполей | Быстрая настройка, визуальный интерфейс | Зависимость от стороннего кода | ACF, WooCommerce Custom Fields |