Как добавить отображение всех заказов woocommerce?

Ссылка скопирована
1 ответ

Как добавить отображение всех заказов woocommerce для определенных ролей пользователей на стороне учетной записи /my-account/?

Дополнительно:

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Кирилл JS Ответ

В стандартном /my-account/orders/ WooCommerce показывает пользователю только его заказы. Если нужно дать определенной роли просмотр всех заказов, это уже не обычный личный кабинет покупателя, а управленческий интерфейс. Сначала проверьте права доступа: человеку фактически открывается список чужих заказов и персональных данных.

Самый безопасный путь — дать роли нужные capability и пустить её в админку WooCommerce, ограничив лишние разделы. Если нужен именно фронтенд, добавьте отдельный endpoint в My Account и выводите таблицу только для разрешенной роли.

add_action('init', function () {
    add_rewrite_endpoint('all-orders', EP_ROOT | EP_PAGES);
});
 
add_filter('woocommerce_account_menu_items', function ($items) {
    if (current_user_can('manage_woocommerce')) {
        $items['all-orders'] = 'Все заказы';
    }
 
    return $items;
});

add_action('init', function () { add_rewrite_endpoint('all-orders', EP_ROOT | EP_PAGES); }); add_filter('woocommerce_account_menu_items', function ($items) { if (current_user_can('manage_woocommerce')) { $items['all-orders'] = 'Все заказы'; } return $items; });

Вывод заказов:

add_action('woocommerce_account_all-orders_endpoint', function () {
    if (! current_user_can('manage_woocommerce')) {
        echo '<p>Недостаточно прав.</p>';
        return;
    }
 
    $orders = wc_get_orders([
        'limit'   => 50,
        'orderby' => 'date',
        'order'   => 'DESC',
    ]);
 
    echo '<ul>';
    foreach ($orders as $order) {
        echo '<li><a href="' . esc_url($order->get_view_order_url()) . '">Заказ #' . esc_html($order->get_order_number()) . '</a> — ' . esc_html(wc_get_order_status_name($order->get_status())) . '</li>';
    }
    echo '</ul>';
});

add_action('woocommerce_account_all-orders_endpoint', function () { if (! current_user_can('manage_woocommerce')) { echo '<p>Недостаточно прав.</p>'; return; } $orders = wc_get_orders([ 'limit' => 50, 'orderby' => 'date', 'order' => 'DESC', ]); echo '<ul>'; foreach ($orders as $order) { echo '<li><a href="' . esc_url($order->get_view_order_url()) . '">Заказ #' . esc_html($order->get_order_number()) . '</a> — ' . esc_html(wc_get_order_status_name($order->get_status())) . '</li>'; } echo '</ul>'; });

После добавления endpoint один раз пересохраните постоянные ссылки. Для большого магазина обязательно делайте пагинацию, а не вывод всех заказов сразу.

Перед внедрением на рабочем сайте проверьте решение на копии или хотя бы сделайте резервную копию изменяемого файла. После правки включите отображение ошибок, откройте проблемную страницу в обычном и приватном окне, проверьте консоль браузера и логи PHP. Если задача связана с WordPress, WooCommerce или ACF, дополнительно проверьте поведение после очистки кэша и после выхода из админки: часть ошибок видна только для незалогиненного пользователя.

Если код работает только в одном шаблоне, лучше не оставлять его разрозненно в нескольких файлах. Вынесите повторяемую логику в функцию, небольшой плагин или template part, а в шаблоне оставьте только вызов. Так проще поддерживать решение после обновления темы, плагинов и PHP.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно