Покупатели и раздел «Мой аккаунт»
Покупатель — обычный пользователь WordPress с ролью customer. Его адреса и история покупок доступны через объект WC_Customer, а личный кабинет находится на странице «Мой аккаунт» (/my-account/). В кабинет можно добавить свою вкладку — например, со списком отзывов покупателя.
Где писать код
Создайте файл includes/account.php и подключите его в acme-shop.php.
Чтение покупателя
// wp-content/plugins/acme-shop/includes/account.php
add_action('woocommerce_account_dashboard', function () {
$customer = new WC_Customer(get_current_user_id());
printf(
'<p>Заказов: %d, на сумму %s. Город доставки: %s.</p>',
$customer->get_order_count(),
wc_price($customer->get_total_spent()),
esc_html($customer->get_shipping_city() ?: 'не указан')
);
});Конструктор принимает идентификатор пользователя. Хук woocommerce_account_dashboard выводит блок на первой вкладке кабинета — войдите на сайт и откройте /my-account/, чтобы увидеть строку.
Свойства
| Метод | Что возвращает |
|---|---|
get_email() | Адрес почты |
get_first_name(), get_last_name() | Имя и фамилию |
get_billing_phone() | Телефон |
get_billing(), get_shipping() | Адрес массивом |
get_order_count() | Число заказов |
get_total_spent() | Сумму оплаченных заказов |
get_is_paying_customer() | Был ли хоть один оплаченный заказ |
Адреса хранятся в метаданных пользователя — таблица wp_usermeta, ключи billing_city, shipping_postcode и подобные.
Изменение и свои данные
// wp-content/plugins/acme-shop/scripts/update-customer.php
$customer = new WC_Customer(7);
$customer->set_billing_phone('+49 30 1234567');
$customer->update_meta_data('acme_birthday', '1990-05-14');
$customer->save();
echo $customer->get_meta('acme_birthday') . PHP_EOL;Правило прежнее: set_..., затем save(). Запустите файл через wp eval-file — он напечатает сохранённую дату. Текущего покупателя на сайте даёт WC()->customer: объект существует и для гостя, у которого идентификатор равен 0.
Вкладка в кабинете
Вкладка состоит из трёх частей: адрес, пункт меню и содержимое.
// wp-content/plugins/acme-shop/includes/account.php
add_action('init', function () {
add_rewrite_endpoint('my-reviews', EP_ROOT | EP_PAGES);
});
add_filter('woocommerce_account_menu_items', function (array $items): array {
$logout = $items['customer-logout'];
unset($items['customer-logout']);
$items['my-reviews'] = 'Мои отзывы';
$items['customer-logout'] = $logout;
return $items;
});Первая функция регистрирует адрес /my-account/my-reviews/. Фильтр добавляет пункт меню перед «Выйти». После добавления кода откройте «Настройки → Постоянные ссылки» и нажмите «Сохранить изменения» — иначе новый адрес будет отдавать 404.
Содержимое вкладки
// wp-content/plugins/acme-shop/includes/account.php
add_action('woocommerce_account_my-reviews_endpoint', function () {
$reviews = get_comments([
'user_id' => get_current_user_id(),
'post_type' => 'product',
'status' => 'approve',
]);
if (!$reviews) {
echo '<p>Вы ещё не оставили ни одного отзыва.</p>';
return;
}
echo '<ul>';
foreach ($reviews as $review) {
printf(
'<li><a href="%s">%s</a>: %s</li>',
esc_url(get_permalink($review->comment_post_ID)),
esc_html(get_the_title($review->comment_post_ID)),
esc_html($review->comment_content)
);
}
echo '</ul>';
});Имя хука собирается из адреса вкладки: woocommerce_account_ + my-reviews + _endpoint. Отзыв о товаре — комментарий WordPress к записи типа product. Оставьте отзыв о кружке и откройте вкладку «Мои отзывы»: в списке появится ссылка на товар и текст.
Убрать вкладку
add_filter('woocommerce_account_menu_items', function (array $items): array {
unset($items['downloads']);
return $items;
});Вкладка «Загрузки» не нужна магазину без цифровых товаров.
Частая ошибка
Вкладку добавили, пункт меню виден, но страница открывается с ошибкой 404. WordPress хранит правила адресов в базе и не знает о новом. Пересохраните постоянные ссылки в панели — один раз после добавления add_rewrite_endpoint().