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

Проблема: невозможность редактирования свойств товара в личном кабинете

По умолчанию WooCommerce не предоставляет функционал для редактирования или добавления свойств (атрибутов) товара со стороны покупателя в личном кабинете. Это создает неудобства, если необходимо, например, позволить клиенту корректировать параметры заказа или добавить дополнительные данные к товару после покупки.

Диагностика: что именно не работает и почему

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

Для проверки откройте консоль браузера на странице "Мои заказы" и убедитесь, что нет ошибок JavaScript, а также проверьте, что в шаблоне my-account нет кода, выводящего формы редактирования.

Пошаговое решение: добавляем возможность изменения свойств товара в личном кабинете

1. Создаем кастомный endpoint в личном кабинете WooCommerce

Добавьте в functions.php вашей темы или в кастомный плагин следующий код, чтобы зарегистрировать новый endpoint, например, edit-product-attrs:

add_action('init', function() {
    add_rewrite_endpoint('edit-product-attrs', EP_PAGES);
});

add_filter('query_vars', function($vars) {
    $vars[] = 'edit-product-attrs';
    return $vars;
});

add_filter('woocommerce_account_menu_items', function($items) {
    $items['edit-product-attrs'] = 'Редактировать свойства товара';
    return $items;
});

2. Создаем callback для вывода формы

Создайте функцию-обработчик, которая выводит форму для редактирования атрибутов товара из заказа. Например:

add_action('woocommerce_account_edit-product-attrs_endpoint', function() {
    $order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
    if (!$order_id) {
        echo '<p>Заказ не указан.</p>';
        return;
    }

    $order = wc_get_order($order_id);
    if (!$order || $order->get_user_id() !== get_current_user_id()) {
        echo '<p>Доступ запрещен.</p>';
        return;
    }

    foreach ($order->get_items() as $item_id => $item) {
        $product = $item->get_product();
        echo '<h3>' . esc_html($product->get_name()) . '</h3>';

        // Предположим, хотим редактировать атрибут 'pa_color'
        $attributes = $product->get_attributes();
        if (isset($attributes['pa_color'])) {
            $color = $item->get_meta('pa_color', true);
            echo '<label>Цвет: </label>';
            echo '<input type="text" name="attr_pa_color[' . esc_attr($item_id) . ']" value="' . esc_attr($color) . '" />';
        }
    }

    echo '<input type="hidden" name="order_id" value="' . esc_attr($order_id) . '" />';
    echo '<button type="submit" name="save_attrs">Сохранить</button>';
});

3. Обработка сохранения данных

Добавьте обработчик POST-запроса для сохранения введенных свойств товара:

add_action('template_redirect', function() {
    if (!is_account_page() || empty($_POST['save_attrs'])) {
        return;
    }

    $order_id = intval($_POST['order_id']);
    $order = wc_get_order($order_id);
    if (!$order || $order->get_user_id() !== get_current_user_id()) {
        wp_die('Доступ запрещен');
    }

    if (!empty($_POST['attr_pa_color']) && is_array($_POST['attr_pa_color'])) {
        foreach ($_POST['attr_pa_color'] as $item_id => $value) {
            $item = $order->get_item($item_id);
            if ($item) {
                $item->update_meta_data('pa_color', sanitize_text_field($value));
                $item->save();
            }
        }
    }

    wp_safe_redirect(wc_get_account_endpoint_url('edit-product-attrs') . '?order_id=' . $order_id . '&updated=1');
    exit;
});

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

  • Перейдите в "Мой аккаунт" > "Редактировать свойства товара".
  • Передайте параметр ?order_id=ID_заказа в URL, где ID_заказа — номер вашего заказа.
  • Отредактируйте поле "Цвет" и нажмите "Сохранить".
  • Проверьте в админке WooCommerce, что в заказе у товара изменился мета-атрибут pa_color.

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

  • Ошибка: "Доступ запрещен" при попытке открыть страницу — проверьте, что вы вошли под пользователем, который создал заказ.
  • Атрибут не сохраняется — убедитесь, что используете $item->save() после обновления метаданных.
  • Форма не отображается — проверьте, зарегистрирован ли endpoint и обновите постоянные ссылки (перейдите в "Настройки > Постоянные ссылки" и нажмите "Сохранить").

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

  • Всегда проверяйте права пользователя перед изменением данных — используйте get_current_user_id() и сравнивайте с владельцем заказа.
  • Санитизируйте все пользовательские данные через sanitize_text_field() или другие подходящие функции.
  • Для производительности избегайте загрузки всех данных заказа, ограничиваясь только нужными элементами.
  • Если количество атрибутов растет, рассмотрите создание отдельной таблицы или мета-данных для хранения пользовательских настроек, а не использование стандартных атрибутов товара.

Сравнение вариантов реализации редактирования свойств товара

ВариантПреимуществаНедостатки
Использование мета-данных заказа (как в примере)Простая реализация, без изменения ядра WooCommerceОграничено по типам данных, не очень удобно для множества атрибутов
Создание отдельной таблицы для пользовательских свойствГибкость и масштабируемостьТребует более сложной реализации и поддержки
Использование сторонних плагинов для кастомизации заказаБыстро, готовые решенияДополнительная нагрузка, возможные конфликты
Автоматическое резервное копирование WordPress: пошаговое руководство с примерами
19.02.2026
Как избежать конфликтов между плагинами в WordPress
15.02.2026
Автоматический импорт продуктов из CSV в WooCommerce: практические решения
28.03.2026
Как использовать AJAX для пагинации в WordPress с примерами кода
24.03.2026
Как сделать удалённый вывод данных в WordPress с помощью WP REST API
24.01.2026