Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Покупатели и раздел «Мой аккаунт»

Покупатель — обычный пользователь 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().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.