# 电子邮件预览集成

<!-- markdownlint-disable MD024 -->

## 概述

WooCommerce 的电子邮件预览功能允许您使用虚拟数据预览电子邮件模板（即，它不使用数据库中的实际数据）。这意味着注册新电子邮件类型的扩展需要与电子邮件预览系统集成，以便正确展示其电子邮件。

## 集成钩子

以下钩子允许扩展完全控制电子邮件预览：

### 样式和内容设置

这些钩子允许扩展添加新的样式和内容设置，电子邮件预览会监听这些设置的变化，并在发生变化时更新预览。

#### `woocommerce_email_preview_email_style_setting_ids`

添加新的电子邮件样式设置，电子邮件预览会监听这些设置的变化。

```php
add_filter( 'woocommerce_email_preview_email_style_setting_ids', function( $setting_ids ) {
    $setting_ids[] = 'my_extension_email_style';
    return $setting_ids;
} );
```

#### `woocommerce_email_preview_email_content_setting_ids`

添加新的电子邮件内容设置，电子邮件预览会监听这些设置的变化。

```php
add_filter( 'woocommerce_email_preview_email_content_setting_ids', function( $setting_ids ) {
    $setting_ids[] = 'my_extension_email_content';
    return $setting_ids;
} );
```

### 虚拟数据修改

#### `woocommerce_email_preview_dummy_order`

修改在预览中使用的虚拟 `WC_Order` 对象。

```php
add_filter( 'woocommerce_email_preview_dummy_order', function( $order ) {
    // 修改虚拟订单对象
    $order->set_currency( 'EUR' );
    return $order;
} );
```

#### `woocommerce_email_preview_dummy_product`

修改在预览中使用的虚拟产品。

```php
add_filter( 'woocommerce_email_preview_dummy_product', function( $product ) {
    // 修改虚拟产品对象
    $product->set_name( 'My Product' );
    return $product;
} );
```

#### `woocommerce_email_preview_dummy_product_variation`

修改在预览中使用的虚拟产品变体。

```php
add_filter( 'woocommerce_email_preview_dummy_product_variation', function( $variation ) {
    // 修改虚拟变体对象
    $variation->set_name( 'My Variation' );
    return $variation;
} );
```

#### `woocommerce_email_preview_dummy_address`

修改在预览中使用的虚拟地址。

```php
add_filter( 'woocommerce_email_preview_dummy_address', function( $address ) {
    // 修改虚拟地址数组
    $address['first_name'] = 'Preview';
    $address['last_name'] = 'Customer';
    return $address;
} );
```

### 占位符和电子邮件对象

#### `woocommerce_email_preview_placeholders`

修改要替换到电子邮件中的占位符。

```php
add_filter( 'woocommerce_email_preview_placeholders', function( $placeholders ) {
    // 添加自定义占位符
    $placeholders['{custom_placeholder}'] = 'Custom Value';
    return $placeholders;
} );
```

#### `woocommerce_prepare_email_for_preview`

修改用于预览的 `WC_Email` 对象。

```php
add_filter( 'woocommerce_prepare_email_for_preview', function( $email ) {
    // 修改 email 对象，例如替换 WC_Order
    $email->set_object( $custom_object );
    return $email;
} );
```

## 最佳实践

在与电子邮件预览集成时：

1. **使用合适的对象类型**
   - 为您的扩展使用正确的对象类型（例如，对于 WooCommerce 订阅，使用 `WC_Subscription` 而不是 `WC_Order`）。
   - 确保所有必需的属性都已设置在虚拟对象上。

2. **处理占位符**
   - 添加您的扩展使用的所有自定义占位符。
   - 为占位符提供真实的预览值。

3. **样式和内容设置**
   - 注册所有影响电子邮件外观或内容的所有自定义设置。

4. **测试**
   - 使用不同的电子邮件类型进行预览测试。
   - 验证所有自定义内容是否正确显示。
   - 检查响应式设计。

## 故障排除

常见问题和解决方案：

1. **我看到 "There was an error rendering an email preview." 错误**
   - 您的代码中存在 PHP 错误，导致电子邮件预览失败。请检查您的错误日志以获取更多详细信息。
   - 或者，您可以修改 [`class-wc-admin.php`](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/includes/admin/class-wc-admin.php) 并删除 [`try/catch` block](https://github.com/woocommerce/woocommerce/blob/f5310a33fbb160a73ea2de95efe4759c3aa791ea/plugins/woocommerce/includes/admin/class-wc-admin.php#L212-L218) 围绕渲染电子邮件预览，以查看错误消息。

2. **样式或内容设置的更改未反映**
   - 确保样式设置已通过 `woocommerce_email_preview_email_style_setting_ids` 过滤器注册。
   - 确保内容设置已通过 `woocommerce_email_preview_email_content_setting_ids` 过滤器注册。

3. **我没有看到我的扩展的电子邮件**
   - 确保电子邮件已通过 `woocommerce_email_classes` 过滤器注册。