# Shortcode Class

#### Creating a Custom Shortcode Class

To create a custom shortcode in WooCommerce with YayMail, you’ll need to use the BaseShortcode class provided by YayMail as a starting point. Here’s a clear example to help you set up your own custom shortcode class

1. **Extending** `BaseShortcode`**:**<br>

   ```php
   class YourNewShortcodes extends \YayMail\Abstracts\BaseShortcode {

       private static $instance;
       
       public static function instance() {
   	if ( null === static::$instance ) {
   		static::$instance = new static();
   	}
   	return static::$instance;
       }

       protected function __construct() {
           /**
           * This refers to the array of template IDs where shortcodes can be applied.
           * We can assign it in 1 of 4 ways
           * 1. Special Array Templates ID: Examples include new_order, customer_processing_order.
           * 2. YAYMAIL_WITH_ORDER_EMAILS: Shortcodes applicable only for templates containing order information.
           * 3. YAYMAIL_NON_ORDER_EMAILS: Shortcodes applicable only for templates without order information.
           * 4. YAYMAIL_ALL_EMAILS: Shortcodes applicable to all email templates.
           */
           $this->available_email_ids = [ YAYMAIL_ALL_EMAILS ];
           parent::__construct();
       }
       
       public function get_shortcodes() {
        // Define your function here
       }
   }
   ```

   Begin by defining a new class that extends the `BaseShortcode` class provided by YayMail. Make sure to include essential variables and methods needed for the custom shortcode to work properly.<br>
2. #### Function: `get_shortcodes`&#x20;

   ```php
   public function get_shortcodes() {    
       $shortcodes = [];

       $shortcodes[] = [
           'name'        => 'new_shortcode_1',
           'description' => 'Custom shortcode 1',
           'group'       => 'Custom Shortcode',
           'callback'    => [ $this, 'new_shortcode_1_render_function' ],
       ];

       $shortcodes[] = [
           'name'        => 'yaymail_new_shortcode_2',
           'description' => 'Custom shortcode 2',
           'attributes'  => [
               'text_link' => 'here',
           ],
           'group'       => 'Custom Shortcode',
           'callback'    => [ $this, 'new_shortcode_2_render_function' ],
       ];

       return $shortcodes;
   }
   ```

   The `get_shortcodes` function creates a list of shortcodes. Each shortcode follows this structure:

   When setting up a shortcode, include these key fields:

   * **Name**: A unique identifier for the shortcode.
   * **Description**: A short explanation of what the shortcode does.
   * **Group**: A category to organize related shortcodes together.
   * **Callback**: The function that generates the shortcode’s output.
   * **Attributes** (optional): Custom properties, like text\_link or color, to enhance the shortcode’s functionality.<br>
3. Callback function for a shortcode<br>

   ```php
   public function new_shortcode_1_render_function( $data ) {
       $render_data           = isset( $data['render_data'] ) ? $data['render_data'] : [];
       $is_placeholder        = isset( $data['is_placeholder'] ) ? $data['is_placeholder'] : false;
       $is_sample             = isset( $render_data['is_sample'] ) ? $render_data['is_sample'] : false;
       $is_customized_preview = isset( $render_data['is_customized_preview'] ) ? $render_data['is_customized_preview'] : false;

       $content            = 'Shortcode content sample';

       return $content;
   }

   public function new_shortcode_2_render_function( $data, $shortcode_atts = [] ) {
       $template = ! empty( $data['template'] ) ? $data['template'] : null;
       $is_placeholder = isset( $data['is_placeholder'] ) ? $data['is_placeholder'] : false;
       $text_link = isset( $shortcode_atts['text_link'] ) ? $shortcode_atts['text_link'] : '';

       if ( empty( $template ) ) {
           $text_link_color = YAYMAIL_COLOR_WC_DEFAULT;
       } else {
           $text_link_color = $template->get_text_link_color();
       }
       return '<a style="color: ' . esc_attr( $text_link_color ) . ';" href="' . esc_url( get_home_url() ) . '"> ' . $text_link . ' </a>';
   }
   ```

   <br>

   This function fetches content for displaying shortcodes in the YayMail Editor and in actual emails. It uses two parameters: data and shortcode\_atts (for shortcodes with attributes, if applicable).

   **Variables:**

   * `data`: Contains key properties like render\_data, template, and is\_placeholder.
   * `shortcode_atts`: An array of attributes defined for the shortcode in the `get_shortcodes` function.
   * `render_data`: Holds important details, such as order, is\_sample, and is\_customized\_preview in the YayMail Editor. It also includes data from the `get_content_html` function when an actual email is sent.

   <figure><img src="/files/pxCpUpg0xtQBTr4UGqZt" alt="Email render data"><figcaption><p>Email render data</p></figcaption></figure>

   * `is_placeholder`: (Boolean) Indicates whether the value should be treated as a placeholder. Returns true if it is a placeholder, false otherwise.
   * `is_sample`: (Boolean) Returns true when a sample order is selected in the YayMail Editor, false otherwise.
   * `is_customized_preview`: (Boolean) Returns true when sending a test email or previewing an email in the YayMail Editor, false otherwise.

