Аккаунт покупателя и локальные письма
Аккаунт покупателя связывает заказ с доступом к собственным материалам. Он не должен давать право редактировать каталог или просматривать чужие orders. Письмо помогает сообщить результат, но его создание, отправка и получение — разные этапы. В «Полке» настроим вымышленного Customer и локальный перехват notifications, сохраняя отсутствие реальных адресатов.
После урока учебный участник сможет найти свои Orders и Downloads в My Account, а Polka Lab Guard сохранит краткий журнал тем созданных писем. Пример не запускался: нет подтверждённой регистрации, mail delivery и screenshots. Guard показывает, что WordPress попытался сформировать notification, но не проверяет доставляемость и полноценное содержимое письма.
Account не является сотрудником магазина
В WooCommerce Settings → Accounts & Privacy отключите guest checkout для выбранного сценария и разрешите создание аккаунта при оформлении. Теперь каждый будущий purchaser относится к зарегистрированному участнику. Это согласуется с Downloads require login, которое не следует понимать как автоматическое запрещение всех прежних guest purchases.
Используйте student@example.test и собственный локальный учебный пароль. Не применяйте credentials администратора как аккаунт покупателя. Admin может управлять магазином, поэтому его view не подтверждает ограничения Customer. Для проверки обычного account удобно использовать отдельный browser profile, не смешивая session панели и storefront.
Customer видит собственные покупки и меняет разрешённые сведения аккаунта. Shop manager имеет другое назначение: управление каталогом и orders. Даже если обе роли находятся в WordPress users, область действий отличается. Нельзя назначать Customer роль Administrator ради обхода ошибки download; надо найти причину связи заказа и permission.
Настройки accounts/privacy описаны в официальной документации. Конкретный выбор обязательного аккаунта принадлежит нашей лаборатории. В реальном store нужно учитывать удобство, договорные требования и процесс восстановления доступа; это не универсальное правило для всех цифровых предложений.
My Account показывает связанные данные
Проверьте назначение My Account page в Woo settings. На этом экране Orders относятся к текущему участнику, Downloads — к предоставленным permissions. Появление файла зависит от состояния заказа и настройки из одиннадцатого урока. Сам факт существования account ещё не создаёт право получить GRID-PDF бесплатно.
После вашего будущего completed order с GRID-PDF ожидается соответствующая download entry. После on-hold order без подтверждения доступа может не быть. Эти состояния должны оставаться различимыми. Если всегда показывать все файлы в обычном static paragraph аккаунта, вы обойдёте model permissions и потеряете смысл магазина.
Не копируйте в другой account готовую ссылку из своего Order, проверяя «логин работает». Link может содержать дополнительные признаки заказа и email. Настройка require login — один слой, принадлежность разрешения — другой. Правильный опыт сравнивает текущего пользователя и его actual permissions, а не лишь доступность URL в двух вкладках.
Восстановление пароля для .test не даст настоящего входящего письма. Это ожидаемая граница нашего capture. Для локальной лаборатории пароль можно управлять административно с ясной пометкой. Полноценный reset flow и безопасность delivery нельзя объявить проверенными по отсутствию error на странице.
Plugin перехватывает wp_mail
Polka Lab Guard подключается к pre_wp_mail. В local environment он сохраняет время и очищенную тему в WordPress option, затем возвращает true, прерывая настоящую отправку. Вне local возвращает исходное значение, поэтому не является глобальным mail blocker любого проекта. Файл специально относится к лаборатории, а не к production shop.
Полный plugin/polka-lab.php приведён ниже. Он должен быть активен до первого order, а не добавлен после уже отправленных писем.
<?php
/**
* Plugin Name: Polka Lab Guard
* Description: Локальный учебный режим, перехват писем и ограничение методов оплаты.
* Version: 1.0.0
*/
if ( ! defined( 'ABSPATH' ) ) { exit; }
function polka_lab_is_local() {
return 'local' === wp_get_environment_type();
}
add_filter( 'woocommerce_available_payment_gateways', function ( $gateways ) {
if ( ! polka_lab_is_local() ) { return array(); }
return array_intersect_key( $gateways, array_flip( array( 'bacs', 'dummy' ) ) );
}, 100 );
add_filter( 'pre_wp_mail', function ( $return, $attributes ) {
if ( ! polka_lab_is_local() ) { return $return; }
// Сохраняем ограниченный журнал без адресов, ссылок загрузки и тела письма.
$entries = get_option( 'polka_lab_mail_summary', array() );
$entries[] = array(
'time' => gmdate( 'c' ),
'subject' => sanitize_text_field( $attributes['subject'] ?? '' ),
'captured' => true,
);
update_option( 'polka_lab_mail_summary', array_slice( $entries, -20 ), false );
return true;
}, 10, 2 );
add_action( 'admin_notices', function () {
if ( ! current_user_can( 'manage_options' ) ) { return; }
$message = polka_lab_is_local()
? 'Полка: локальная лаборатория. Письма перехватываются, доступны только BACS и Dummy.'
: 'Полка: локальный режим отключён. Учебный plugin запрещает методы оплаты.';
echo '<div class="notice notice-warning"><p>' . esc_html( $message ) . '</p></div>';
} );
По pre_wp_mail возвращение ненулевого результата позволяет short-circuit sending. Наш true означает учебный успех без SMTP. Поэтому другой code может решить, что письмо отправлено, хотя оно лишь перехвачено. Увидеть successful return и заявить «покупатель получил письмо» было бы неверно.
Журнал хранит только двадцать последних summaries. Он не содержит recipient addresses, body и download URLs. Это помогает изучать факт формирования notification без накопления лишних values. При этом subject всё ещё может содержать order number или title; используйте только искусственные сведения course. Этот журнал не подходит в качестве полного аудитного хранилища.
Для просмотра можно использовать административное чтение option подходящим локальным инструментом. Мы не добавили отдельную public страницу журнала, поскольку посетителю не нужны notification subjects других покупок. Не выводите сохранённый option в footer ради удобства отладки. Debug-информация должна оставаться в своей области доступа.
Содержание и доставка проверяются отдельно
В Woo Settings → Emails рассмотрите enabled notifications и их назначение: on-hold, processing, completed и другие. Не включайте все письма только ради большого журнала. Например, completed order email должен помочь получить материал, а admin new order notification относится к работе магазина. Разные адресаты и состояния означают разные содержания.
Если хотите визуально проверить body письма, нужен отдельный локальный mail capture, сохраняющий содержимое, либо предусмотренный текущей версией preview. Наш минимальный plugin body не сохраняет. Это ограничение указано в README, и нельзя подменить его вымышленным screenshot «полученного письма». При таком расширении следите, чтобы protected download links не стали публичными artifacts.
Часовой пояс и название магазина влияют на восприятие уведомлений. Строка «Полка» помогает отличить лабораторный order от другой установки, но название не делает сообщение подлинным автоматически. В real mail delivery также понадобятся настройки отправителя, DNS и provider, которых в курсе нет. Поэтому не присваиваем лаборатории рейтинг deliverability.
Для самостоятельной проверки создайте отдельный Customer order с known items, изучите его My Account и измените учебное состояние согласно предыдущей главе. Сравните появление permissions и факт новой summary в capture. Результат должен описываться точными словами: account связан с order, download entry доступна при нужных условиях, notification перехвачена локально. Следующая глава перенесёт те же различия в серверную integration, где API и webhook тоже представляют разные полномочия и этапы обработки.