fix(email): lock templates to built-in catalog

This commit is contained in:
kate522 committed 2026-09-13 20:02:56 +08:00
1 parent 3f02048bc5
commit 129eb25078
10 files changed
+61 -111

No files matched your search

-1
View File
@@ -193,7 +193,6 @@ trait DisplayPageGroups {
'trackcode' => self::trackcode(),
'seo' => self::get_seo_settings(),
'mail' => self::get_smtp(),
'email_events' => self::get_email_event_config(),
'footer' => self::get_footer_settings(),
'tabbar' => self::get_footer_tabbar_settings(),
'floating_buttons' => self::get_floating_buttons_settings(),
+2 -25
View File
@@ -40,34 +40,11 @@ trait DomainGroups {
return 'template_1';
}
/**
* 获取邮件事件配置
*
* @param string $event 事件类型,留空返回全部
* @return array 单个事件配置或全部事件数组
*/
public static function get_email_event_config(string $event = ''): array {
return Mail::get_email_event_config($event);
}
/**
* 邮件事件是否启用
*/
public static function is_email_event_enabled(string $event): bool {
return Mail::is_email_event_enabled($event);
}
/**
* 通过邮件事件体系发送邮件
*/
public static function send_event_email(
string $event,
string $to,
string $default_subject,
string $default_content,
array $placeholders = []
): bool {
return Mail::send_event_email($event, $to, $default_subject, $default_content, $placeholders);
public static function send_event_email(string $event, string $to, array $placeholders = []): bool {
return Mail::send_event_email($event, $to, $placeholders);
}
/** 禁封设置 */
+27 -66
View File
@@ -28,66 +28,17 @@ final class Mail {
];
}
/** @return array<string, mixed> */
public static function get_email_event_config(string $event = ''): array {
/** Send a fixed catalog event. */
public static function send_event_email(string $event, string $to, array $placeholders = []): bool {
$definitions = MailTemplates::definitions();
$defaults = MailTemplates::defaults();
$settings = Settings::get_all();
$global = [
'description' => (string) ($defaults['mail_description'] ?? ''),
'more_content' => (string) ($defaults['mail_more_content'] ?? ''),
];
foreach (['mail_description', 'mail_more_content'] as $key) {
if (array_key_exists($key, $settings) && trim((string) $settings[$key]) !== '') {
$global[str_replace('mail_', '', $key)] = $key === 'mail_more_content'
? wp_kses_post((string) $settings[$key])
: sanitize_textarea_field((string) $settings[$key]);
}
}
if ($event === '') {
$events = [];
foreach (array_keys($definitions) as $key) {
$events[$key] = self::event_config($key, $settings, $defaults);
}
return ['global' => $global, 'events' => $events];
}
if (!isset($definitions[$event])) {
return ['enabled' => false, 'subject' => '', 'content' => '', 'placeholders' => [], 'global' => $global];
}
return array_merge(self::event_config($event, $settings, $defaults), ['global' => $global]);
}
public static function is_email_event_enabled(string $event): bool {
$definitions = MailTemplates::definitions();
if (!isset($definitions[$event])) {
return false;
}
$settings = Settings::get_all();
return !array_key_exists("email_{$event}_enabled", $settings) || !empty($settings["email_{$event}_enabled"]);
}
/**
* Send a configured event. The optional defaults keep existing callers source-compatible.
*/
public static function send_event_email(
string $event,
string $to,
string $default_subject = '',
string $default_content = '',
array $placeholders = []
): bool {
$to = sanitize_email($to);
if ($to === '' || !is_email($to) || !isset(MailTemplates::definitions()[$event]) || !self::is_email_event_enabled($event)) {
if ($to === '' || !is_email($to) || !isset($definitions[$event]) || !self::is_email_event_enabled($event)) {
return false;
}
$cfg = self::get_email_event_config($event);
$definition = MailTemplates::definitions()[$event];
$subject = (string) ($cfg['subject'] ?? $default_subject ?: $definition['title']);
$content = (string) ($cfg['content'] ?? $default_content ?: $definition['content']);
$subject = self::replace_placeholders($subject, $placeholders);
$content = self::replace_placeholders($content, $placeholders);
$content = self::wrap_html($content, $cfg['global'] ?? []);
$definition = $definitions[$event];
$subject = self::replace_placeholders((string) $definition['title'], $placeholders);
$content = self::replace_placeholders((string) $definition['content'], $placeholders);
$content = self::wrap_html($content, self::get_global_config());
$headers = ['Content-Type: text/html; charset=UTF-8'];
return (bool) wp_mail($to, $subject, $content, $headers);
}
@@ -129,17 +80,27 @@ final class Mail {
return $error;
}
/** @return array<string, mixed> */
private static function event_config(string $event, array $settings, array $defaults): array {
$definition = MailTemplates::definitions()[$event];
$subject_key = "email_{$event}_subject";
$content_key = "email_{$event}_content";
return [
'enabled' => !array_key_exists("email_{$event}_enabled", $settings) || !empty($settings["email_{$event}_enabled"]),
'subject' => trim((string) ($settings[$subject_key] ?? '')) ?: (string) ($defaults[$subject_key] ?? $definition['title']),
'content' => (string) ($settings[$content_key] ?? '') !== '' ? (string) $settings[$content_key] : (string) ($defaults[$content_key] ?? $definition['content']),
'placeholders' => $definition['placeholders'],
private static function is_email_event_enabled(string $event): bool {
$settings = Settings::get_all();
return !array_key_exists("email_{$event}_enabled", $settings) || !empty($settings["email_{$event}_enabled"]);
}
/** @return array<string, string> */
private static function get_global_config(): array {
$defaults = MailTemplates::defaults();
$settings = Settings::get_all();
$global = [
'description' => (string) ($defaults['mail_description'] ?? ''),
'more_content' => (string) ($defaults['mail_more_content'] ?? ''),
];
foreach (['mail_description', 'mail_more_content'] as $key) {
if (array_key_exists($key, $settings) && trim((string) $settings[$key]) !== '') {
$global[str_replace('mail_', '', $key)] = $key === 'mail_more_content'
? wp_kses_post((string) $settings[$key])
: sanitize_textarea_field((string) $settings[$key]);
}
}
return $global;
}
private static function replace_placeholders(string $value, array $placeholders): string {
+1 -1
View File
@@ -192,7 +192,7 @@ final class MailNotifications {
private static function send(string $event, string $to, array $vars): void {
$placeholders = [];
foreach ($vars as $key => $value) $placeholders['{' . $key . '}'] = (string) $value;
Mail::send_event_email($event, $to, '', '', $placeholders);
Mail::send_event_email($event, $to, $placeholders);
}
/** @param array<string,mixed> $vars */
-4
View File
@@ -70,8 +70,6 @@ final class MailTemplates {
];
foreach ($definitions as $event => $definition) {
$defaults["email_{$event}_enabled"] = (bool) $definition['enabled'];
$defaults["email_{$event}_subject"] = $definition['title'];
$defaults["email_{$event}_content"] = $definition['content'];
}
return $defaults;
}
@@ -114,8 +112,6 @@ final class MailTemplates {
foreach ($events as $event) {
$definition = $definitions[$event];
$fields[] = ['key' => "email_{$event}_enabled", 'label' => "{$definition['title']}:启用", 'type' => 'switch', 'default' => $defaults["email_{$event}_enabled"]];
$fields[] = ['key' => "email_{$event}_subject", 'label' => "{$definition['title']}:主题模板", 'type' => 'input', 'default' => $defaults["email_{$event}_subject"]];
$fields[] = ['key' => "email_{$event}_content", 'label' => "{$definition['title']}:正文模板", 'type' => 'textarea', 'rows' => 6, 'sanitize_type' => 'html', 'default' => $defaults["email_{$event}_content"], 'help' => '可用占位符:' . implode('、', array_map(static fn(string $p): string => '{' . $p . '}', $definition['placeholders']))];
}
return ['key' => $key, 'title' => $title, 'fields' => $fields];
}