Диагностика задачи: зачем показывать статусы заказов с помощью шорткода
Во многих интернет-магазинах на WooCommerce требуется вывести для пользователей страницу с их заказами и текущими статусами. Стандартная страница «Мой аккаунт» предоставляет это, но зачастую нужно встроить статус заказов в кастомную страницу или в личный кабинет с дополнительным функционалом. В этом случае полезно создать шорткод, который можно вставить в любую страницу или виджет.
Шаг 1. Базовый шорткод для вывода заказов пользователя
WooCommerce не предоставляет готового шорткода для вывода статусов заказов по умолчанию, но можно создать свой на базе WP_Query и wc_get_order_status_name().
Добавьте следующий код в functions.php вашей темы или в кастомный плагин:
function wpt_display_user_orders_status() {
if ( ! is_user_logged_in() ) {
return '<p>Пожалуйста, войдите, чтобы увидеть свои заказы.</p>';
}
$user_id = get_current_user_id();
$args = array(
'customer_id' => $user_id,
'limit' => 10, // последние 10 заказов
'orderby' => 'date',
'order' => 'DESC',
);
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return '<p>Вы ещё не сделали ни одного заказа.</p>';
}
$output = '<table><thead><tr><th>Номер заказа</th><th>Дата</th><th>Статус</th></tr></thead><tbody>';
foreach ( $orders as $order ) {
$order_id = $order->get_id();
$date = $order->get_date_created()->date('d.m.Y');
$status = wc_get_order_status_name( $order->get_status() );
$output .= "<tr><td>#{$order_id}</td><td>{$date}</td><td>{$status}</td></tr>";
}
$output .= '</tbody></table>';
return $output;
}
add_shortcode( 'user_orders_status', 'wpt_display_user_orders_status' );
Этот шорткод [user_orders_status] выводит таблицу с последними 10 заказами текущего пользователя, показывая их номер, дату и статус.
Шаг 2. Использование шорткода на странице
Создайте новую страницу в WordPress или отредактируйте существующую, вставьте туда шорткод:
[user_orders_status]
После публикации пользователь, залогинившийся на сайте, увидит таблицу со своими заказами и их статусами без перенаправления на стандартный раздел WooCommerce.
Проверка результата после внедрения
- Зайдите под аккаунтом пользователя с реальными заказами.
- Перейдите на страницу с шорткодом.
- Убедитесь, что таблица отображает корректные номера заказов, даты и статусы.
- Выйдите из аккаунта и проверьте, что появляется сообщение с просьбой войти.
Расширение функционала: добавление фильтра по статусам заказов
Если нужно, чтобы пользователь мог фильтровать заказы по статусу, можно добавить параметр в шорткод:
function wpt_display_user_orders_status_with_filter( $atts ) {
if ( ! is_user_logged_in() ) {
return '<p>Пожалуйста, войдите, чтобы увидеть свои заказы.</p>';
}
$atts = shortcode_atts( array(
'status' => '', // например 'completed', 'processing'
), $atts, 'user_orders_status' );
$user_id = get_current_user_id();
$args = array(
'customer_id' => $user_id,
'limit' => 10,
'orderby' => 'date',
'order' => 'DESC',
);
if ( $atts['status'] ) {
$args['status'] = explode( ',', $atts['status'] );
}
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return '<p>Заказы с указанным статусом не найдены.</p>';
}
$output = '<table><thead><tr><th>Номер заказа</th><th>Дата</th><th>Статус</th></tr></thead><tbody>';
foreach ( $orders as $order ) {
$order_id = $order->get_id();
$date = $order->get_date_created()->date('d.m.Y');
$status = wc_get_order_status_name( $order->get_status() );
$output .= "<tr><td>#{$order_id}</td><td>{$date}</td><td>{$status}</td></tr>";
}
$output .= '</tbody></table>';
return $output;
}
remove_shortcode('user_orders_status');
add_shortcode('user_orders_status', 'wpt_display_user_orders_status_with_filter');
Пример использования с фильтром:
[user_orders_status status="completed,processing"]
Этот шорткод покажет только заказы со статусом "выполнен" и "обрабатывается".
Чек-лист по внедрению шорткода статусов заказов WooCommerce
- Добавить и активировать код шорткода в functions.php или плагине.
- Создать страницу и вставить шорткод
[user_orders_status]. - Проверить вывод для авторизованного пользователя с заказами.
- Проверить вывод для неавторизованного пользователя.
- Опционально добавить фильтрацию по статусам заказов.
- Убедиться, что таблица корректно рендерится на разных устройствах.
Частые ошибки и как их исправить
- Ничего не выводится или пустая таблица: возможно, пользователь не авторизован или у него нет заказов. Проверьте ID пользователя и наличие заказов с помощью отладки
var_dump(wc_get_orders(...)). - Ошибка «call to undefined function wc_get_orders»: убедитесь, что WooCommerce активен и подключен до вызова функции.
- Шорткод выводится как текст: проверьте, что вы добавили
add_shortcodeи используете правильный синтаксис[user_orders_status]. - Проблемы с форматированием таблицы: добавьте CSS стили или классы таблице для корректного отображения.
Практические советы по безопасности и производительности
- Всегда проверяйте, что пользователь авторизован, прежде чем показывать личные данные.
- Ограничивайте количество заказов для вывода, чтобы не нагружать базу и страницу.
- Кэшируйте HTML вывод шорткода, если у вас много пользователей и большая нагрузка (например, с помощью Transients API).
- Используйте подготовленные функции WooCommerce для получения данных, чтобы избежать SQL-инъекций.
- Если планируется сложный функционал фильтрации, лучше вынесите его в AJAX-запросы, чтобы не перегружать страницу.
Сравнение вариантов вывода статусов заказов
| Вариант | Преимущества | Недостатки |
|---|---|---|
| Стандартная страница «Мой аккаунт» WooCommerce | Просто использовать, готовый функционал, обновления поддерживаются | Мало гибкости для кастомизации и интеграции в другие страницы |
| Кастомный шорткод (как в статье) | Гибкость вывода, можно вставить в любую страницу, фильтрация | Требует программирования, возможна нагрузка при большом количестве заказов |
| Плагины сторонних разработчиков | Могут иметь расширенные функции и визуальный редактор | Могут быть платными, конфликтовать с темой или другими плагинами |