קידוד עברית ווקומרס מיילים בתוסף ווקומרס – פתרון אפשרי

בעיית קידוד עברית ווקומרס

לעיתים מיילים מתוסף ווקומרס בהתקנות מסויימות שולחים קידוד משובש של תווים בעברית והתווים בעברית מופיעים בתור "????? ????" כמו בצילום מסך הבא שמראה מה הפלט של מייל עם בעיית קידוד עברית ווקומרס :

קידוד עברית ווקומרס
קידוד עברית ווקומרס

במקרים מסויימים הסיבה לתקלה היא בגלל פונקציית ההרחבה mbstring  שלא "מופעלת" בהגדרות PHP של השרת.

בקבצי התוסף woocommerce בקובץ includes/emails/class-wc-email.php בתוך הפונקציה send() בשורה 467 מעבירים את המשתנה עם תוכן ההודעה דרך פילטר שיוסיף CSS לתוכן של המייל לפי העיצוב בהגדרות בפונקציית style_inline.

public function send( $to, $subject, $message, $headers, $attachments ) {
		add_filter( 'wp_mail_from', array( $this, 'get_from_address' ) );
		add_filter( 'wp_mail_from_name', array( $this, 'get_from_name' ) );
		add_filter( 'wp_mail_content_type', array( $this, 'get_content_type' ) );

		$message = apply_filters( 'woocommerce_mail_content', $this->style_inline( $message ) );
		$return  = wp_mail( $to, $subject, $message, $headers, $attachments );

		remove_filter( 'wp_mail_from', array( $this, 'get_from_address' ) );
		remove_filter( 'wp_mail_from_name', array( $this, 'get_from_name' ) );
		remove_filter( 'wp_mail_content_type', array( $this, 'get_content_type' ) );

		return $return;
	}

$message = apply_filters( 'woocommerce_mail_content', $this->style_inline( $message ) );

הפונקציה  style_inline מעבירה את ההודעה דרך המחלקה emogrifi בשורות 411 412 באותו קובץ.

public function style_inline( $content ) {
		// make sure we only inline CSS for html emails
		if ( in_array( $this->get_content_type(), array( 'text/html', 'multipart/alternative' ) ) && class_exists( 'DOMDocument' ) ) {

			// get CSS styles
			ob_start();
			wc_get_template( 'emails/email-styles.php' );
			$css = apply_filters( 'woocommerce_email_styles', ob_get_clean() );

			try {

				// apply CSS styles inline for picky email clients
				$emogrifier = new Emogrifier( $content, $css );
				$content = $emogrifier->emogrify();

			} catch ( Exception $e ) {

				$logger = new WC_Logger();

				$logger->add( 'emogrifier', $e->getMessage() );
			}
		}

		return $content;
	}

בקובץ של המחלקה emogrifier שהנתיב שלו הוא includes/libraries/class-emogrifier.php משתמשים בפונקציה mb_convert_encoding כדי לטפל בקידוד.

כשלא מותקן ההרחבה mbstring הפונקציה mb_convert_encoding לא עובדת כראוי, ולכן הקידוד משתבש.

אפשר לדבג אם זה מקור הבעיה בלהשים את 411 412 בקובץ includes/emails/class-wc-email.php בתוך הערה, לבצע הזמנת ניסיון עם פרטים בעברית ולבדוק אם הקידוד תקין.

כמו כן אפשר לבדוק דרך הפלט של הפונקציה phpinfo() אם ההרחבה mbstring מופעלת או לא.

<?php phpinfo(); ?>

הפתרון:

להתקין בשרת את ההרחבה mbstring ל-PHP. אם האתר מאוחסון באחסון שיתופי ואין גישה לניהול של השרת עצמו, ליצור קשר עם החברת אחסון ולבקש להפעיל את ההרחבה.

לעוד מידע אפשר לקרוא בדיווח על שגיאה שפתחתי ב-github של WooCommerce

 

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *