/var/www/html_it/wp-content/plugins/woocommerce/src/Internal/EmailEditor/WooContentProcessor.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php
declare( strict_types=);

namespace 
Automattic\WooCommerce\Internal\EmailEditor;

use 
Automattic\WooCommerce\EmailEditor\Email_Css_Inliner;
use 
Automattic\WooCommerce\EmailEditor\Email_Editor_Container;
use 
Automattic\WooCommerce\EmailEditor\Engine\Theme_Controller;

/**
 * Class responsible for extracting the main content from a WC_Email object.
 */
class WooContentProcessor {

    
/**
     * Email theme controller
     * We use it to get email CSS.
     *
     * @var Theme_Controller
     */
    
private $theme_controller;

    
/**
     * CSS inliner
     *
     * @var Email_Css_Inliner
     */
    
private $css_inliner;

    
/**
     * Constructor
     */
    
public function __construct() {
        
$this->theme_controller Email_Editor_Container::container()->getTheme_Controller::class );
        
$this->css_inliner      = new Email_Css_Inliner();
    }

    
/**
     * Get the WooCommerce content excluding headers and footers.
     *
     * @param \WC_Email $wc_email WooCommerce email.
     * @return string
     */
    
public function get_woo_content\WC_Email $wc_email ): string {
        
$woo_content          $this->capture_woo_content$wc_email );
        
$woo_content_with_css $this->inline_css$woo_content );
        return 
$this->get_html_body_content$woo_content_with_css );
    }

    
/**
     * Filter CSS for the email.
     * The CSS was from email editor was already inlined.
     * The method hookes to woocommerce_email_styles and removes CSS rules that we don't want to apply to the email.
     *
     * @param string $css CSS.
     * @return string
     */
    
public function prepare_cssstring $css ): string {
        
remove_filter'woocommerce_email_styles', array( $this'prepare_css' ) );
        
// Remove color and font-family declarations from WooCommerce CSS.
        
$css preg_replace'/color\s*:\s*[^;]+;/'''$css );
        
$css preg_replace'/font-family\s*:\s*[^;]+;/'''$css );
        return 
$css;
    }

    
/**
     * Get the content of the body tag from the HTML.
     *
     * @param string $html HTML.
     * @return string
     */
    
private function get_html_body_contentstring $html ): string {
        
// Extract content between <body> and </body> tags using regex.
        
if ( preg_match'/<body[^>]*>(.*?)<\/body>/is'$html$matches ) ) {
            return 
$matches[1];
        }
        return 
$html;
    }

    
/**
     * Inline the CSS from the email theme and user email settings.
     *
     * @param string $woo_content WooCommerce content.
     * @return string
     */
    
private function inline_cssstring $woo_content ): string {
        if ( empty( 
$woo_content ) ) {
            return 
'';
        }
        
$css $this->theme_controller->get_stylesheet_for_rendering();
        return 
$this->css_inliner->from_html$woo_content )->inline_css$css )->render();
    }

    
/**
     * Capture the WooCommerce content excluding headers and footers.
     *
     * @param \WC_Email $wc_email WooCommerce email.
     * @return string
     */
    
private function capture_woo_content\WC_Email $wc_email ): string {
        return 
$wc_email->get_block_editor_email_template_content();
    }
}