We’ve followed the steps provided, and the file now correctly includes the use YayMail\Abstracts\BaseShortcode statement.

```php
class YourNewShortcodes extends \YayMail\Abstracts\BaseShortcode {

    private static $instance;
    
    public static function instance() {
	if ( null === static::$instance ) {
		static::$instance = new static();
	}
	return static::$instance;
    }

    protected function __construct() {
        /**
        * This refers to the array of template IDs where shortcodes can be applied.
        * We can assign it in 1 of 4 ways
        * 1. Special Array Templates ID: Examples include new_order, customer_processing_order.
        * 2. YAYMAIL_WITH_ORDER_EMAILS: Shortcodes applicable only for templates containing order information.
        * 3. YAYMAIL_NON_ORDER_EMAILS: Shortcodes applicable only for templates without order information.
        * 4. YAYMAIL_ALL_EMAILS: Shortcodes applicable to all email templates.
        */
        $this->available_email_ids = [ YAYMAIL_ALL_EMAILS ];
        parent::__construct();
    }
    
    public function get_shortcodes() {
        $shortcodes = [];
    
        $shortcodes[] = [
            'name'        => 'new_shortcode_1',
            'description' => 'Custom shortcode 1',
            'group'       => 'Custom Shortcode',
            'callback'    => [ $this, 'new_shortcode_1_render_function' ],
        ];
    
        $shortcodes[] = [
            'name'        => 'new_shortcode_2',
            'description' => 'Custom shortcode 2',
            'attributes'  => [
                'text_link' => 'here',
            ],
            'group'       => 'Custom Shortcode',
            'callback'    => [ $this, 'new_shortcode_1_render_function' ],
        ];
    
        return $shortcodes;
    }
    
    public function new_shortcode_1_render_function( $data ) {
        $render_data           = isset( $data['render_data'] ) ? $data['render_data'] : [];
        $is_placeholder        = isset( $data['is_placeholder'] ) ? $data['is_placeholder'] : false;
        $is_sample             = isset( $render_data['is_sample'] ) ? $render_data['is_sample'] : false;
        $is_customized_preview = isset( $render_data['is_customized_preview'] ) ? $render_data['is_customized_preview'] : false;
    
        $content            = 'Shortcode content sample';
    
        return $content;
    }

    public function new_shortcode_2_render_function( $data, $shortcode_atts = [] ) {
        $template = ! empty( $data['template'] ) ? $data['template'] : null;
        $is_placeholder = isset( $data['is_placeholder'] ) ? $data['is_placeholder'] : false;
        $text_link = isset( $shortcode_atts['text_link'] ) ? $shortcode_atts['text_link'] : '';
    
        if ( empty( $template ) ) {
            $text_link_color = YAYMAIL_COLOR_WC_DEFAULT;
        } else {
            $text_link_color = $template->get_text_link_color();
        }
        return '<a style="color: ' . esc_attr( $text_link_color ) . ';" href="' . esc_url( get_home_url() ) . '"> ' . $text_link . ' </a>';
    }
}
```


---

# 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-shortcodes/shortcode-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.
