Изменение заголовка писем WooCommerce с помощью собственного плагина
Я хочу заменить стандартный шаблон заголовка писем WooCommerce на новый, чтобы можно было добавлять условия в шаблон заголовка для получения значений из админки (например, для изменения цвета заголовка на основе пользовательских настроек). Для этого я создал файл плагина.
Я следовал нескольким руководствам, но получал только ошибки. У меня есть класс со следующим кодом:
public function __construct(){
// Добавляем действие для перехвата email в WooCommerce
add_action('woocommerce_email',array($this,'woocommerce_email'));
}
Теперь я добавил код для удаления стандартного хука заголовка
public function woocommerce_email($mailer){
// Удаляем стандартное действие для заголовка письма
remove_action('woocommerce_header',array($mailer,'email_header'));
// Добавляем собственное действие для заголовка
add_action('woocommerce_header',array($this,'email_header'));
Теперь вызываем шаблон
public function email_header() {
// Загружаем кастомный шаблон заголовка письма
wc_get_template( 'emails/email-header.php');
}
Я не передаю никаких параметров в файл шаблона. Просто хочу убедиться, что используется мой шаблон.
Также я предполагаю, что $mailer
является частью класса WooCommerce. Буду благодарен за любую помощь.
Обратите внимание, что это функциональность плагина, поэтому мне не интересна замена стандартных шаблонов писем WooCommerce.

Вам нужно удалить действие woocommerce_email_header
remove_action( 'woocommerce_email_header', 'email_header');
Которое было зарегистрировано в
wp-content\plugins\woocommerce\includes\class-wc-emails.php
Затем добавить свое собственное действие
add_action('woocommerce_email_header','your_function_name');
Ваша функция должна выводить HTML
По умолчанию в шаблоне заголовка используется следующий код:
<?php
/**
* Шапка email
*
* Этот шаблон может быть переопределен путем копирования в yourtheme/woocommerce/emails/email-header.php.
*
* ОДНАКО, иногда WooCommerce потребуется обновить файлы шаблонов, и вам
* (разработчику темы) нужно будет скопировать новые файлы в вашу тему, чтобы
* сохранить совместимость. Мы стараемся делать это как можно реже, но это случается.
* Когда это происходит, версия файла шаблона будет обновлена, а в readme
* будет перечислены важные изменения.
*
* @see https://docs.woocommerce.com/document/template-structure/
* @author WooThemes
* @package WooCommerce/Templates/Emails
* @version 2.4.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Выход, если доступ осуществляется напрямую
}
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=<?php bloginfo( 'charset' ); ?>" />
<title><?php echo get_bloginfo( 'name', 'display' ); ?></title>
</head>
<body <?php echo is_rtl() ? 'rightmargin' : 'leftmargin'; ?>="0" marginwidth="0" topmargin="0" marginheight="0" offset="0">
<div id="wrapper" dir="<?php echo is_rtl() ? 'rtl' : 'ltr'?>">
<table border="0" cellpadding="0" cellspacing="0" height="100%" width="100%">
<tr>
<td align="center" valign="top">
<div id="template_header_image">
<?php
if ( $img = get_option( 'woocommerce_email_header_image' ) ) {
echo '<p style="margin-top:0;"><img src="' . esc_url( $img ) . '" alt="' . get_bloginfo( 'name', 'display' ) . '" /></p>';
}
?>
</div>
<table border="0" cellpadding="0" cellspacing="0" width="600" id="template_container">
<tr>
<td align="center" valign="top">
<!-- Шапка -->
<table border="0" cellpadding="0" cellspacing="0" width="600" id="template_header">
<tr>
<td id="header_wrapper">
<h1><?php echo $email_heading; ?></h1>
</td>
</tr>
</table>
<!-- Конец шапки -->
</td>
</tr>
<tr>
<td align="center" valign="top">
<!-- Тело письма -->
<table border="0" cellpadding="0" cellspacing="0" width="600" id="template_body">
<tr>
<td valign="top" id="body_content">
<!-- Контент -->
<table border="0" cellpadding="20" cellspacing="0" width="100%">
<tr>
<td valign="top">
<div id="body_content_inner">

Если мой файл шаблона заголовка email содержит только echo, будет ли WooCommerce использовать шаблон по умолчанию? @malaysolanki

Спасибо, брат. Работает. Ошибка была в названии хука действия. С уважением, @Malaysolanki

Ты не знаешь, почему изображение не отображается в заголовке письма? Тег img виден при инспектировании в браузере

Давай попробую и дам тебе знать. Ты лучший помощник. Спасибо за твою готовность помочь @Malay

Для тех, кто делает это из своей темы.
- Скопируйте содержимое шаблона электронного письма, который можно найти здесь:
https://github.com/woocommerce/woocommerce/blob/master/templates/emails/email-header.php
- Вставьте содержимое файла из пункта 1 по следующему пути:
yourtheme/woocommerce/emails/email-header.php
- Опционально, если вам нужен объект заказа для получения данных, добавьте следующее в functions.php:
add_action( 'woocommerce_email_header', 'email_header_before', 1, 2 );
function email_header_before( $email_heading, $email ){
$GLOBALS['email'] = $email;
}
- Опционально, затем в созданном вами шаблонном файле используйте это следующим образом:
// Вызываем глобальный объект WC_Email
global $email;
// Получаем экземпляр объекта WC_Order
$order = $email->object;
Шаги 3 и 4 взяты из этого ответа:
автор @LoicTheAztec
