# Email class

#### Creating a Custom Email Class

To build a custom email class in WooCommerce with YayMail, you’ll need to extend the `BaseEmail` class provided by YayMail. Here’s a clear example to guide you in setting up your custom email class:

1. **Extending BaseEmail:**<br>

   ```php
   class YourNewEmail extends \YayMail\Abstracts\BaseEmail {

       private static $instance;
       
       /**
       * Defines the email type
       * 1. YAYMAIL_WITH_ORDER_EMAILS: emails that include order information
       * 2. YAYMAIL_NON_ORDER_EMAILS: emails that do not include order information
       * Default is YAYMAIL_WITH_ORDER_EMAILS if not set
       */
       public $email_types = [ YAYMAIL_WITH_ORDER_EMAILS ];
       
       public static function instance() {
   	if ( null === static::$instance ) {
   		static::$instance = new static();
   	}
   	return static::$instance;
       }

       protected function __construct() {
           // This is your custom id.
           // It should be the same id as the WooCommerce email for easily handling.
           $this->id        = 'your_new_email_template_id';
           $this->title     = 'Your New Email';
           $this->recipient = 'Customer'; // Customer/Admin or Other sources.

           $this->source = [
               'plugin_id'   => '3rd-plugin-slug', // This id is what ever you want
               'plugin_name' => 'The plugin email belong to',
           ];
       }
   }
   ```

   \
   Start by defining a new class that extends the BaseEmail class provided by YayMail. Make sure to include the following essential variables and methods for the class:

   **Variables:**

   * `id`: A unique identifier for the email.
   * `title`: The title of the email, displayed in the YayMail Editor or settings.
   * `recipient`: Specifies who receives the email (e.g., Customer or Admin).
   * `source`: An array with plugin details, such as plugin\_id and plugin\_name.
   * `email_types`: Defines the email type.

   By following these steps, you can create a custom email template that works smoothly with your WooCommerce and YayMail setup.<br>
2. #### Function: `get_default_delements`

   The `get_default_elements` function is designed to retrieve and return a set of default elements using the `ElementsLoader::load_elements` method. Below is a breakdown of its components:

   * **Logo Element**: A basic component identified by its type 'Logo'.
   * **Heading Element**: This element includes a 'Heading' type with specified attributes, notable for its 'rich\_text' attribute containing the text 'Email Heading'.
   * **Text Element**: Main content for this email
   * **Footer Element**:  A basic email footer for this email

```php
public function get_default_elements() {
        $default_elements = \YayMail\Elements\ElementsLoader::load_elements(
            [
                [
                    'type' => 'Logo',
                ],
                [
                    'type'       => 'Heading',
                    'attributes' => [
                        'rich_text' => 'Email Heading',
                    ],
                ],
                [
                    'type'       => 'Text',
                    'attributes' => [
                        'rich_text' => '<p><span>Email content</span></p>',
                    ],
                ],
                [
                    'type' => 'Footer',
                ],
            ]
        );

        return $default_elements;
    }

```

3. To integrate a hook for triggering an email within the constructor, use the default method provided by the `BaseEmail` class. Alternatively, you can override this function if customization is required.

   Add a hook to send mail:

```php
add_filter( 'wc_get_template', [ $this, 'get_template_file' ], 10, 1 );
```

4. To return the path of the 'new-email-1.php' template, the function `get_template_file` generates the content as follows:

   ```php
   return __DIR__ . '/templates/your-new-email-template.php';
   ```

We have followed the steps provided, and the complete file is now

```php
/**
 * NewEmail1 Class
 *
 * @method static YourNewEmailTemplate get_instance()
 */
class YourNewEmail extends \YayMail\Abstracts\BaseEmail {
    private static $instance;
    
    public static function instance() {
	if ( null === static::$instance ) {
		static::$instance = new static();
	}
	return static::$instance;
    }
    
    public $email_types = [ YAYMAIL_WITH_ORDER_EMAILS ];

    protected function __construct() {
        // This is your custom id.
        // It should be the same id as the WooCommerce email for easily handling.
        $this->id        = 'your_new_email_template_id';
        $this->title     = 'Your New Email';
        $this->recipient = 'Customer'; // Customer/Admin or Other sources.

        $this->source = [
            'plugin_id'   => '3rd-plugin-slug', // This id is what ever you want
            'plugin_name' => 'The plugin email belong to',
        ];
    }
    
    // This function will get default elements of new template
    public function get_default_elements() {
        $default_elements = \YayMail\Elements\ElementsLoader::load_elements(
            [
                [
                    'type' => 'Logo',
                ],
                [
                    'type'       => 'Heading',
                    'attributes' => [
                        'rich_text' => 'Email Heading',
                    ],
                ],
                [
                    'type'       => 'Text',
                    'attributes' => [
                        'rich_text' => '<p><span>Email content</span></p>',
                    ],
                ],
                [
                    'type' => 'Footer',
                ],
            ]
        );

        return $default_elements;
    }


    public function get_template_path() {
        return __DIR__ . '/templates/your-new-email-template.php';
    }
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.yaycommerce.com/yaymail/developer-zone/api/register-templates/email-class.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
