Диагностика задачи: зачем нужен шорткод для данных заказа в WooCommerce
Частая задача — вывести на странице или в письме нестандартную информацию о заказе WooCommerce, например, детали товаров, статус, сумму или пользовательские метаданные. Встроенных шорткодах WooCommerce нет для такой тонкой кастомизации. Решение — создать собственный шорткод, который по ID заказа вернёт нужные данные.
Пошаговое создание шорткода для данных заказа
1. Подключение к WooCommerce и получение объекта заказа
Для начала шорткод должен принимать ID заказа через атрибуты. Затем с помощью wc_get_order() получить объект заказа.
function wplessons_order_details_shortcode($atts) {
$atts = shortcode_atts(array(
'order_id' => 0,
), $atts, 'order_details');
$order_id = intval($atts['order_id']);
if (!$order_id) {
return '<p>Ошибка: не указан ID заказа.</p>';
}
$order = wc_get_order($order_id);
if (!$order) {
return '<p>Ошибка: заказ не найден.</p>';
}
// Далее — формируем вывод
$output = '<h3>Данные заказа №' . $order_id . '</h3>';
return $output;
}
add_shortcode('order_details', 'wplessons_order_details_shortcode');2. Вывод информации о товарах в заказе
Получаем все позиции заказа и выводим название, количество и цену каждого товара.
function wplessons_order_details_shortcode($atts) {
$atts = shortcode_atts(array(
'order_id' => 0,
), $atts, 'order_details');
$order_id = intval($atts['order_id']);
if (!$order_id) {
return '<p>Ошибка: не указан ID заказа.</p>';
}
$order = wc_get_order($order_id);
if (!$order) {
return '<p>Ошибка: заказ не найден.</p>';
}
$output = '<h3>Данные заказа №' . $order_id . '</h3>';
$output .= '<ul>';
foreach ($order->get_items() as $item) {
$product = $item->get_product();
$product_name = $product ? $product->get_name() : $item->get_name();
$qty = $item->get_quantity();
$total = wc_price($item->get_total());
$output .= '<li>' . esc_html($product_name) . ' — ' . $qty . ' шт., сумма: ' . $total . '</li>';
}
$output .= '</ul>';
$output .= '<p>Общая сумма заказа: ' . $order->get_formatted_order_total() . '</p>';
return $output;
}
add_shortcode('order_details', 'wplessons_order_details_shortcode');3. Дополнительные данные: статус и дата заказа
Добавим вывод статуса и даты оформления заказа.
$output .= '<p>Статус заказа: ' . wc_get_order_status_name($order->get_status()) . '</p>';
$output .= '<p>Дата заказа: ' . date_i18n(get_option('date_format'), strtotime($order->get_date_created())) . '</p>';Как проверить правильность работы шорткода
1. Создайте тестовый заказ в WooCommerce через админку или фронтенд.
2. Добавьте на страницу или в запись шорткод: [order_details order_id="123"] (замените 123 на ID вашего заказа).
3. Откройте страницу и убедитесь, что выводятся корректные данные: товары, количество, сумма, статус и дата.
4. Проверьте работу при неверном ID (например, 0 или несуществующем) — должен выводиться понятный текст ошибки.
Частые ошибки при создании шорткода для WooCommerce
- Неверный ID заказа — возвращает пустой результат или ошибку. Решение: всегда проверяйте, что ID — целое число и заказ существует.
- Отсутствие подключения WooCommerce — функция
wc_get_order()недоступна. Проверьте, что WooCommerce активен и код выполняется в правильном контексте. - Вывод HTML без экранирования — может привести к XSS уязвимостям. Используйте
esc_html()для вывода данных пользователя. - Ошибка формата даты — если
get_date_created()возвращает объектWC_DateTime, применяйте->date('U')или конвертируйте в timestamp.
Практические советы по безопасности и производительности
- Не выводите данные заказа без проверки прав пользователя. Добавьте проверку текущего пользователя, чтобы не раскрывать чужие заказы:
if ($order->get_user_id() !== get_current_user_id()) {
return '<p>Доступ запрещен.</p>';
}- Кешируйте результат шорткода, если данные не меняются часто, чтобы снизить нагрузку на базу данных.
- Используйте встроенную функцию
wc_price()для корректного отображения цен с валютой. - Для сложных шаблонов лучше подключить отдельный файл шаблона через
wc_get_template(), сохраняя код шорткода компактным.
Сравнение вариантов реализации вывода данных заказа
| Вариант | Плюсы | Минусы |
|---|---|---|
| Код шорткода в functions.php | Быстро, бесплатно, гибко | Требует навыков PHP, может усложнить поддержку при росте кода |
| Плагин с готовыми шорткодами | Упрощает задачу, часто с интерфейсом | Может быть избыточным, добавляет нагрузку |
| Использование PHP-шаблонов WooCommerce | Чистота кода, переиспользуемость | Сложнее для новичков, требует понимания структуры |